一.时钟源
STM32有5个时钟源,分别是:
1.HSE:High_Speed_Extenal 外部高速时钟,焊接在芯片外部,精确度较高,是系统时钟的主要来源。
2.HSI :High_Speed_Inernal内部高速时钟,在芯片内部,精度不高。
3.LSE:Low_Speed_Extenal外部低速时钟,接频率为32.768kHz的石英晶体。主要为RTC时钟服务。
4.LSI:Low_Speed_Inernal内部低速时钟,提供低功耗时钟,大小为40kHz,主要用于驱动独立看门狗。
5.PLL:Phase-locked loop锁相环时钟,其时钟源由HSE和HSI提供。
二.系统时钟
1.系统时钟(SYSCLK):时钟源由PLL、HSE、HSI提供。其中,系统时钟主要由HSE--->选择器--->选择器--->PLL这一条线路来提供。
PS:这也是为什么PLL被称作时钟源的原因,因为相对于系统来说,PLL可以为系统时钟提供时钟来源。
2.系统时钟分为3路:第一路为HCLK,最大频率为72MHz;第二路挂载在APB1总线下,最大频率为36MHz;第三路挂载在APB2总线下,最大频率为72MHz。
三.修改系统时钟的方法
1.观察启动文件,发现在执行SystemInit函数后,才会执行main函数,而系统时钟就是在SystemInit函数中配置。如图:

2.利用鼠标右键点击SystemInit,选择Go To Definition Of 'SystemInit' ,可以跳转到void SystemInit()函数,里面都是RCC寄存器的配置。如图:


3.重点观察SystemInit()函数中的这个函数,SetSysClock()函数(PS:SetSysClock意为设置系统时钟),同样利用Go To Definition Of 'SetSysClock'跳转到SetSysClock函数内部。

4.在SetSysClock函数内部是一堆条件编译,系统时钟设为72MHz的原因是因为我们宏定义了SYSCLK_FREQ_72MHz,从而执行了编译条件 'defined SYSCLK_FREQ_72MHz'使得执行了SetSysClockTo72(); 从而设置了系统时钟72MHz。如图:

所以,我们改变系统时钟为36MHz的方法是将宏定义defined SYSCLK_FREQ_72MHz改为defined SYSCLK_FREQ_36MHz。
改变流程:右键选中SYSCLK_FREQ_72MHz,点击,选择Go To Definition Of 'SYSCLK_FREQ_72MHz'点击跳转,跳转后,将代码
#define SYSCLK_FREQ_72MHz 72000000//将此行注释
注释掉,将 /* #define SYSCLK_FREQ_36MHz 36000000 */ 此段注释抹去,重新编译,即将系统时钟改变为36MHz。
/* #define SYSCLK_FREQ_36MHz 36000000 */ 将此段注释抹去
流程如图:
选中SYSCLK_FREQ_72MHz,跳转到宏定义:

更改注释:

更改完成:

声明:文章原创不易,转载引用请声明出处。
本文介绍了STM32的5种时钟源,包括HSE、HSI、LSE、LSI和PLL,并详细讲解了系统时钟的工作原理。重点讲述了如何通过修改启动文件中的SystemInit函数和SetSysClock函数来调整系统时钟频率,以实现从72MHz更改为36MHz的过程,涉及到RCC寄存器配置和条件编译的使用。
7159

被折叠的 条评论
为什么被折叠?



