STMCU小助手
发布时间:2022-3-16 10:57
|
现附上我自行实现的时钟配置函数9 f8 x5 v: Z* N 3 C- L! i) ], M* B E5 c% l
一般情况下单片机的时钟配置是单片机程序中的第一步,也是很重要的一步。这时候我们需要考虑以下几个问题。 6 t7 S9 q' D' b, n+ Y: w 1. 系统时钟的时钟源用哪个。, @' ]2 ^3 ?; z2 M$ V# v 6 @8 R$ z8 {/ C+ c: x9 i 2. 系统时钟频率要多少。 8 j4 Z% r. ?+ i6 E 3. 每个模块的时钟频率要多少。0 v- m; q% o# E 4. 如果外部时钟出了问题,这个时候时钟是怎么运行的。 / F: {) y! @2 y, l/ x 下面就针对性的讲一讲STM32F103的时钟配置。 知识点: 1. 系统复位后,HSI振荡器被选为系统时钟。当时钟源被直接或通过PLL间接作为系统时钟时,它将不能被停止。 + U6 S+ K. r) T+ D& R- j6 H5 u 2. STM32F103的三个可以作为系统时钟的时钟源,分别是HSI、HSE、PLL。而PLL的时钟源是HSI/2(内部RC振荡器二分频)、HSE。 3.如果使用HSI,系统时钟我们能达到的最大频率是64MHz,如果使用HSE,系统时钟最大频率是72MHz。+ \( D) ?# I. J) B- {9 { ) h, ?" Q/ I X0 [2 t# w1 G* Y ]' ` 4.APB时钟有低速PCLK1和高速PCLK2;PCLK1是从HCLK二分频得到的,最大36MHZ,根据上一条知识点如果是使用HSI,则最快是32MHz。 5. PLL的设定需要在使能之前,一旦PLL使能后参数不可更改。& H$ N- i7 S1 T4 u3 X9 V ) B0 G* O$ P9 c+ D7 f. `* L5 e 6.附录是一些缩写的英文全称,也有一些补充的知识点。7 k" m0 ?, k: Z7 {3 D, R * r t, t# F& m8 ^ 步骤:# k& {0 i! V+ O& M6 A $ L& _' E/ N& W- [ 第一步 初始化时钟 不管现在SYSCLK的时钟源是哪个,我们要更换时钟源。先RCC_DeInit(); 第二步 打开时钟& `' |, y1 f* i 1 p9 `# y! a% u3 g) r! |5 O3 C 内部高速时钟HSI RCC_HSICmd(ENABLE);& W/ U( ~; U% o2 z' z6 T6 D _$ B 外部高速时钟HSE RCC_HSEConfig(RCC_HSE_ON);: B$ o; I* u4 u6 c8 J; n' u! | ]: N" H' o' `8 J 第三步 等待时钟晶振工作2 C [$ x1 G* y# R( i: c: H& b" Y0 n+ \ HSI While(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET); 4 z3 l& w# h0 Y- L# K! k N# H+ G HSE While(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET);' f* W8 N; [2 y r 第四步 设置AHB时钟HCLK' F7 Z. A# `, G8 a# ] RCC_HCLKConfig(RCC_SYSCLK_Div1); 分频系数自己设定,一般都是RCC_SYSCLK_Div1即不分频。 % x# y; M) h0 X7 J5 v8 o 第五步 设置低速APB时钟 T, W+ P! s3 j" D. U & S! A3 x# G$ b. Z/ I+ _ RCC_PCLK1Config(RCC_HCLK_Div2);6 O7 ^+ T8 b+ y# f & f% z; d2 H! h i( B 第六步 设置高速APB时钟- l3 `( R& i8 `4 e" p* Y 7 M; P7 ] C- O RCC_PCLK2Config(RCC_HCLK_Div1);0 U4 ~2 Z' X4 e0 Z " R1 }% Y, `+ `: Q+ ^" d5 o 第七步 设置Flash预缓冲( C# X5 O# ^2 Q- E. K2 l7 C. h- a FLASH_SetLatency(FLASH_Latency_2); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 使能flash预缓冲- u4 H k, | B% K, { . ?7 a+ R0 w' P% m# V; W Flash的操作也没有总线时钟快,所以需要总线在操作flash时稍作等待。推荐根据HCLK设置。/ {, q- }+ c) d' ^/ w ( ~6 A2 \$ Y! |9 w3 [' l; c 0-24MHz时,取FLASH_Latency_0;24-48MHz,取FLASH_Latency_1;48-72MHz时,取FLASH_Latency_2。 ! ^- b2 B) g r 第八步 设置PLL 如果不使用PLL,请略过此步骤$ C: ^1 s* n6 g HSI RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16 );& e6 _6 F5 j1 U6 ~6 ?+ t/ o2 n/ H$ c3 b 2 D1 z+ H0 l4 T O n HSE RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9 ); , h0 T4 F1 Z) u9 k5 a/ Y0 d 第九步 打开PLL 如果不使用PLL,请略过此步骤0 e3 ~4 ?# g& j; v" _! Y RCC_PLLCmd(ENABLE); ) R5 {; p: I/ B3 R4 s- [ ^7 y- \ 第十步 等待PLL工作 如果不使用PLL,请略过此步骤. }0 }2 _/ x& }9 i. D! G 2 D) s& O6 N5 _9 d while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET);( j0 R' L1 Q1 W9 Z 第十一步 设置系统时钟 / s j9 ?0 j# k+ E HSI RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);5 C/ @; p% c+ P' b - ]! m0 M: h( J+ c6 j HSE RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);& \. X6 V0 I9 S0 ^5 T( V3 x, R( w PLL RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);" O) b$ }; s4 p 7 J7 o3 c. ~4 j9 ^ 第十二步 判断是否是设置的时钟( r/ n; F9 | ?* k HSI while(RCC_GetSYSCLKSource()!= 0x00); 7 j7 r) x! W# T6 h: o HSE while(RCC_GetSYSCLKSource()!= 0x04);" S* x8 d% K& d PLL while(RCC_GetSYSCLKSource()!= 0x08); 附录:一些缩写的英文全称及中文翻译,帮助理解记忆。 IWDG IndependentWatchdog 独立看门狗 + r5 H; [( R# [ RTC RealTime Clock 实时时钟) O+ z: K s' l" ^1 K 3 u9 s- ^* {5 s 时钟源可以是LSI,或者LSE,再或者HSE的128分频。 LSI LowSpeed Internal 内部低速时钟 / s# g3 N, b) _* a4 E3 n( N RC振荡器,频率为40kHz。供IWDG使用,还能作为RTC的时钟源。" C4 K! j+ i) l" |1 }9 ? . F/ F, }2 b3 v6 n. g& }, l HSI HighSpeed Internal 内部高速时钟 RC振荡器,频率为8MHz。 HSE HighSpeed External 外部高速时钟9 H' H+ K; {! \' [- Q% a 可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 7 J0 V' W2 A% N; i P% F PLL PhaseLockedLoop 锁相环倍频输出 ( x$ O* s, F. d/ E 其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍, # `) V( t4 X5 k) Q/ { SYSCLK SystemColock 系统时钟( s' [0 u, Y8 |' @. z( S$ ~$ a2 i) | 2 x+ a8 @9 o1 J: w3 `9 Y & G& S% T5 F6 q: S1 R+ s AHB AdvancedHigh performance Bus 高级高性能总线 AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。 b& i, h! F9 b+ I' m4 T2 c3 r1 B / T) N: w7 m( J3 f APB Advanced PeripheralBus 高级外围设备总线 ( c' z" R4 t7 M, K5 S1 I# @3 G! c/ I APB主要用于外设模块(如ADC、USB、SPI、UART等)与AHB之间的连接。4 e+ E1 j# L4 K% ~/ A5 [ HCLK Advanced High performance Bus Clock 高级高性能总线时钟 9 g% J" T- X# h3 m6 T; C 就是SYSCLK经过AHBPrescaler(预分频器)后得到的AHB的时钟。9 Y0 ~( f2 R) d: T5 Z PCLK PeripheralBus Clock 外围设备总线时钟 PCLK有两个,一个是低速的PCLK1,另一个是高速的PCLK2。 $ W# G" |8 g7 u+ H PCLK1是经过APB1Prescaler后得到的APB1时钟。8 M/ u- ]- g+ c4 M. _! a! n PCLK2是经过APB2 Prescaler后得到的APB2时钟。, ~3 O' E% n5 T5 c4 Y FCLK FreeRuning Clock 自由运行时钟 * s: {9 C" a# _7 O* r9 P, }0 e 为供给CPU内核的时钟信号,CPU的主频就是指这个信号;1/FCLK就是CPU时钟周期。 为什么叫自由运行时钟呢?下面是别人家的讲解。 " v* x }! n" t- h1 _ ARMJISHU注:FCLK 为处理器的自由振荡的处理器时钟,用来采样中断和为调试模块计时。在处理器休眠时,通过FCLK 保证可以采样到中断和跟踪休眠事件。 Cortex-M3内核的“自由运行时钟(free running clock)”FCLK。“自由”表现在它不来自系统时钟HCLK,因此在系统时钟停止时FCLK也继续运行。FCLK和HCLK 互相同步。FCLK 是一个自由振荡的HCLK。FCLK 和HCLK 应该互相平衡,保证进入Cortex-M3 时的延迟相同 $ y) D# Z/ X, M+ ~ " i; l) p* o& v7 L1 @; l |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版