[其他ST产品] 搭建机器人电控系统——MCU基石——STM32时钟配置详解

[复制链接]
1450|46
 楼主| 自动化陈稳 发表于 2023-10-18 16:36 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2023-10-18 16:36 | 显示全部楼层
由说明备注知道,这个文件有两个函数:

①SystemInit():设置系统时钟函数,包括:

时钟源是哪个?
PLL锁相环中的系数是多少?
AHB/APB预分频器的分频是多少?
(看,是不是解决了之前参数的问题)
 楼主| 自动化陈稳 发表于 2023-10-18 16:38 | 显示全部楼层
②SystemCoreClockUpdate():用于更新变量SystemCoreClock ,这个变量的赋值是HCLK或者说主频,这个变量被用于去实现Cortex内核自带的那个定时器,用于程序延时。
 楼主| 自动化陈稳 发表于 2023-10-18 16:38 | 显示全部楼层
整个文件的工作过程:

单片机上电复位/或按键复位后,程序先执行startup_stm32f4xx.s启动函数,启动函数中默认选择HSI(16MHZ)作为时钟源。system_stm32f4xx.c在startup_stm32f4xx.s中被调用,执行其中的SystemInit()函数,而在这个函数中除了复位一些寄存器的初始位置外,经过了一个叫做SetSysClock()的函数: 51242652f9977e3c1a.png
 楼主| 自动化陈稳 发表于 2023-10-18 16:38 | 显示全部楼层
这个函数上方的关键注释是:Configure the System clock source(初始化时钟源)

67910652f9996e02ad.png
 楼主| 自动化陈稳 发表于 2023-10-18 16:39 | 显示全部楼层
这个函数是这样的:
77940652f99aae3113.png
 楼主| 自动化陈稳 发表于 2023-10-18 16:39 | 显示全部楼层
这个函数的说明是:PLL (clocked by HSE) used as System clock source,即将HSE作为时钟源经过PLL锁相环得到系统时钟。
 楼主| 自动化陈稳 发表于 2023-10-18 16:39 | 显示全部楼层
而我们在时钟树里知道,系统时钟有三条路:
 楼主| 自动化陈稳 发表于 2023-10-18 16:39 | 显示全部楼层
4752652f99d17cfad.png HSI(16MHZ)
HSE(4—25MHZ)
PLLCLK(HSE经过PLL锁相环得到)
 楼主| 自动化陈稳 发表于 2023-10-18 16:39 | 显示全部楼层
由此我们得出结论:在MCU的启动过程中,先默认把HSI(16MHZ)作为时钟源启动,然后再经过SystemInit()中的SetSysClock()函数,将HSE作为时钟源经过PLL锁相环后的时钟作为真正的系统时钟!
 楼主| 自动化陈稳 发表于 2023-10-18 16:41 | 显示全部楼层
②参数二:分频系数是多少?

现在我们知道了单片机选择的时钟的具体路线,现在关键就是如何确定路线上的分频系数,这些分频系数包括:分频系数M,倍频系数N,分频系数P,如下图。 7201652f9a1b8cb7b.png
 楼主| 自动化陈稳 发表于 2023-10-18 16:41 | 显示全部楼层
同样在system_stm32f4xx.c文件中,有对这几个系数变量的初始化: 61497652f9a30d8958.png
 楼主| 自动化陈稳 发表于 2023-10-18 16:41 | 显示全部楼层
根据公式计算:系统时钟SYSCLK=8MHZ*N/M/P=168MHZ,即SYSCLK的最大频率: 64321652f9a49e904f.png
 楼主| 自动化陈稳 发表于 2023-10-18 16:42 | 显示全部楼层
以上,解决了SYSCLK的问题。

AHB,APB的分频系数是多少?
其实在SystemInit()中的SetSysClock()函数中已经做了初始化: 24808652f9a5ab810c.png
 楼主| 自动化陈稳 发表于 2023-10-18 16:42 | 显示全部楼层
第一句话告诉我们:系统默认运行出来的系统时钟频率为168MHZ,这也应证了我们之前的理论。
第二句话告诉我们:HCLK=SYSCLK/1,即AHB时钟线频率=SYSCLK=168MHZ。
第三句话告诉我们:PCLK2=HCLK/2,即APB2时钟线频率=HCLK/2=84MHZ。
第四句话告诉我们:PCLK1=HCLK/4,即APB1时钟线频率=HCLK/4=42MHZ。
 楼主| 自动化陈稳 发表于 2023-10-18 16:42 | 显示全部楼层
以上是分频系数的选择,这是初始化默认的分频,当然你可以改成其他分频。

其实在system_stm32f4xx.c开头的表格中已经告诉过我们所有参数的默认值:
7537652f9a8102e5c.png
 楼主| 自动化陈稳 发表于 2023-10-18 16:43 | 显示全部楼层
但是当你需要移植到另外一个型号的板子的时候,你需要知道怎么改才能移植,如果427和407的主频是不一样的,你应该怎么改?
 楼主| 自动化陈稳 发表于 2023-10-18 16:43 | 显示全部楼层
③时钟线到了哪?——stm32f4xx_rcc.c文件
经过以上的分析,我们得出:

AHB=168MHZ
APB1=42MHZ
APB2=84MHZ
 楼主| 自动化陈稳 发表于 2023-10-18 16:43 | 显示全部楼层
在stm32f4xx_rcc.c文件中,对不同时钟线上所挂载的设备进行了初始化,通过该文件可以知道:
 楼主| 自动化陈稳 发表于 2023-10-18 16:43 | 显示全部楼层
挂载在AHB1上的设备:
84311652f9ab4cdc00.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部