
STM32f1时钟系统 一、祭出STM32F1的官方时钟框图 0 c- H2 \& V( r7 k8 L4 K: [ ![]() ![]() & ^ T) R$ V; a- r # r# o6 \) h9 {1 ^% O0 q" V/ k j 二、寄存器说明 1、时钟控制寄存器RCC_CR ![]() 第0位:HSION(0,关闭;1,开启)+ ~& J: {1 A( z" Y5 I5 I; R & F: b3 |* j2 D& j, e4 B5 J 第1位:HSIRDY(0,HSI未就绪;1,HSI就绪)- X6 G5 m7 q: W, R2 ]* l1 ?& e, A ! ]) d& v' J+ M8 x/ k9 E 第16位:HSEON(0,关闭;1,开启)# g k) \) l0 i( @7 Z' X0 z! h0 ? # N* T+ v3 v1 b b' G6 J1 q 第17位:HSERDY(0,HSE未就绪;1,HSE就绪), I# D6 a% O- i/ F% y1 Q 第19位:CSSON(0,时钟检测关闭;1,时钟监控开启), G4 s- {6 k" \, p 第24位:PLLON(0,关闭PLL;1,使能PLL)0 D$ U; S3 |, u6 b ) D3 W" x# u# p% F, h4 W4 L$ B 第25位:PLLRDY(0,PLL未锁定,1:PLL锁定)5 z$ M; s# g' K" y, j7 D & E7 B* H! ?% D5 I. { 2 i* s4 R# ~ S5 m4 s! E( V 2、时钟配置寄存器RCC_CFGR ![]() 8 s( z1 p6 Y$ U# I9 S# f. }' N ![]() @4 @9 W& c- j' ~4 x 第1:0位SW: 软件设置时钟源 3 I8 @# {7 y/ b7 ?7 G1 D: v( z* g 00:HSI为系统时钟 ( F j( F" o) V1 F5 E4 n1 z 01:HSE为系统时钟 10:PLL作为系统时钟) T! J. m: g) o: v; v 11:时钟不可用 c$ M% O% `1 e' Y% x/ R; ` n : S) }& t! L: N5 W% X 第3:2位SWS:硬件指示时钟源 00:HSI为系统时钟 . ?6 {/ M" G, S7 w8 ?" i 01:HSE为系统时钟 / S/ @* Y% ^+ W 10:PLL作为系统时钟( [7 D5 Q' ^& m' d0 u) l : q3 Q) ]/ n8 j: Z; G8 U/ i' Z2 ? 11:时钟不可用( J/ c. A# \/ ]' W, L( x. T- a ; [8 n: z+ E8 O 第7:4位HPRE:软件设置AHB的分频系数(具体见参考手册) ) S$ N0 s% g3 _1 R- X ![]() 8 _0 h, b* h d 第10:8位PPPRE1:软件设置低速APB1(PCLK1)的与分频系数(具体见参考手册)5 I/ u0 W( }$ r6 P0 r1 } ) M' Y1 h& \ u" Y |# |1 \* G2 O ![]() 第13:11位PPPRE2:软件设置高速APB2(PCLK2)的预分频系数(具体见参考手册) ![]() # ^$ d: t- i a* l0 {/ T, {9 \1 @% m 第15:14位ADCPPE:软件设置ADC的时钟频率(最大14Mhz) ' m! P) ^9 v3 @" q( ~8 J ![]() 00:APB2的2分频* M9 [4 u/ P3 w8 O) d- i 01:APB2的4分频 , L# h; c; C% B8 k 10:APB2的6分频% k. G& ~4 Y1 y1 a2 A* X / ~4 U; E5 w1 s1 C( | 11:APB2的8分频 7 F; c9 f# j8 @6 T 第16位PLLSRC:软件选择PLL的时钟源(关闭PLL时写入)2 \% X: z/ O. w2 ]$ C4 y ![]() ~2 Q w1 |" @* W 0:HSI的2分频作为PLL的输入时钟, d) X8 {$ E/ E& a0 H3 c4 f & p& w6 m9 h2 G( J6 z 1:HSE作为PLL的输入时钟, Q. x7 y; B0 a7 c& U S# I 2 J7 F' @% F x9 J/ h 第17位PLLXTPRE:软件选择HSE作为PLL输入时是否分频 0:HSE不分频 " k" V3 w5 Q- ^* s3 P3 L 1:HSE 2分频3 m* W) ~" j1 J+ j 第21:18位PLLMUL:软件设置PLL的倍频系数(最高不超过72M,实测超过100M后还能工作) ![]() 详见参考手册 + L3 J& u- }! Z0 O* Q1 r 第22位USBPRE:软件设置USB时钟 ![]() 0:PLL时钟1.5倍分频作为USB时钟 1:PLL直接作为USB时钟# U0 k1 N8 u3 S" R6 Y6 ?, D ; D. D' P: G7 f& A D) z 第26:24位MCO:时钟输出PA8引脚(对于STM32F1来说,最高频率不能超过IO口的频率50Mhz)* K3 }! t" P+ N/ E7 V, |" l $ M( @9 V& j& R+ S6 ^7 {6 ` 0xx:无输出, a( }! e: H2 d8 y9 R 100:输出系统时钟SYSCLK # f! U" S3 v+ q# v 101:HSI输出 ( a) g( c6 t& _7 i6 C) V6 V: d X5 M' g 110:HSE输出7 ~7 j# `) ~7 F( ~# V2 C7 i9 E2 N4 x # V& B" U; {# W& O6 ^( n1 L- Y 111:PLL的2分频输出. a* W4 h$ I$ e0 _* E, U& y1 w $ s8 D# a% \3 Y% m 3、时钟中断寄存器RCC_CIR ! ^4 w2 f- B9 j6 o0 s 4、APB2外设复位寄存器(RCC_APB2RSTR) 对应位写1复位相应外设,写0无作用 ![]() " I5 ]$ b; i/ n1 E. u5 u 5、APB1 外设复位寄存器 (RCC_APB1RSTR), S g8 X" Y: A% ~8 {% Y$ z9 t( F 对应位写1复位相应外设,写0无作用/ Y8 |# H9 @; q8 Q( d+ a' p " [8 ?6 h/ s% J$ [( q& _( E ![]() 2 _/ R4 }6 i H# I' i 6、 AHB外设时钟使能寄存器 (RCC_AHBENR) % C* i9 C. t" ^- A+ T 对应位写1开启相应外设,写0关闭外设 5 u( L1 I! V3 L" U: |1 l( c 7、 APB2 外设时钟使能寄存器(RCC_APB2ENR) 对应位写1开启相应外设,写0关闭外设 8、 APB1 外设时钟使能寄存器(RCC_APB1ENR) 对应位写1开启相应外设,写0关闭外设 - ]1 Z. g6 {% i+ X' u( ? 9、备份域控制寄存器 (RCC_BDCR) ![]() 第0位LSEON:软件设置,外部低速振荡器使能:0:关闭,1:开启; & Y- X/ q2 Q2 o. u. R6 _ 第1位LSERDY:硬件指示,外部低速LSE就绪:0:未就绪,1:就绪; 第15位RTCEN:RTC时钟使能:0:关闭,1开启;$ V; n2 I# _* {, c' M 10、控制/状态寄存器(RCC_CSR) J G$ O, K. a' }0 X& A * A" K- F3 T, d7 X7 L: Y, J ![]() - O8 j0 G' a! `+ H 第0位LSION:软件设置,内部低速振荡器就绪:0,:40kHz振荡器时钟就绪: M6 b. }1 ^0 a# m# i$ R 第1位LSIRDY:硬件指示,内部低速振荡器就绪:1:就绪,0:未就绪;& O! E* L, G7 `! Z * v7 v% l9 {" ]' ?; h. ^% j 第29位IWDGRSTF窗口看门狗复位标志:1:发生窗口看门狗复位;0:未发生 第30位WWDGRSTF独立看门狗复位标志:1:发生独立看门狗复位;0:未发生2 y/ J$ ~9 g( o, J' V/ B 2 N W' E7 }) h6 E6 l- V! _% f 主要相关库函数: # c3 t" N: w/ D: ` 1、void RCC_DeInit(void);//将外设RCC寄存器设为缺省值; ' s" n0 h3 z+ S, Y. n; d 2、void RCC_HSEConfig(uint32_t RCC_HSE);//设置外部高速晶振(HSE); l5 O* Q, x' M, G6 r1 G' k7 q* R 3、void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);//调整内部高速晶振(HSI)校准值% @+ X; ]. u* W- g6 I0 x- i 4、void RCC_HSICmd(FunctionalState NewState);//使能或者失能内部高速晶振(HSI)8 u0 O! m; S' I, C, m 5、void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);//设置PLL时钟源及倍频系数 6、void RCC_PLLCmd(FunctionalState NewState);//使能或者失能PLL 7、void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//设置系统时钟(SYSCLK)源 8、void RCC_HCLKConfig(uint32_t RCC_SYSCLK);//设置AHB时钟(HCLK): d+ G, B: v+ b 9、void RCC_PCLK1Config(uint32_t RCC_HCLK);//设置低速AHB时钟(PCLK1) * O- e8 D% R9 N9 u2 f* D5 J 10、void RCC_PCLK2Config(uint32_t RCC_HCLK);//设置高速AHB时钟(PCLK2)! @# ]6 V. p! ?# n: R . l4 D5 H# j7 N) l+ _ 11、void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);//使能或者失能指定的RCC中断 12、 void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);//设置USB时钟(USBCLK)7 f p3 P! n4 I/ Y9 F$ Y: m & G+ s7 P7 Q1 G) {8 ^8 N1 ~2 p 13、void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//设置ADC时钟(ADCCLK) 14、void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//使能或者失能AHB外设时钟 15、void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//使能或者失能APB2外设时钟3 P0 l: A" L2 V2 R) O1 n 16、void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//使能或者失能APB1外设时钟 9 t% @' J3 X6 r5 Y. T- w2 L; c 17、void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//强制或者释放高速AHB外设复位 18、void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//强制或者释放高速APB(APB2)外设复位 19、void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//强制或者释放低速APB(APB1)外设复位0 i3 d5 |. k) C( c1 S; W; Y* {# d 20、void RCC_ClockSecuritySystemCmd(FunctionalState NewState);//使能或者失能时钟安全系统" D0 Y+ Q; j% O8 z8 O+ a9 e/ s 21、void RCC_MCOConfig(uint8_t RCC_MCO);//选择在MCO管脚上输出的时钟源,警告:当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。 22、FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//检查指定的RCC标志位 2 s6 [$ i) o& L+ e3 F //RCC_FLAG_HSIRDY ,HSI晶振就绪;RCC_FLAG_HSERDY ,HSE晶振就绪; 8 G( K4 R9 [2 h" u //RCC_FLAG_PLLRDY ,PLL就绪;RCC_FLAG_LSERDY ,LSI晶振就绪;$ H5 V6 q* @$ ~" o: k4 P7 K* ~) ? //RCC_FLAG_LSIRDY ,LSE晶振就绪;RCC_FLAG_PINRST ,管脚复位 ;( `- F- n5 B1 z- K2 q , [& v& `( H' T; n0 f5 V+ A //RCC_FLAG_PORRST ,POR/PDR复位;RCC_FLAG_SFTRST ,软件复位 ;3 T% j! Y& r4 z( ~. Q- r5 } //RCC_FLAG_IWDGRST ,IWDG复位;RCC_FLAG_WWDGRST ,WWDG复位; * F) {4 U* K( D3 `$ t9 g* P //RCC_FLAG_LPWRRST ,低功耗复位 9 _6 @2 a( X7 w% P 23、void RCC_ClearFlag(void);//清除RCC的复位标志位 0 {$ d+ V) @0 m$ F. a, ` 24、ITStatus RCC_GetITStatus(uint8_t RCC_IT);//检查指定的RCC中断发生与否& P# U' o0 M' p0 b //输入:RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断 5 @% J9 G% p, {4 N //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断 ! o% j, ~! e+ D% h9 t: o9 F //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断" X' S4 q/ t: A0 a2 F% [ - ^" n. L0 N5 M7 F6 n- [ 25、void RCC_ClearITPendingBit(uint8_t RCC_IT);//清除RCC的中断待处理位, H5 K: D2 L. |3 M; N" u9 H ; c3 R7 j4 p) j6 D //RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断 ( P& c; `# a9 w //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断3 i0 W! K0 K( v' ~& k 7 R! Z' r7 w p J. [$ x( K3 q //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断. ~9 m9 J3 m! }4 p( L( l* Q8 G( U |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数