STM32f1时钟系统 一、祭出STM32F1的官方时钟框图 . P9 `7 }: X" @7 X 6 b$ l5 s; ^3 a9 i ! E' W% k m$ F4 l6 e$ ~ 二、寄存器说明7 F' j1 Z/ K8 T/ w1 T# S 1 |& |; p1 v' r' X" [6 E# m 1、时钟控制寄存器RCC_CR* ?- \; k3 U5 W, J6 N& O 1 {, ?( m. \/ w" N* ]& D 第0位:HSION(0,关闭;1,开启) $ T! `1 u, z4 n' z5 \ 第1位:HSIRDY(0,HSI未就绪;1,HSI就绪)0 }. ~+ C* y) \. m# L 3 V7 R2 {+ X4 [ 第16位:HSEON(0,关闭;1,开启) ; {% B3 j) j9 s, h 第17位:HSERDY(0,HSE未就绪;1,HSE就绪)0 l# l% R3 I$ w/ Q 第19位:CSSON(0,时钟检测关闭;1,时钟监控开启) . `. y' {8 Y- ~! m' ]' b 第24位:PLLON(0,关闭PLL;1,使能PLL)3 y' J& Z! d% o# S 第25位:PLLRDY(0,PLL未锁定,1:PLL锁定)/ z/ T1 @& [- I" n* D 5 F* f. w8 M r9 L# Z 2、时钟配置寄存器RCC_CFGR ; O, i: f$ T- E- D+ B: n( L 4 \; F: m& g" v; ]$ i* s+ v 第1:0位SW: 软件设置时钟源 00:HSI为系统时钟 ?& y+ ^% h: X% C H 01:HSE为系统时钟" Q L1 r. B" } 10:PLL作为系统时钟 11:时钟不可用% f! [ P/ a4 u7 y; Y$ y1 E% | 9 ]! W9 a# K& A# r- l( v7 M/ R 第3:2位SWS:硬件指示时钟源: {' W( b: G- z8 a' V/ w, _ 00:HSI为系统时钟 # [) {7 Y$ p2 G" O+ { $ o- g7 P; e) [) P! x& n: `# L 01:HSE为系统时钟/ Q* J3 p) H F9 z* a( A3 b - K" A: C8 S, [/ l* }$ ? 10:PLL作为系统时钟 4 ~- O* k! w/ K 11:时钟不可用6 Y9 {# ~7 C) T+ T5 g 6 B5 h7 a1 W2 L# a) ^: l 第7:4位HPRE:软件设置AHB的分频系数(具体见参考手册)4 l/ w$ W+ S9 Y 第10:8位PPPRE1:软件设置低速APB1(PCLK1)的与分频系数(具体见参考手册) 第13:11位PPPRE2:软件设置高速APB2(PCLK2)的预分频系数(具体见参考手册)% D- `+ }. T5 [6 q & g9 i' [5 Y. R4 S) ? $ A' E {3 Q9 G& w4 P 第15:14位ADCPPE:软件设置ADC的时钟频率(最大14Mhz) : C5 R4 ^6 d- \9 q : }8 R) L- R* _4 u; b 00:APB2的2分频 01:APB2的4分频 - D" }) |! v5 s* q* I$ o/ D 10:APB2的6分频 11:APB2的8分频& w. _' d( K% u* k# l/ n& a2 Y 第16位PLLSRC:软件选择PLL的时钟源(关闭PLL时写入) # _; E* e# W$ ^: p% } 0:HSI的2分频作为PLL的输入时钟: _/ H% Y' z0 S( R' P& U ( i2 \! k8 Y. @: y 1:HSE作为PLL的输入时钟$ }7 ]4 Z& ?: j; O0 e- J 第17位PLLXTPRE:软件选择HSE作为PLL输入时是否分频; l# x$ i5 [0 \$ }; _* o. X) G # w+ Z3 q: W" P9 e# k 0:HSE不分频 1:HSE 2分频6 m. \) h9 G' X 第21:18位PLLMUL:软件设置PLL的倍频系数(最高不超过72M,实测超过100M后还能工作)5 a9 Z8 K' F- m/ k* f! i: S 详见参考手册2 y) t" c, F5 ~: p1 R 第22位USBPRE:软件设置USB时钟! y+ ]) k, s$ k! j! m9 z 0 J* _) O: Y/ Q3 G3 c( f5 u2 a 0:PLL时钟1.5倍分频作为USB时钟/ `' \" W9 h9 f6 R1 d4 f 1:PLL直接作为USB时钟- P3 ]) I! A B7 t 4 F4 ?# I# {6 `9 I' r/ C: f 第26:24位MCO:时钟输出PA8引脚(对于STM32F1来说,最高频率不能超过IO口的频率50Mhz) ; C7 y9 q$ r+ C& w 0xx:无输出9 p' ?/ Y @) {, m" E5 [ # [2 O# R; |4 w 100:输出系统时钟SYSCLK ! ?/ q) M) R- d5 R4 D8 q! J 101:HSI输出 110:HSE输出 * W% e4 H* ?; N! S/ [! O6 E 111:PLL的2分频输出 r2 u2 n1 B; F ) e+ j- z* U6 ~4 ^, [" P " j0 t& s5 q9 i: c7 j 3、时钟中断寄存器RCC_CIR4 w- B; j( m/ f" v. _0 }8 w- z 8 r7 R2 p( \5 }$ j5 S 4、APB2外设复位寄存器(RCC_APB2RSTR) 对应位写1复位相应外设,写0无作用 . _' [ I0 d4 C2 E# Q. B, g 5、APB1 外设复位寄存器 (RCC_APB1RSTR)! {2 D/ V9 o. [, [$ ^2 u/ } 对应位写1复位相应外设,写0无作用 P' _" n5 E; x+ Z9 o. ~, m2 n + n7 l, S3 M# p/ j 6、 AHB外设时钟使能寄存器 (RCC_AHBENR) ; v9 i& s; u5 }' f. e: y: t 对应位写1开启相应外设,写0关闭外设 7、 APB2 外设时钟使能寄存器(RCC_APB2ENR) 对应位写1开启相应外设,写0关闭外设3 r7 |$ X- g+ z- s 1 o& W' J. G6 [. m) l; f 8、 APB1 外设时钟使能寄存器(RCC_APB1ENR)0 @' [! a K& |' _0 z5 H 5 a# L; n2 Y4 e/ U 对应位写1开启相应外设,写0关闭外设. J1 v: j9 E* Q- v+ v! L1 O ; n, d9 u: n" u' O6 \4 X 9、备份域控制寄存器 (RCC_BDCR) 8 |/ s5 F6 D5 ?+ ^2 ^ E 第0位LSEON:软件设置,外部低速振荡器使能:0:关闭,1:开启;- [! B3 c9 _; K' ~& A9 a/ |* U 第1位LSERDY:硬件指示,外部低速LSE就绪:0:未就绪,1:就绪; 第15位RTCEN:RTC时钟使能:0:关闭,1开启;+ H; {9 k/ G- c& I! P K 7 i9 {6 W" \! h* m$ S4 } 10、控制/状态寄存器(RCC_CSR) ' e! ^! a1 V; x+ u 第0位LSION:软件设置,内部低速振荡器就绪:0,:40kHz振荡器时钟就绪 4 O; i1 y3 C! `( e 第1位LSIRDY:硬件指示,内部低速振荡器就绪:1:就绪,0:未就绪; 第29位IWDGRSTF窗口看门狗复位标志:1:发生窗口看门狗复位;0:未发生* S; [. ~+ q# M 第30位WWDGRSTF独立看门狗复位标志:1:发生独立看门狗复位;0:未发生/ R- Q) C' d5 @ 9 _, a& B& j8 i( I( x3 v) e 主要相关库函数: 0 H4 J; i2 @% ~( a2 b: {0 k P 1、void RCC_DeInit(void);//将外设RCC寄存器设为缺省值; 2、void RCC_HSEConfig(uint32_t RCC_HSE);//设置外部高速晶振(HSE);% h. h4 a& N% ~1 O1 A( o $ T9 |' s; u: H; \2 I5 u- X. ? 3、void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);//调整内部高速晶振(HSI)校准值 , Q$ X& L$ r/ c) U1 ] 4、void RCC_HSICmd(FunctionalState NewState);//使能或者失能内部高速晶振(HSI). d0 p* i/ A- }/ I7 D; s, r 5、void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);//设置PLL时钟源及倍频系数 ( F. |3 n; v: I 6、void RCC_PLLCmd(FunctionalState NewState);//使能或者失能PLL 7、void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//设置系统时钟(SYSCLK)源* E) m2 I1 @) m# V! b: C . P) z# I8 l7 J) {, h5 P 8、void RCC_HCLKConfig(uint32_t RCC_SYSCLK);//设置AHB时钟(HCLK)$ d$ G' o* [, l" D2 L7 d2 Z% f8 O & I4 C# F: ^" v* E/ ~ 9、void RCC_PCLK1Config(uint32_t RCC_HCLK);//设置低速AHB时钟(PCLK1) 7 b, w+ {% f5 i0 S6 _7 `: Y6 C 10、void RCC_PCLK2Config(uint32_t RCC_HCLK);//设置高速AHB时钟(PCLK2)+ W' J& |: F$ V9 A: H9 k- N 9 q/ W9 I( M; }9 p# s, ~" k( k 11、void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);//使能或者失能指定的RCC中断 & ^, ^3 ~3 U0 P. X3 } 12、 void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);//设置USB时钟(USBCLK) / g8 Q7 S; p7 T8 s- I9 h7 u 13、void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//设置ADC时钟(ADCCLK) 14、void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//使能或者失能AHB外设时钟$ N" B5 w+ M8 j2 L; j) X5 I 15、void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//使能或者失能APB2外设时钟 T7 b" H4 ?6 W% p. { 16、void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//使能或者失能APB1外设时钟 17、void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//强制或者释放高速AHB外设复位 ( Y: A1 z: ]" p d: y) F 18、void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//强制或者释放高速APB(APB2)外设复位0 y0 E; e3 n8 \ 19、void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//强制或者释放低速APB(APB1)外设复位7 m1 a2 T# v- L" F) p* R 20、void RCC_ClockSecuritySystemCmd(FunctionalState NewState);//使能或者失能时钟安全系统# o- a8 A+ d8 c- j! z& D 21、void RCC_MCOConfig(uint8_t RCC_MCO);//选择在MCO管脚上输出的时钟源,警告:当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。 5 M7 t& _$ T* U 22、FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//检查指定的RCC标志位 //RCC_FLAG_HSIRDY ,HSI晶振就绪;RCC_FLAG_HSERDY ,HSE晶振就绪; 2 E0 I4 O7 j% R" |+ Q( R! j1 O; @8 X //RCC_FLAG_PLLRDY ,PLL就绪;RCC_FLAG_LSERDY ,LSI晶振就绪;. r6 U( U j! ^' [ //RCC_FLAG_LSIRDY ,LSE晶振就绪;RCC_FLAG_PINRST ,管脚复位 ; 2 D8 ]4 A+ \* v* n, f8 m+ r2 K //RCC_FLAG_PORRST ,POR/PDR复位;RCC_FLAG_SFTRST ,软件复位 ; 7 Z! O- B7 D, I5 @) k; F //RCC_FLAG_IWDGRST ,IWDG复位;RCC_FLAG_WWDGRST ,WWDG复位; : P& F5 K. r2 W7 R4 M //RCC_FLAG_LPWRRST ,低功耗复位 23、void RCC_ClearFlag(void);//清除RCC的复位标志位' g8 U& ] K: c; ] 6 O6 s" r6 o H 24、ITStatus RCC_GetITStatus(uint8_t RCC_IT);//检查指定的RCC中断发生与否/ D. F$ S# d/ A6 c4 `' _& M ) P$ C' [, C4 ]( ?3 _ //输入:RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断 //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断 //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断 25、void RCC_ClearITPendingBit(uint8_t RCC_IT);//清除RCC的中断待处理位1 _4 F% ^7 L- o' ^/ x4 p1 T+ X //RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断 : a2 ^9 }: W* r- w$ `$ Y //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断5 E- D% `+ y, r //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断1 a4 k9 z/ {0 b2 x; A 4 \) K2 Y, L# B' w9 V* _ |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数