STM32f1时钟系统/ g; N d7 s( F 9 `7 M( s" i" Y0 s: x2 K 一、祭出STM32F1的官方时钟框图$ W" x5 t/ s8 T! S 1 B! y3 m# v5 {8 S& H2 ~ - l$ F! c! L/ ]6 b4 }" | j I0 }+ t 二、寄存器说明 1、时钟控制寄存器RCC_CR 第0位:HSION(0,关闭;1,开启) 7 c# u) I! j( k9 N& G; {1 u) E- N 第1位:HSIRDY(0,HSI未就绪;1,HSI就绪)' S" j: y# k1 U# F& u 第16位:HSEON(0,关闭;1,开启)1 w6 c$ f- J3 S8 h3 p5 Q# ^: _ 第17位:HSERDY(0,HSE未就绪;1,HSE就绪) , G @( z# b: ^7 \& ~& @5 X# k 第19位:CSSON(0,时钟检测关闭;1,时钟监控开启) 第24位:PLLON(0,关闭PLL;1,使能PLL) k5 N5 h9 r8 O 第25位:PLLRDY(0,PLL未锁定,1:PLL锁定)" F/ [# U+ F- o8 v6 [1 d9 x8 ] 8 u5 ?6 i8 O8 k! w$ W 2、时钟配置寄存器RCC_CFGR* @: i7 v( g/ z p4 f* _+ E 1 B& m* p, V6 H$ C) O 4 O7 N. L6 N( C9 M- n2 ^% F8 U 0 M3 X1 i) s5 z: ~4 k, Z 第1:0位SW: 软件设置时钟源 00:HSI为系统时钟 u4 d* `) c# q* M0 G J; s 01:HSE为系统时钟 10:PLL作为系统时钟* p9 Y8 J" `5 r" p5 w# u 11:时钟不可用 # ~4 s/ z8 X& u6 f2 E/ H* \- H 第3:2位SWS:硬件指示时钟源9 E4 ?. Z8 S3 F+ y 00:HSI为系统时钟 01:HSE为系统时钟" w/ x+ ~4 ]: t9 Q/ X 3 }9 F" g/ f; T' p8 `9 [3 ` 10:PLL作为系统时钟 11:时钟不可用0 N0 e2 E) Z; I9 e( |9 [ 1 g" q8 v8 s: c8 J 第7:4位HPRE:软件设置AHB的分频系数(具体见参考手册) + A2 V* j2 m6 V! |( j 第10:8位PPPRE1:软件设置低速APB1(PCLK1)的与分频系数(具体见参考手册) 第13:11位PPPRE2:软件设置高速APB2(PCLK2)的预分频系数(具体见参考手册)( H! S! I& P0 {% ]; c* U 7 F& m! k0 T, E 第15:14位ADCPPE:软件设置ADC的时钟频率(最大14Mhz) 00:APB2的2分频, | ?! K+ D8 W# y3 ]6 z3 o# I 6 v5 I7 c% Z8 Y: g( [ 01:APB2的4分频 10:APB2的6分频# N- Y4 P2 x+ e8 N 11:APB2的8分频4 F' _6 Z+ D9 K! F' A 第16位PLLSRC:软件选择PLL的时钟源(关闭PLL时写入) 4 H! r- K5 y' ^3 T, |8 y7 r 0:HSI的2分频作为PLL的输入时钟 1:HSE作为PLL的输入时钟& m4 ^6 |/ A: W# [4 z% o! B4 v 第17位PLLXTPRE:软件选择HSE作为PLL输入时是否分频6 i* z3 B) I4 Y4 p) {# h6 G% r 0 {7 |: ~9 @* { 0:HSE不分频 `0 x+ `; A, `* n$ U1 A( f6 `* [ 1:HSE 2分频 P% N0 _, C3 x+ T' X* | 第21:18位PLLMUL:软件设置PLL的倍频系数(最高不超过72M,实测超过100M后还能工作)# N4 F3 n) x4 N4 q2 E* U 2 H. P: i4 Q6 O4 c; f1 _ 详见参考手册/ S6 w; g# ~; I5 g, r0 \ 第22位USBPRE:软件设置USB时钟4 p4 W, r( `6 K , j/ y- g1 F, H& i2 }4 p& j 0:PLL时钟1.5倍分频作为USB时钟 3 O: Y7 _! A7 R3 T" D/ A# W 1:PLL直接作为USB时钟, w0 h3 Y7 e0 H# z 第26:24位MCO:时钟输出PA8引脚(对于STM32F1来说,最高频率不能超过IO口的频率50Mhz)" Y7 O9 e+ q0 P+ i9 o N 1 n6 J4 j, y+ y K& I. w1 z - v# e, }/ Z( D! @8 T 0xx:无输出 100:输出系统时钟SYSCLK 101:HSI输出; C7 B$ R. D$ {. v2 [. O0 i 1 @$ t9 z4 Z" K) k% N 110:HSE输出 ' h' J* X* M( p8 i' M) \5 { 111:PLL的2分频输出+ @) Q, M; w" X# p; R+ w% X3 v 3、时钟中断寄存器RCC_CIR* u/ | v$ J9 E+ d% O / C& Z7 }3 y8 k) j$ ]$ k& V 4、APB2外设复位寄存器(RCC_APB2RSTR)( r; ?- c0 @2 d 对应位写1复位相应外设,写0无作用 # W' o3 V8 [- U: q6 H 3 }4 W4 m1 g h 5、APB1 外设复位寄存器 (RCC_APB1RSTR) 0 Z j5 F2 i* l$ J 对应位写1复位相应外设,写0无作用% a& }7 Y& b, ~4 s) h. w1 w; [ ! l7 z9 X$ C# t 8 [3 ]0 @+ q1 U/ I1 k& Q% U$ B 6、 AHB外设时钟使能寄存器 (RCC_AHBENR) . _% z/ ]0 o8 @& I7 U ; r, O& s/ m7 r 对应位写1开启相应外设,写0关闭外设8 k# ]9 _8 G8 v- b- d ) s9 ~4 B' ? G % E; H' ^2 b* n7 V 7、 APB2 外设时钟使能寄存器(RCC_APB2ENR) 对应位写1开启相应外设,写0关闭外设" v* \1 `5 |/ h 7 h# b# y% ^6 S" S/ J/ p 8、 APB1 外设时钟使能寄存器(RCC_APB1ENR) , c9 V% G' x- J4 |, S* c 对应位写1开启相应外设,写0关闭外设. Y; i1 ^+ z) k* y4 k + s0 w: k9 Y- ~9 A 9、备份域控制寄存器 (RCC_BDCR)! ]; l+ `7 `2 z8 v3 Q. W. w 5 J6 ~/ r! u& M' w1 i) P 第0位LSEON:软件设置,外部低速振荡器使能:0:关闭,1:开启; 第1位LSERDY:硬件指示,外部低速LSE就绪:0:未就绪,1:就绪;0 d$ X) R ]3 l' Y* D4 P5 O! P $ P6 L: z. @- @5 n+ _ 第15位RTCEN:RTC时钟使能:0:关闭,1开启;! l: G. U$ }2 R( ]* z \1 Q & p; c9 T, |5 c' n 10、控制/状态寄存器(RCC_CSR) ( w: S8 @; ? ]; g+ X7 D $ J9 s0 t, O2 S 第0位LSION:软件设置,内部低速振荡器就绪:0,:40kHz振荡器时钟就绪 ) Y$ u3 J( p4 p 第1位LSIRDY:硬件指示,内部低速振荡器就绪:1:就绪,0:未就绪;% l4 b* r$ B! R! s ; ?0 N5 J/ [% G# O9 L 第29位IWDGRSTF窗口看门狗复位标志:1:发生窗口看门狗复位;0:未发生- |5 Y0 k0 J9 | # I$ Y7 p2 K! U 第30位WWDGRSTF独立看门狗复位标志:1:发生独立看门狗复位;0:未发生 主要相关库函数: J" T+ p! }# `3 V ! M: v6 _! L. o& t1 t$ ] U6 E& r 1、void RCC_DeInit(void);//将外设RCC寄存器设为缺省值;. U, B# ~+ ^2 {5 _ . h/ r0 l9 I% h" D! C3 s 2、void RCC_HSEConfig(uint32_t RCC_HSE);//设置外部高速晶振(HSE);' f$ T5 H. q3 w8 U' L 3、void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);//调整内部高速晶振(HSI)校准值 4、void RCC_HSICmd(FunctionalState NewState);//使能或者失能内部高速晶振(HSI)8 ?: u& O: Q- }( Y1 ^1 K' t5 x5 e ; E$ d3 i; X( \3 A 5、void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);//设置PLL时钟源及倍频系数 6、void RCC_PLLCmd(FunctionalState NewState);//使能或者失能PLL+ x* J' u: L% Q# I8 q7 W 0 T: C- y( q7 E/ _: n- \ 7、void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//设置系统时钟(SYSCLK)源 " p7 A0 f+ j0 u# k: A- x 8、void RCC_HCLKConfig(uint32_t RCC_SYSCLK);//设置AHB时钟(HCLK) 9、void RCC_PCLK1Config(uint32_t RCC_HCLK);//设置低速AHB时钟(PCLK1) 10、void RCC_PCLK2Config(uint32_t RCC_HCLK);//设置高速AHB时钟(PCLK2) 11、void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);//使能或者失能指定的RCC中断 12、 void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);//设置USB时钟(USBCLK) 0 f H) C3 B% P! j. x! v/ W 13、void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//设置ADC时钟(ADCCLK)1 T: B' C% p* X \ % v" p# D" ]2 l- G 14、void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//使能或者失能AHB外设时钟; S3 q6 B" H" \ " z' c8 K, s2 Q( \ 15、void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//使能或者失能APB2外设时钟6 w' r8 f$ W* O; r" W! } 16、void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//使能或者失能APB1外设时钟( v" R" ^0 _* i 8 s4 }' z1 {% r9 X 17、void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//强制或者释放高速AHB外设复位: a) n. ?( W" z & ^# b* m- f& b6 _5 Z; q& s 18、void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//强制或者释放高速APB(APB2)外设复位7 o2 q) o1 g: d; n 19、void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//强制或者释放低速APB(APB1)外设复位 # c( E( o) ~8 f7 o; k" `0 p 20、void RCC_ClockSecuritySystemCmd(FunctionalState NewState);//使能或者失能时钟安全系统 21、void RCC_MCOConfig(uint8_t RCC_MCO);//选择在MCO管脚上输出的时钟源,警告:当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。 - u: v( ^7 y+ }! S: I) s' @3 a 22、FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//检查指定的RCC标志位 //RCC_FLAG_HSIRDY ,HSI晶振就绪;RCC_FLAG_HSERDY ,HSE晶振就绪; //RCC_FLAG_PLLRDY ,PLL就绪;RCC_FLAG_LSERDY ,LSI晶振就绪;2 d3 M5 [0 ?5 f% r0 s 1 \$ T+ E+ Y' I9 W* x( E1 A t //RCC_FLAG_LSIRDY ,LSE晶振就绪;RCC_FLAG_PINRST ,管脚复位 ; //RCC_FLAG_PORRST ,POR/PDR复位;RCC_FLAG_SFTRST ,软件复位 ; 5 e' d# N& {6 `: h9 N$ C$ T: o& p //RCC_FLAG_IWDGRST ,IWDG复位;RCC_FLAG_WWDGRST ,WWDG复位; # V$ p' H7 X L0 ~6 x% c3 v //RCC_FLAG_LPWRRST ,低功耗复位* r( |+ c* P/ v3 B. k$ ]" ? 23、void RCC_ClearFlag(void);//清除RCC的复位标志位0 P, W- P5 E" m, R3 S/ o8 ]4 ~0 k $ D0 ]0 j% @! W 24、ITStatus RCC_GetITStatus(uint8_t RCC_IT);//检查指定的RCC中断发生与否% i: |- G; p/ l0 @( @4 z 8 m' Z9 K' J' p# \* ? //输入:RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断, E5 f7 |& x& u6 {$ v, _* ` + S/ E8 c$ j# D. I //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断7 H: v' z( H8 ]0 t0 X5 P / T2 B6 B* ~ i8 q* x& I6 u1 T$ G! q //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断3 ~- s {: K! h$ N9 H& C ' Y# ?' ?) R5 }$ w 25、void RCC_ClearITPendingBit(uint8_t RCC_IT);//清除RCC的中断待处理位 : c+ e6 p+ O! ^; w7 a //RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断 " G" g. b% ~8 q$ E+ }' k, H //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断* D% |" B) x5 y p* O8 G$ n //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断2 @3 Z& p% m/ [% } & s$ P8 y4 \* G2 `$ c/ `$ G* `+ d |
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数
【经验分享】STM32F1之定时器
【经验分享】【stm32】stm32f1代码中core_cm3、system_stm32f10x、stm32f10x_conf、stm32f10x等文件的作用