stm32 之 标准库中时钟的问题

在使用STM32F10X的RCC配置时,发现RCC->CFGR的第17位和RCC->CFGR2的第0位读取值不一致,导致时钟频率计算错误,进而影响串口波特率。手册指出这两个位是同一位,控制PREDIV1分频。为解决此问题,将预分频因子加2,暂时修复了波特率差异。但这种做法可能不理想,建议深入研究并优化。

在stm32f10x_rcc.c中

#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
       prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1;
       /* HSE oscillator clock selected as PREDIV1 clock entry */
       RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull; 
 #else


其中RCC->CFGR的第17位和RCC-CFGR2中的第0位是同一位

但是RCC->CFGR的第17位的值读出来是1, 而RCC->CRGR2中的第0位读出来的值是0

在手册中关于RCC->CFGR的第17位有这样一句话:

位17 PLLXTPRE:PREDIV1分频因子的低位

由软件置1或清0来选择PREDIV1分频因子的最低位。这一位与RCC_CFGR2寄存器的位0是同一位,因此修改RCC_CFGR2寄存器的位0同时会改变这一位。

如果RCC_CFGR2寄存器的位[3:1]为000,则改为控制PREDIV1对输入时钟进行2分频(PLLXPRE=1),或不对输入时钟分频(PLLXPRE=0).

只能在关闭PLL时才能写入此位。

为什么这两个位会不同???

从程序结果来看,串口的波特率也差了2倍,也许就是这个原因,因此,修改程序如下:

#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
&n

### STM32F103标准库获取时钟频率的代码示例 在STM32F103的标准库中,可以通过调用`SystemCoreClockUpdate()`函数来更新系统核心时钟频率,并通过访问全局变量`SystemCoreClock`获取当前的系统时钟频率[^1]。以下是一个完整的代码示例: ```c #include "stm32f10x.h" int main(void) { // 重置RCC寄存器到默认值 RCC_DeInit(); // 使能外部高速时钟(HSE) RCC_HSEConfig(RCC_HSE_ON); while (RCC_WaitForHSEStartUp() != SUCCESS); // 等待HSE就绪 // 配置PLL RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); // 使能PLL while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // 等待PLL就绪 // 将PLL设置为系统时钟源 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while (RCC_GetSYSCLKSource() != 0x08); // 等待PLL成为系统时钟源 // 更新系统核心时钟频率 SystemCoreClockUpdate(); // 打印当前系统时钟频率 uint32_t clockFrequency = SystemCoreClock; // 假设使用串口或其他方式输出时钟频率 // UART_SendData(clockFrequency); while (1); } ``` 上述代码中,`SystemCoreClockUpdate()`函数会根据当前的系统时钟配置自动计算并更新全局变量`SystemCoreClock`的值[^1]。此变量存储了当前的系统时钟频率(以Hz为单位)。开发者可以直接读取该变量以获取当前的时钟频率。 ### 注意事项 - 在使用`SystemCoreClockUpdate()`之前,必须正确配置系统的时钟源(如HSI、HSE或PLL)。 - `SystemCoreClock`是一个全局变量,由标准库定义,无需手动声明。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值