打印
[STM32F4]

对STM32F2和F4系列时钟配置的另一种理解

[复制链接]
819|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
motor666|  楼主 | 2021-11-8 15:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机的程序运行之前,必须进行时钟配置,可是,我们写代码的时候,并没有写时钟配置代码,程序也能运行,为什么?如果单片机外接不同频率的晶振,时钟要怎么修改呢?
1、先来看没写时钟配置代码,程序怎么能运行。
原来当程序启动的时候,就自动为我们设置好了时钟。
在启动代码 : startup_stm32f20xx.s 和 startup_stm32f40xx.s 文件中,有一行代码 IMPORT  SystemInit ,和 LDR     R0, =SystemInit ,
当程序启动的时候,就执行了 SystemInit()函数,打开这个函数 void SystemInit(void),可以看到,首先复位时钟配置的各个寄存器,然后执行:SetSysClock(); 进行时钟设置。
仔细分析可以看到,系统时钟为PLL输出时钟,AHB时钟为PLL时钟,AHB1时钟为系统时钟/4,AHB2时钟为系统时钟/2,再看看各个外设接到了哪一个时钟线上,就能知道各个外设使用的时钟频率是多少了。

2、更换了外接晶振,时钟配置如何修改呢?
我们之所以没有管时钟配置,是因为单片机外接晶振25MHZ与时钟配置代码中的参数刚好相符,代码中默认的PLL_M的值25,打开 system_stm32F2xx.c 和 system_stm32F4xx.c 中有一行 #define PLL_M      25 , PLLVCO的输出频率是25 / 25 = 1MHZ ,如果外接晶振不是25M,就修改这个数即可,比如,外接8M晶振,把PLL_M的值修改成8,#define PLL_M    8 , 其它代码都不用变,得到的时钟频率跟接25M晶振是一样的。个人觉得外接16M晶振最好,因为刚好与内部高速时钟频率相同,如果外部晶振失效,内部晶振刚好替换,几乎看不出问题。
也可以根据自己的实际需要,修改AHB、AHB1和AHB2的时钟,总之,频率够用的情况下,频率越低,系统可靠性越高,有的时候不必过分追求高频率。

使用特权

评论回复
沙发
木木guainv| | 2021-12-4 11:42 | 只看该作者
角度非常独特

使用特权

评论回复
板凳
磨砂| | 2021-12-4 11:44 | 只看该作者
非常具有启发性

使用特权

评论回复
地板
晓伍| | 2021-12-4 11:46 | 只看该作者
看问题的角度不同啊

使用特权

评论回复
5
tpgf| | 2021-12-4 11:47 | 只看该作者
哪种更好还是看实际表现

使用特权

评论回复
6
八层楼| | 2021-12-4 11:49 | 只看该作者
最终还是看需求了

使用特权

评论回复
7
观海| | 2021-12-4 11:50 | 只看该作者
理解的非常到位

使用特权

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

本版积分规则

175

主题

424

帖子

1

粉丝