stm32 之 标准库中时钟的问题

来源:互联网 发布:tsc ttp 244 pro 软件 编辑:程序博客网 时间:2024/05/17 08:34

在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)
       prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 2;
       /* HSE oscillator clock selected as PREDIV1 clock entry */
       RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull; 

 #else

虽然这样不太合适,先这样吧。

原创粉丝点击