打印
[STM32F1]

RCC_GetClocksFreq获取频率不正确

[复制链接]
3164|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hgyxbll|  楼主 | 2015-5-22 14:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前用的STM32F100ZCT6,代码一直没有问题,后来改为STM32F100VCT6.发现串口收发不正常,经检查发现问题出在RCC_GetClocksFreq函数,这个函数获取频率只有所设频率的一半.
代码没有变化,电路仍旧使用的是外部晶振8M.系统频率是24M.
后来仔细跟踪了一下发现问题出在一个寄存器上.
在SetSysClockTo24函数中设置CFGR代码:
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
    /*  PLL configuration:  = (HSE / 2) * 6 = 24 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6);
#else

在ZCT6上此处修改CFGR后CFGR2的最后一位也会修改为1,根据datasheet,这是它的特性.
但是在VCT6上CFGR2却没有随之变更,一直保持了0, 所以导致在函数RCC_GetClocksFreq中
 #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

计算SYSCLK_Frequency出错.
请问大家有碰到这种问题吗,是电路问题还是代码问题?

注:
串口配置过程:USART_Init->RCC_GetClocksFreq

沙发
mmuuss586| | 2015-5-22 19:52 | 只看该作者
不管时钟多少;
你UART的初始化程序,都应该根据RCC_GetClocksFreq获得的时钟频率 ,去计算UART的时钟;
这样就不会错了;

使用特权

评论回复
板凳
Thor9| | 2015-5-22 20:42 | 只看该作者
顶起来,大家帮忙

使用特权

评论回复
地板
amanda_s| | 2015-5-22 23:08 | 只看该作者
CFGR2没变,检没检查CFGR中对应的值,是你写入的值吗?
因为CFGR2.PREDIV1,和CFGR中对应的位进行写的时候是要求PLL关闭的。

还有外部晶振工作正常吗?

或者是不是有别的地方改过同样的寄存器?

使用特权

评论回复
5
hgyxbll|  楼主 | 2015-5-25 16:04 | 只看该作者
mmuuss586 发表于 2015-5-22 19:52
不管时钟多少;
你UART的初始化程序,都应该根据RCC_GetClocksFreq获得的时钟频率 ,去计算UART的时钟;
这 ...

现在系统时钟运行正常,就是RCC_GetClocksFreq返回的值不正确

使用特权

评论回复
6
hgyxbll|  楼主 | 2015-5-25 16:18 | 只看该作者
amanda_s 发表于 2015-5-22 23:08
CFGR2没变,检没检查CFGR中对应的值,是你写入的值吗?
因为CFGR2.PREDIV1,和CFGR中对应的位进行写的时候是 ...

CFGR中的值确实是我写入的值,并且系统工作正常,systick频率工作正常.
我一步步调试跟踪CFGR的变化,然后查看CFGR2的变化.
在前一个产品上是正常的,在后一个产品上就不行

使用特权

评论回复
7
hgyxbll|  楼主 | 2015-5-25 16:18 | 只看该作者
amanda_s 发表于 2015-5-22 23:08
CFGR2没变,检没检查CFGR中对应的值,是你写入的值吗?
因为CFGR2.PREDIV1,和CFGR中对应的位进行写的时候是 ...

CFGR中的值确实是我写入的值,并且系统工作正常,systick频率工作正常.
我一步步调试跟踪CFGR的变化,然后查看CFGR2的变化.
在前一个产品上是正常的,在后一个产品上就不行

使用特权

评论回复
8
周董| | 2015-5-25 20:39 | 只看该作者
学习一下

使用特权

评论回复
9
zuoyun| | 2015-9-10 10:14 | 只看该作者
这个问题我也遇到了,请问楼主是怎么解决的?

使用特权

评论回复
10
zchong| | 2015-9-10 12:50 | 只看该作者
HSE_VALUE宏定义不对造成的吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝