MCU学习笔记
STM32时钟
1. STM32时钟类型
2. 从程序的角度配置时钟
1. STM32时钟类型
5个时钟源:HSI, HSE, LSI, LSE, PLL
- HSI,高速内部时钟,RC振荡器,频率为16MHz,精度不高。可以直接作为系统时钟或者作PLL时钟输入。
- HSE,高速外部时钟,可接石英/陶瓷晶振(OSC),或者接外部时钟源,频率范围4MHz~26MHz。可以分频后作为RTC的一个时钟源;也可作为系统时钟源。
- LSI,低速内部时钟,RC振荡器,频率为32KHz,提供低功耗时钟。主要提供独立看门狗和自动唤醒单元使用。可以选择作为RTC的时钟源。
- LSE,低速外部时钟,接频率为32.768KHz的石英晶体,外部产生的时钟时非常稳定的。RTC大部分情况下,都会选择LSE作为自身的时钟来源。
- 主PLL,锁相环倍频输出,时钟来源可以使HSI, HSE,通过MUX,选择输入。可用作系统时钟源。
PLLCLK = HSE*(N/(M*P))
系统时钟SYSCLK
来源:
- HSI振荡器时钟
- HSE振荡器时钟
- PLL时钟
作用:
- 可以直接用作以太网PTP时钟
- 经过AHB的预分频,HCLK,1. 可以作为AHB总线,外设,内核,存储器的时钟; 2. 可以作为Cortex系统定时器,SYSTICLK; 3. FCLK Cortex*运行时钟
- AHBx预分频的之中,经过APBx预分频,给APBx总线上的外设提供时钟
专用PLL
-
PLLI2S:生成精确时钟,在I2S和SA1上实现高品质音频
PLLI2SQ: 可用作SA1_A/SA1_B的clock; Q:2~15
PLLI2SR: 可用作I2S的clock; R: 2~7
PLLI2SN: 可用作PLLI2S VCO的倍频clock; N: 192~432 -
PLLSAI: 生成精确时钟,用于SA1输入时钟,同事还未LCD_TFT接口提供精确时钟;
PLLSAIQ: 可用作SA1_A/SA1_B的clock; Q:2~15
PLLSAIR: 可用作LCD_TFT clock;R:2~7
PLLI2SN: 可用作PLLI2S VCO的倍频clock; N: 192~432
以太网时钟
- 外部PHY芯片,提供50MHz的时钟,经过分频用于MACTXCLK, MACRXCLK, MACRMIICLK
- 外部USB2.0PHY提供60MHz时钟,用于USBHSULPL时钟
注意:任何外设在是在用之前,必须使能其相应的时钟;即enable 相应的时钟控制位。
2. 从程序的角度配置时钟
-
系统函数初始化
SystemInit函数
SystemInit();使用HAL库函数的时候,在系统启用之后,会自动调用:
//引导代码,芯片启动之后,引导执行SystemInit,然后执行main函数
Reset handler
Reset_Handler PROC
EXPORT Rest_Handler [WEAK]
IMPORT SystemInit //1. FPU浮点运算的设置;2. 复位相关寄存器配置;3. 设置向量表的地址,包括基地址,偏移地址;标准库中,会配置系统时钟初始化.HAL库中,没有配置,需要用户自己配置。
IMPORT _main
LDR R0, =SystemInit
BLX R0
LDR R0,=_main
BX R0
ENDP
使用HAL库的时钟系统配置步骤:
- 使能PWR时钟:调用函数_HAL_RCC_PWR_CLK_ENABLE()。
- 设置调压器输出电压级别:调用函数_HAL_PWR_VOLTAGESCALING_CONFIG()。
- 选择是否开启Over-Drive功能:调用函数_HAL_PWREx_EnableOverDrive()。
- 配置时钟源相关参数:调用函数HAL_RCC_OscConfig();。
- 配置系统时钟源以及AHB, APB1和APB2的分频系数:调用函数HAL_RCC_ClockConfig()。
参考资料:《STM32F4xx中文参考手册-第六章复位和时钟控制》 Thanks^^
【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~