STM32f1时钟系统, T, Z+ e) t4 ?* t6 S 8 h; f0 R0 d& E% o3 J 一、祭出STM32F1的官方时钟框图 & o- M6 [$ B$ w' w 二、寄存器说明 . O5 ~7 b% U7 {% E' ? 1、时钟控制寄存器RCC_CR - y7 W/ r d( C/ p 第0位:HSION(0,关闭;1,开启)2 J: ] o* s$ P( r 第1位:HSIRDY(0,HSI未就绪;1,HSI就绪)3 J1 `# F% T3 E & ~/ C8 t( y) Z3 x- c+ W* r3 k: G 第16位:HSEON(0,关闭;1,开启)) O; L* ]# B! M! y! F2 F : X: G8 m! E8 [4 Q 第17位:HSERDY(0,HSE未就绪;1,HSE就绪)( a9 s. i; x( s" ~( N* M6 @ . W; v) N0 r$ X+ F+ @! g 第19位:CSSON(0,时钟检测关闭;1,时钟监控开启) % S2 _! B7 ^& H! g: ` 第24位:PLLON(0,关闭PLL;1,使能PLL) 第25位:PLLRDY(0,PLL未锁定,1:PLL锁定) * G9 }) E" q1 r% q& x4 M' F" ^ + k( m" k' p: D! p1 Z2 u 2、时钟配置寄存器RCC_CFGR ) \* z+ L+ Z# q 第1:0位SW: 软件设置时钟源 00:HSI为系统时钟 # O$ y) n4 m/ t4 W' h" H! P" Y 01:HSE为系统时钟 }1 m: X8 ~$ u; u0 ~ # H$ p0 ]2 p% O* R; {0 K1 g6 j 10:PLL作为系统时钟 11:时钟不可用 第3:2位SWS:硬件指示时钟源$ W: U! B& m, P+ [4 ^ 00:HSI为系统时钟 5 t9 E& \' L. V ; s7 ~. p5 e% c 01:HSE为系统时钟 10:PLL作为系统时钟5 c4 x3 P& _* I 11:时钟不可用 ' t$ O' w* v2 k, _3 X* v% f& O1 k 第7:4位HPRE:软件设置AHB的分频系数(具体见参考手册) 第10:8位PPPRE1:软件设置低速APB1(PCLK1)的与分频系数(具体见参考手册)$ B8 y' v$ ^3 V7 M% `% a6 E- O" ` 第13:11位PPPRE2:软件设置高速APB2(PCLK2)的预分频系数(具体见参考手册) 第15:14位ADCPPE:软件设置ADC的时钟频率(最大14Mhz)+ R% H$ C' B' w6 ]1 D 8 o. K A5 V* L5 H5 [ 00:APB2的2分频 01:APB2的4分频8 k/ d+ | y& G R5 q , p/ D+ d8 G% I 10:APB2的6分频) {, C9 Y) H2 r# k % y& d7 K; _6 e- @ 11:APB2的8分频! F* E1 v) z0 E5 \ 第16位PLLSRC:软件选择PLL的时钟源(关闭PLL时写入) - h# `' B. K( c8 b# l L, \ 2 M7 v3 k/ Y7 g8 S/ B 0:HSI的2分频作为PLL的输入时钟% x( ?5 b: Y5 W1 ]* W$ N 1:HSE作为PLL的输入时钟 ; S- u+ |+ u1 c- i 第17位PLLXTPRE:软件选择HSE作为PLL输入时是否分频 # {! j" K0 v$ d( {; a" l2 l, J; c7 | & Y+ J! {. A4 A0 r/ L+ S5 L 0:HSE不分频) Q7 W& X; |9 g. c+ h 1:HSE 2分频! V' t' v" F% [" C- G4 h 第21:18位PLLMUL:软件设置PLL的倍频系数(最高不超过72M,实测超过100M后还能工作)6 Y# c w' T2 X . l* z; l- `- s% i1 G) K 详见参考手册 第22位USBPRE:软件设置USB时钟 - \! \: O/ Y, \: ?5 s% y4 V 0:PLL时钟1.5倍分频作为USB时钟7 Q3 D' F& ~6 U ( w+ y/ ~+ c1 H" Z: K, N0 V 1:PLL直接作为USB时钟% i: e! j1 X4 S& _$ T0 v" G 8 t ` @/ c( d' _+ E" x 第26:24位MCO:时钟输出PA8引脚(对于STM32F1来说,最高频率不能超过IO口的频率50Mhz)8 k& A2 l, `& E, K w( Y# s9 S/ W " l2 _1 t, ~& Q4 P # W3 C) T V. K$ v 0xx:无输出 100:输出系统时钟SYSCLK4 {: Y( A% n: d2 l$ } 1 u) P6 F+ C* z$ [0 v4 M 101:HSI输出 110:HSE输出9 ?; ^' @5 W. a# L' C) a5 p. E $ r: p& D* R" b8 L4 L 111:PLL的2分频输出 8 i. A3 @, y* S" N' Z * T5 |& H+ R+ q7 i 3、时钟中断寄存器RCC_CIR; M* u: g; t4 o/ @ 0 [. V3 T! h! X- j 4、APB2外设复位寄存器(RCC_APB2RSTR) 对应位写1复位相应外设,写0无作用 : l; G+ b( q# ~ % d; D" C% ~# T* c" @( W 5、APB1 外设复位寄存器 (RCC_APB1RSTR)+ m2 ~2 q. E( n% R+ C 4 }7 Q; ?" |$ b" K& w- A5 g 对应位写1复位相应外设,写0无作用 ! x9 ~; n0 [/ x3 j: c 6、 AHB外设时钟使能寄存器 (RCC_AHBENR) 3 s: e: a' J9 q5 m& ^ 对应位写1开启相应外设,写0关闭外设7 O: s I8 T- y ( O7 q" H# J$ h$ ] 7、 APB2 外设时钟使能寄存器(RCC_APB2ENR) 对应位写1开启相应外设,写0关闭外设 M+ a8 M) B2 S! I$ O2 C . b5 a, Q$ @3 B) ] U ' k8 Y! p' e: O- Q# g# s 8、 APB1 外设时钟使能寄存器(RCC_APB1ENR)- _5 D. S1 a2 R4 I 对应位写1开启相应外设,写0关闭外设 ) t K' G! ~5 O! l & A8 x( K$ A- g! l5 Q 9、备份域控制寄存器 (RCC_BDCR) 第0位LSEON:软件设置,外部低速振荡器使能:0:关闭,1:开启;9 [% @; R2 ^6 g9 P 5 G7 Z4 t' Y* u7 a, K& P 第1位LSERDY:硬件指示,外部低速LSE就绪:0:未就绪,1:就绪; 第15位RTCEN:RTC时钟使能:0:关闭,1开启;% ]. d$ d- R! S8 {0 C% N$ [ 0 @& _% T9 {, O* u& \3 { s 10、控制/状态寄存器(RCC_CSR)1 g7 ?+ M% ?% m 第0位LSION:软件设置,内部低速振荡器就绪:0,:40kHz振荡器时钟就绪 第1位LSIRDY:硬件指示,内部低速振荡器就绪:1:就绪,0:未就绪;! L' ]9 I/ F0 r/ ? . w0 {" f o% _! K 第29位IWDGRSTF窗口看门狗复位标志:1:发生窗口看门狗复位;0:未发生+ k; `- \# s( i' A# e8 j 第30位WWDGRSTF独立看门狗复位标志:1:发生独立看门狗复位;0:未发生5 d; J2 b @/ G / v3 m2 q' Z+ ` + B! \, @2 d e( `/ ^; z 主要相关库函数: . _* O) ~* t! M4 @2 f- I 1、void RCC_DeInit(void);//将外设RCC寄存器设为缺省值;3 l. [0 h8 u, ~! K# X 2、void RCC_HSEConfig(uint32_t RCC_HSE);//设置外部高速晶振(HSE); 3、void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);//调整内部高速晶振(HSI)校准值 " {3 E0 N; Y9 S* l 4、void RCC_HSICmd(FunctionalState NewState);//使能或者失能内部高速晶振(HSI)/ e( c& `9 F& Z& U& s 6 y5 }& F/ m, H8 h8 |% I# l# w 5、void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);//设置PLL时钟源及倍频系数- q/ m( e: l% w5 l( U 6、void RCC_PLLCmd(FunctionalState NewState);//使能或者失能PLL; Q. u: n. H+ [ 7、void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//设置系统时钟(SYSCLK)源5 C- S4 n% U/ @( j; ?, I # B9 n( e0 h+ |9 M 8、void RCC_HCLKConfig(uint32_t RCC_SYSCLK);//设置AHB时钟(HCLK) 9、void RCC_PCLK1Config(uint32_t RCC_HCLK);//设置低速AHB时钟(PCLK1)* f' r% N) `# Q 6 O9 N% Y' E6 y# ~+ [( U 10、void RCC_PCLK2Config(uint32_t RCC_HCLK);//设置高速AHB时钟(PCLK2) 2 Z$ |7 ^3 n: q% J2 D8 l 11、void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);//使能或者失能指定的RCC中断- F# K3 s! ]8 r( S$ b& { 12、 void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);//设置USB时钟(USBCLK)9 J0 u2 T) }! y1 C8 C: T( }3 t 13、void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//设置ADC时钟(ADCCLK)6 G4 ?, f- ~% x% j* h$ h6 r# W \ - {$ f: {4 q8 i5 @7 T 14、void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//使能或者失能AHB外设时钟 ! z; F) j1 G1 N! e$ S 15、void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//使能或者失能APB2外设时钟( H5 \: W5 T- C1 [ + v5 S" z: Z- a 16、void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//使能或者失能APB1外设时钟 0 B/ P) `8 y7 q3 e 17、void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//强制或者释放高速AHB外设复位 / n2 U' [4 T6 O8 N 18、void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//强制或者释放高速APB(APB2)外设复位$ j6 u8 {9 P2 u2 ~; I* { 19、void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//强制或者释放低速APB(APB1)外设复位 , F$ g8 K+ l' _ 20、void RCC_ClockSecuritySystemCmd(FunctionalState NewState);//使能或者失能时钟安全系统% |$ L/ }/ y* M: \7 u3 x. y/ G 4 V, {+ u1 U) J; ^4 H 21、void RCC_MCOConfig(uint8_t RCC_MCO);//选择在MCO管脚上输出的时钟源,警告:当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。# y( g! a4 `7 _$ S4 Y- z7 T ! w' ~# K s1 {% ]6 E 22、FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//检查指定的RCC标志位/ S# R5 ~* f, D$ b( S2 p . e4 S# v! m0 P6 n Z //RCC_FLAG_HSIRDY ,HSI晶振就绪;RCC_FLAG_HSERDY ,HSE晶振就绪; $ t# k4 w: C( o) o //RCC_FLAG_PLLRDY ,PLL就绪;RCC_FLAG_LSERDY ,LSI晶振就绪;8 T# p; d" B- P //RCC_FLAG_LSIRDY ,LSE晶振就绪;RCC_FLAG_PINRST ,管脚复位 ; //RCC_FLAG_PORRST ,POR/PDR复位;RCC_FLAG_SFTRST ,软件复位 ;; K# d e( o! W* C2 B d- n. j //RCC_FLAG_IWDGRST ,IWDG复位;RCC_FLAG_WWDGRST ,WWDG复位; //RCC_FLAG_LPWRRST ,低功耗复位, n s+ ]8 ~4 B: F 4 O0 R" X! h* r! R6 H 23、void RCC_ClearFlag(void);//清除RCC的复位标志位& J% g: c# w: V7 i5 V& T ! B2 Z5 T$ ?9 ] 24、ITStatus RCC_GetITStatus(uint8_t RCC_IT);//检查指定的RCC中断发生与否6 L! t9 S# X3 P- o. m, i" H/ Q% X //输入:RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断 //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断 3 ~" Q8 R, U; W- ^1 }" A; d1 \ //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断+ }" Q* g4 a4 u7 v8 O 25、void RCC_ClearITPendingBit(uint8_t RCC_IT);//清除RCC的中断待处理位 2 e8 L5 L+ M2 h //RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断, K% h2 c2 `) l& L1 c //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断 5 {0 z; v9 }" J, s8 a# X //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断8 e4 ]* z7 i% E1 A* S# o |
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数
【经验分享】STM32F1之定时器
【经验分享】【stm32】stm32f1代码中core_cm3、system_stm32f10x、stm32f10x_conf、stm32f10x等文件的作用