【STM32F103攻城笔记】内部晶振HSI倍频设置系统时钟

首先说明,因为STM32芯片的型号不同,所以对于不同芯片有不同频率的限制,比如某些时钟频率不能大于多少,这是根据手册来设置的!但改变频率的寄存器都一样,只是我们设置频率大小要受芯片的限制!下面我用的芯片型号是STM32F103VBT6!它就限制了内部晶振的倍频不能大于64MHz(但其实我实验出来是52MHz)!

本文是利用内部晶振(HSI)来倍频,与外部晶振倍频区分开!

第一步:打开system_STM32f10x.c,找到函数void SystemInit (void){},把原有的都注释掉,将下面的代码复制进去:

                 /* 开启HSI 即内部晶振时钟 */
RCC->CR |= (uint32_t)0x00000001; 

/*选择HSI为PLL的时钟源HSI必须2分频给PLL*/
RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2; 

         
/*PLLCLK=8/2*13=52MHz   设置倍频得到时钟源PLL的频率*/
RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL13;

/* PLL不分频输出  */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
 
/* 使能 PLL时钟 */
RCC->CR |= RCC_CR_PLLON;

/* 等待PLL时钟就绪*/
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}


/* 选择PLL为系统时钟的时钟源 */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

/* 等到PLL成为系统时钟的时钟源*/
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{

                }

这段代码其实就是是HSI倍频成为PLL的时钟源,又使PLL成为系统时钟的时钟源,这样就相当于HSI倍频后给系统时钟了!


最后我用一个库函数RCC_GetClocksFreq() 它是用来获取各个时钟的频率的!他要先初始化,就在开始前利用RCC_ClocksTypeDef 来使他初始化,我们代码是RCC_ClocksTypeDef  RCC_Clocks,这样RCC_Clocks.SYSCLK_Frequency就是系统时钟的频率了!我们串口输出就可以了!



主函数代码:

int main (void)
{
       RCC_ClocksTypeDef  RCC_Clocks; //初始化


       SystemInit(); //调用刚才改过的函数


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Usart_Init(115200); //串口为了看数据而已

RCC_GetClocksFreq(&RCC_Clocks); //获取各个时钟频率


while(1)
{
printf("SYSCLK_Frequency %d \r\n",RCC_Clocks.SYSCLK_Frequency);
//printf("SYSCLK_Frequency %d \r\n",RCC_Clocks.SYSCLK_Frequency);
}

}


串口显示:(我的实验利用内部晶振最高只能倍频到52MHz)



### STM32F103 使用CubeMX进行时钟配置失败的解决方案 对于STM32F103系列微控制器,在使用STM32CubeMX工具进行时钟配置过程中可能出现各种问题,这些问题通常涉及PLL设置不当、外部晶振未启动成功或是内部/外部时钟源的选择错误等问题[^1]。 #### 一、检查硬件连接 确保外部晶体(如果使用)正确安装并良好接地。任何物理层面的问题都可能导致时钟无法正常工作。此外,确认电源电压稳定,因为不稳定的供电同样会干扰时钟系统的稳定性。 #### 二、验证HSE/HSI状态 在初始化阶段,应当先尝试启用HSI(高速内部RC振荡器),再切换到HSE(高速外部晶振)。这可以通过修改`RCC_OscInitTypeDef`结构体中的成员变量来实现: ```c RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSIState = RCC_HSI_ON; ``` 这段代码片段展示了如何同时使能HSE和HSI,并将其作为系统时钟源的一部分考虑进去。 #### 三、调整PLL参数 当采用PLL倍频方式提高主频率时,需特别注意输入给PLL的信号质量以及最终输出频率是否满足应用需求。具体来说,应该仔细设定预分频系数(P)、乘法因子(N),还有必要的话还可以调节VCO输出后的再次分频(M)。 #### 四、利用CubeMX自动生成代码调试 借助于STM32CubeMX软件的强大功能来自动生成初始配置代码,这样不仅可以减少手动编写复杂寄存器操作的风险,而且还能快速定位潜在问题所在之处。一旦发现异常情况,则可通过逐步简化项目设置直至找到根本原因[^3]。 #### 五、查阅官方文档和技术论坛求助 最后但并非最次的一点是,参考STMicroelectronics提供的数据手册、应用笔记以及其他技术资源;加入社区讨论组或访问技术支持网站寻求更多帮助也是解决问题的有效途径之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值