STMCU小助手
发布时间:2022-12-29 18:00
|
最近看了一下STM32的启动代码,在system_init函数中找到了RCC部分初始化的流程,有许多不解,查了一下资料,基本上搞清楚了RCC的原理。 RCC主要是管理系统复位和时钟控制的,系统复位这里不讨论,主要讲系统时钟。6 m% T+ o- `2 @: b! [$ R 时钟 STM32可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK): ● HSI 振荡器时钟8 ?) K. T. S0 p) Q. y: v) i3 W ● HSE 振荡器时钟 ● 主 PLL (PLL) 时钟7 A, n4 Z5 P% X6 u% z& ]' P 器件具有以下两个次级时钟源: ● 32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用 于停机/待机模式下的自动唤醒。 ● 32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK) 6 m6 R. |; G5 o 下面先看看STM32的时钟树: . ~0 o: y" k6 W" z) V& d4 J
我们一般会使用外部无源晶振作为芯片的输入时钟,外部晶振稳定和精确性都比较高,时钟走向如图中箭头所示。5 ~1 k8 B- C* g STM32F4系列的单片机内部sysclk可以到168MHZ,所以想要达到这么高速时钟的要求,肯定是需要使用PLL来倍频的。 假设我们的外部晶振源是25M HZ,如箭头所示,进来后先需要分频,这里我们设置分频系数为25,那么vco的输入频率就是25MHZ/25 = 1MHZ。
. ~ r& W0 u' L. u* B7 c9 K N用来设置倍频系数:6 b2 A7 w1 Z. b5 Z2 [, I, J5 P VCO输入频率的值乘倍频系数(这里假设N为400)得到VCO输出频率:1MHZ*400 = 400MHZ
而后还要再经过P分频才能得到SYSCLK的值: P设置为45 `1 \$ x# V2 p! B2 v PLL输出频率= VCO输出频率/4 = 400MHZ/4 = 100MHZ2 X+ u' P4 H" [
我使用的是STM32F411系列的单片机,SYSCLK为100MHZ。 AHB这里不做分频,AHB也是100Mhz,APB2也不分频,APB2也是100mhz,APB1做2分频,为50MHZ 这些分频数值需要根据实际需要的频率去计算出来。 ! h3 S, w- _; A6 b0 S 注意: HSE 外部时钟的值是在stm32f4xx.h中定义的:! H7 W& n3 w* W' U( o# V0 c% O# D
这里一定要改成外部晶振的值,否则标准库在使用它的时候会出现问题。) l$ S% i' h: e/ ]- ~ ————————————————) E5 i1 _# _ i P& H& w9 I 版权声明:tony++. c* X0 F g! S + B* z( M* g* Q: \" `4 Z4 x |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版