STM32F103使用 ST标准库配置HSI 配置系统时钟

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); 初始化函数一定要放在主函数最开始位置!一切片上外设初始化要放在之后,否则数据不正常!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值