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

本文介绍如何使用STM32F103VBT6芯片通过内部晶振(HSI)进行倍频至52MHz的过程,并展示具体的寄存器配置代码。此外,还提供了如何读取系统时钟频率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先说明,因为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)



### STM32F103C8T6 内部时钟 12 倍频配置 对于STM32F103C8T6微控制器而言,在使用内部高速RC振荡器(HSI)作为系统时钟源的情况下,可以通过调整PLL预分频系数以及倍频因子来实现期望的工作频率。具体到设定为12倍频从而达到约36 MHz的操作频率的过程如下: #### 设置Flash访问等待周期 由于提高CPU工作频率会增加对存储器读取速度的要求,因此在更改系统时钟之前应当先适当调节FLASH_ACR寄存器中的LATENCY位域值以确保足够的闪存延迟时间。 ```c // 设置 FLASH 控制器的延时时间为 1 (适用于最高至 24 MHz 的 HCLK) FLASH->ACR |= FLASH_ACR_LATENCY_1; ``` #### 启用并校准HSI 启用HSI前需确认其已稳定运行,并对其进行必要的校正操作以提升准确性。这一步骤涉及修改ICSR寄存器内的相应标志位完成状态监测与控制命令下发。 ```c // 开启 HSI 并等待它就绪 RCC->CR |= RCC_CR_HSION; while (!(RCC->CR & RCC_CR_HSIRDY)); // 设定 HSI 校正值,默认情况下该字段应保持不变除非有特殊需求 RCC->CR &= ~(RCC_CR_HSITRIM_Msk); RCC->CR |= RCC_CR_HSITRIM_0; // 这里仅作示意, 实际应用中可能需要更精确调教 ``` #### 调整PLL设置 为了达成目标频率,接下来要做的就是按照既定策略重置PLL相关参数——即选择输入源、指定预分频比例及最终乘法因子等动作;这里特别指出的是当采用HSI作为PLL入口信号时,则无需额外处理除法环节因为默认已经处于合适范围之内了。 ```c /* 关闭 PLL */ RCC->CR &= ~RCC_CR_PLLON; /* 清理旧有的PLL配置 */ RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL); /* 使用 HSI/2 作为 PLL 输入源,并将其放大 N 倍(N=12),注意实际硬件支持的最大倍率 */ #define PLL_MUL_VALUE ((uint32_t)(12 << 18)) RCC->CFGR |= RCC_CFGR_PLLSRC_PREDIV1_CLK | RCC_CFGR_PLLMULL12; /* 等待 PLL 就绪 */ RCC->CR |= RCC_CR_PLLON; while (!(RCC->CR & RCC_CR_PLLRDY)); ``` #### 切换SYSCLK到PLL输出 最后一步便是指示系统切换当前使用的主时钟供给路径指向新构建好的PLL链路末端所产出的结果上去了。 ```c /* 更新系统时钟配置 */ SystemCoreClockUpdate(); /* 更改 SYSCLK 来自于 PLL 输出 */ RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_PLL; /* 确认新的时钟源已被采纳 */ while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); ``` 上述代码片段展示了如何针对STM32F103C8T6执行完整的内部时钟初始化流程,其中包括但不限于flash延时调整、HSI启动及其精度修正措施,还有最关键的部分—通过编程手段改变PLL配置进而获得预期的高频性能表现[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值