void HSI_SetSysClock(uint32_t pllmul)
{
__IO uint32_t HSIStartUpStatus = 0;
// 把 RCC 外设初始化成复位状态,这句是必须的
RCC_DeInit();
//使能 HSI
RCC_HSICmd(ENABLE);
// 等待 HSI 就绪
HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
// 只有 HSI 就绪之后则继续往下执行
if (HSIStartUpStatus == RCC_CR_HSIRDY) {
//-------------------------------------------------------------//
// 使能 FLASH 预存取缓冲区
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// SYSCLK 周期与闪存访问时间的比例设置,这里统一设置成 2
// 设置成 2 的时候,SYSCLK 低于 48M 也可以工作,如果设置成 0 或者 1 的时候,
// 如果配置的 SYSCLK 超出了范围的话,则会进入硬件错误,程序就死了
// 0:0 < SYSCLK <= 24M
// 1:24< SYSCLK <= 48M
// 2:48< SYSCLK <= 72M
FLASH_SetLatency(FLASH_Latency_2);
//------------------------------------------------------------//
// AHB 预分频因子设置为 1 分频,HCLK = SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// APB2 预分频因子设置为 1 分频,PCLK2 = HCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
// APB1 预分频因子设置为 1 分频,PCLK1 = HCLK/2
RCC_PCLK1Config(RCC_HCLK_Div2);
//-----------设置各种频率主要就是在这里设置-------------------//
// 设置 PLL 时钟来源为 HSE或HSI,设置 PLL 倍频因子
// PLLCLK = 4MHz * pllmul
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);
//-- -----------------------------------------------------//
// 开启 PLL
RCC_PLLCmd(ENABLE);
// 等待 PLL 稳定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {
}
// 当 PLL 稳定之后,把 PLL 时钟切换为系统时钟 SYSCLK
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 读取时钟切换状态位,确保 PLLCLK 被选为系统时钟
while (RCC_GetSYSCLKSource() != 0x08) {
}
} else {
// 如果 HSI 开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理
// 当 HSE 开启失败或者故障的时候,单片机会自动把 HSI 设置为系统时钟,
// HSI 是内部的高速时钟,8MHZ
while (1) {
}
}
}
HSI 设置系统时钟函数跟 HSE 设置系统时钟函数在原理上是一样的,有一个区别的地
方就是,HSI 必须 2 分频之后才能作为 PLL 的时钟来源,所以使用 HSI 时,最大的系统时
钟 SYSCLK 只能是 HSI/2*16=4*16=64MHZ。
函数调用举例:HSI_SetSysClock(RCC_PLLMul_9); 则设置系统时钟为:4MHZ * 9 =
36MHZ。
RCC_ClocksTypeDef get_rcc_clock;
int main(void)
{
HSI_SetSysClock(RCC_PLLMul_2);
RCC_GetClocksFreq(&get_rcc_clock);
while(1)
{
}
}
进入KEIL调试 RCC_GetClocksFreq(&get_rcc_clock);该函数,可以看到结构体成员的各个频率。
- SYSCLK_Frequency:系统时钟频率。
- HCLK_Frequency:<|image_sentinel|>CPU 时钟频率。
- PCLK1_Frequency:外设 1 的时钟频率。
- PCLK2_Frequency:外设 2 的时钟频率。
- ADCCLK_Frequency:模数转换器 (ADC) 的时钟频率。
最后:
1.如果要增大频率,就增加函数的PLL倍频器值,2~12倍,最大64M。
2.如果要减小频率,更改分频器AHB值,除数最多分频512 。
3.如果要更改该时钟来源,RCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);
该函数第一个形参改变使用HSI/HSE
4.HSI_SetSysClock(RCC_PLLMul_2); 初始化函数一定要放在主函数最开始位置!一切片上外设初始化要放在之后,否则数据不正常!