历史上的今天
今天是:2024年10月15日(星期二)
2021年10月15日 | STM32 时钟树及SystemInit()函数理解
2021-10-15 来源:eefocus
一、时钟树和时钟源:

图一 STM32时钟树
图一说明了STM32的时钟走向,从图的左边开始,从时钟源一步步分配到外设时钟。
STM32有以下4个时钟源:
1)高速外部时钟(HSE):外部晶振作为时钟源,晶振频率可取范围为4~16MHz,一般采用8MHz的晶振。
2)低速外部时钟(LSE):外部晶振作为时钟源,一般采用32.768kHz晶振,主要提供给实时时钟模块(RTC)。
3)高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz,但不稳定。
4)低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块(RTC),频率大约在40kHz。
以最常见的高速外部时钟(HSE)为例分析:
首先查看我们在外部提供的晶振频率为8MHz,如图二。

图二 STM32原理图 晶振部分

图三 高速外部时钟为例
如图三蓝线部分,从左端的OSC_OUT和OSC_IN开始,这两个引脚分别接到外部晶振的两端。8MHz的时钟经过分频器PLLXTPRE、开关PLLSRC、锁相环PLL等,最终输出的频率为72MHz。

图四 STM32各外设与总线的关系
如图四,GPIO外设时挂载在APB2总线上的。因此,从APB2的时钟输出我们可以得到GPIO外设的时钟也等于72MHz。
注:在实际应用中,振荡频率与功率有关。为降低STM32的整体功耗,在不影响开发板正常运行的调条件下,尽量使用较低的晶振频率。
二、SystemInit()函数理解
在进入main()函数之前调用一个名为SystemInit()的函数,它的作用是设置系统时钟SYSCLK。在编程环境中追踪该函数,发现该函数的执行流程是先将与配置时钟相关的寄存器都复位为默认值,复位寄存器后,调用了另一个函数SetSysClock()
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
SetSysClockTo72();
#endif
/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */
}
从 SetSysClock()代码可知,它是根据我们设置的条件编译来进行不同的时钟配置的。
而在system_stm32f10x.c文件的开头,已经默认有了条件编译定义,见如下代码:
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
#define SYSCLK_FREQ_24MHz 24000000
#else
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
#define SYSCLK_FREQ_72MHz 72000000
#endif
/*!< Uncomment the following line if you need to use external SRAM mounted
on STM3210E-EVAL board (STM32 High density and XL-density devices) or on
STM32100E-EVAL board (STM32 High-density value line devices) as data memory */
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
/* #define DATA_IN_ExtSRAM */
#endif
可知,当输入的外部时钟源HSE的振荡频率为8MHz时,默认的系统时钟SYSCLK设置为72MHz。
用封装好的库函数RCC_APB2PeriphClockCmd()开启和关闭外设时钟。
注:RCC是STM32的时钟控制器,可开启或关闭各总线的时钟,在使用各外设功能必须先开启其对应的时钟,没有这个时钟内部的各器件就不能运行。
上一篇:STM32学习三之时钟树分析
下一篇:STM32时钟树解析
史海拾趣
|
小弟最近开始接触keil中的RTX51,还没有入门,只好按书上给的程序调试, #include int counter0; int counter1; job0()_task_0 {os_create_task(1); while(1) {counter0++; } } job1(void) _task_1 { while(1 ...… 查看全部问答> |
|
安装PLATFORM BUILDER后,在WINCE500下面的资源文件比如:NETUI.RC都是英文的资源文件,却找不到中文的。请问中文的资源文件在哪?我想改变一些中文对话框的属性,改英文的有效吗?… 查看全部问答> |
|
d大家好,我现在的问题关于cetk新增的wifi test中one wlan card test的, 安装文档所述进行测试,但是在第一个case就fail了,问题是连接不上ap, 04bb0ff2: ndt_1c_wlan Msg: Variation 1: Testing Association with ssid NDTEST_WEP_AP1 04bb0f ...… 查看全部问答> |
|
2410接LCD,调了很久了,通过修改寄存器配置,SPI配置LCD屏内寄存器,已经基本显示正常了,可以看到稳定的WinCE桌面,但是WinCE桌面的颜色始终不对,启动前有Test,将屏分四块分别显示RGB&white,四种颜色也不对,都是很奇怪的颜色, ...… 查看全部问答> |
|
为什么EVC下加入ON_WM_NCHITTEST编译有错error C2065: \'ON_WM_NCHITTEST\' : undeclared identifier… 查看全部问答> |
|
GPIO能在输出模式,配置成2mA、4mA或8mA的驱动能力,算是LM的特色之一吧,我们就使用GPIO驱动能力可调,改变驱动电流,控制LED的亮度变化,只能是三种间断的变化。使用API设置: GPIOPadConfigSet(GPIO_PORTF_BASE,LED,GPIO_STRENGTH_8MA, GPIO_PI ...… 查看全部问答> |




