
STM32f1时钟系统 一、祭出STM32F1的官方时钟框图 ; i% F; p d) @$ Y; B D+ M ![]() ![]() ( G5 b0 D, x, {$ A2 t 4 E) i5 x1 D I4 i; X 二、寄存器说明: c( a7 v' |$ ^+ l$ \; m 1、时钟控制寄存器RCC_CR 7 p3 F+ D% C4 M/ A3 j ![]() # i: @& g$ ^ f3 {5 B/ K5 J 第0位:HSION(0,关闭;1,开启) 第1位:HSIRDY(0,HSI未就绪;1,HSI就绪) " K# _3 @9 N. R* T. M3 g# j 第16位:HSEON(0,关闭;1,开启) 1 y$ o" _" _% s3 E 第17位:HSERDY(0,HSE未就绪;1,HSE就绪) 第19位:CSSON(0,时钟检测关闭;1,时钟监控开启) 第24位:PLLON(0,关闭PLL;1,使能PLL)! Y# n! d. _- _1 O2 T 3 \ G) N- _, n# P 第25位:PLLRDY(0,PLL未锁定,1:PLL锁定) 0 x1 Q* }1 t6 Q 2、时钟配置寄存器RCC_CFGR ![]() 0 g' c: e2 H" x% R3 Z3 `2 u ![]() & G8 u* C- R% ?1 Y) w 7 f1 m W9 ~+ S' ^* I9 }; W- v( ? 第1:0位SW: 软件设置时钟源 00:HSI为系统时钟 $ Q, N3 i, o1 u+ A9 O" m 01:HSE为系统时钟5 K$ N* x9 d$ R0 O 10:PLL作为系统时钟 & g& F" W7 G* n' }! c! I 11:时钟不可用- Y3 M" n9 v- ]! c2 Z$ i3 J" a) l- i 5 G4 b+ S9 Z5 W$ S5 r' R 第3:2位SWS:硬件指示时钟源/ t* p5 ?8 y2 t' E$ H 00:HSI为系统时钟 & y: h* p6 x% T. D 01:HSE为系统时钟 10:PLL作为系统时钟; H) }1 l" w9 r. j, {) Z, @ 11:时钟不可用! }) g6 H. v3 `6 v O " k7 W/ T* r1 K, E 第7:4位HPRE:软件设置AHB的分频系数(具体见参考手册) ![]() % x: F( p0 b$ x# F3 q 第10:8位PPPRE1:软件设置低速APB1(PCLK1)的与分频系数(具体见参考手册) " R& Z, b& l( y* B; e8 V ![]() 第13:11位PPPRE2:软件设置高速APB2(PCLK2)的预分频系数(具体见参考手册) 8 C. r* n: P: H6 O4 T* s% e ![]() 第15:14位ADCPPE:软件设置ADC的时钟频率(最大14Mhz)7 O- u( _7 s# g1 O# f ![]() # O# v/ A1 T E6 ~0 ]9 ]$ |; b 00:APB2的2分频 01:APB2的4分频 % `7 G% A' V+ C2 W1 ? 10:APB2的6分频 11:APB2的8分频 4 Y D+ c$ y3 P 第16位PLLSRC:软件选择PLL的时钟源(关闭PLL时写入) ![]() # P% F. O c, j* k Q% O% I+ o% \- P 0:HSI的2分频作为PLL的输入时钟 1:HSE作为PLL的输入时钟9 i A/ n+ D4 j: y6 I3 D, E 第17位PLLXTPRE:软件选择HSE作为PLL输入时是否分频 ( i$ L) y8 v4 n, f: T/ H 0:HSE不分频 1:HSE 2分频# t8 E5 D% |1 h% L* Z7 x0 B( Q 第21:18位PLLMUL:软件设置PLL的倍频系数(最高不超过72M,实测超过100M后还能工作)' d" ^% v0 k; h$ r# k6 o 1 L4 N) _. {- Y9 K4 Z; q2 ] ![]() 详见参考手册 ' F& x! ^+ d7 t/ j( {. Q" D 第22位USBPRE:软件设置USB时钟 4 Z1 A" L: ?3 M$ N1 H G; f ![]() 0:PLL时钟1.5倍分频作为USB时钟0 v% V; {4 ?; s$ _$ M( | + C$ K6 @0 T1 D 1:PLL直接作为USB时钟 第26:24位MCO:时钟输出PA8引脚(对于STM32F1来说,最高频率不能超过IO口的频率50Mhz) ! L& i& H$ k, f% A 8 j7 ~( o+ {4 q, o Z) m 0xx:无输出; ~4 l4 D0 n7 h( t, \1 g, V0 t 100:输出系统时钟SYSCLK& F" b6 o- `, ]! f - u. L& j8 ?& L: ~ 101:HSI输出* g* {' V4 S8 [ 6 I! {- w! f3 r8 y# z 110:HSE输出 111:PLL的2分频输出 ( @9 I/ _- B, ^6 p 3、时钟中断寄存器RCC_CIR# F" G4 p$ O/ h. s9 y3 x 4 b. }5 Z* |: P3 T" b* ` 4、APB2外设复位寄存器(RCC_APB2RSTR)2 }7 ~& n5 V7 f- ?4 i( p1 y4 l6 q; K" M ) V% k ? ] c 对应位写1复位相应外设,写0无作用 ![]() 2 l$ [' e( X7 _5 V" H3 K: s3 x& D 5、APB1 外设复位寄存器 (RCC_APB1RSTR) % r! S4 J/ S' H, x" f" l 对应位写1复位相应外设,写0无作用 / m2 q. H5 j; }* P ![]() , H# }" V. @- K: C0 A 6、 AHB外设时钟使能寄存器 (RCC_AHBENR) - d2 m) Z' B" p! d. ^ 对应位写1开启相应外设,写0关闭外设9 o9 A7 A9 `0 p( x1 f! ` " Q* r; l: w7 `( x/ ~; F 7、 APB2 外设时钟使能寄存器(RCC_APB2ENR) 对应位写1开启相应外设,写0关闭外设 5 d y. X7 G+ r* z 8、 APB1 外设时钟使能寄存器(RCC_APB1ENR)" X B# q, M& t 对应位写1开启相应外设,写0关闭外设 - [- W# M" Z# v6 | X2 r& M$ K. o 9、备份域控制寄存器 (RCC_BDCR)7 c& F' R' w5 e' w# P ![]() $ ^* x: V0 z4 f0 {" a 第0位LSEON:软件设置,外部低速振荡器使能:0:关闭,1:开启; 第1位LSERDY:硬件指示,外部低速LSE就绪:0:未就绪,1:就绪;8 B0 X+ ~5 o2 G 第15位RTCEN:RTC时钟使能:0:关闭,1开启; 10、控制/状态寄存器(RCC_CSR) ![]() , U! b4 f; v/ Q+ m5 m 第0位LSION:软件设置,内部低速振荡器就绪:0,:40kHz振荡器时钟就绪5 f8 q0 T, J, x' ~ 第1位LSIRDY:硬件指示,内部低速振荡器就绪:1:就绪,0:未就绪;6 S4 g; @/ w% L 1 W' o+ t( Q% n: ^4 w 第29位IWDGRSTF窗口看门狗复位标志:1:发生窗口看门狗复位;0:未发生7 C6 b% Y, @- F- ^ 8 `" D# i+ G* g 第30位WWDGRSTF独立看门狗复位标志:1:发生独立看门狗复位;0:未发生 1 h( v# J/ j+ f1 R 主要相关库函数: 1、void RCC_DeInit(void);//将外设RCC寄存器设为缺省值; 2、void RCC_HSEConfig(uint32_t RCC_HSE);//设置外部高速晶振(HSE);( @; x7 G! ]5 I" G 3、void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);//调整内部高速晶振(HSI)校准值- `8 }/ o4 D4 W( H$ a) a6 M* d/ b' Q5 M . D9 U- Y6 I( ]- @/ @ 4、void RCC_HSICmd(FunctionalState NewState);//使能或者失能内部高速晶振(HSI) 2 ^# L6 m1 G. K 5、void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);//设置PLL时钟源及倍频系数( u& ?+ V* w+ l1 x+ e- F 0 E" _+ Y. l$ i }, n 6、void RCC_PLLCmd(FunctionalState NewState);//使能或者失能PLL 7、void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//设置系统时钟(SYSCLK)源) Z* h3 G/ l/ \9 m % _4 w: `7 x8 b3 X% D 8、void RCC_HCLKConfig(uint32_t RCC_SYSCLK);//设置AHB时钟(HCLK) 9、void RCC_PCLK1Config(uint32_t RCC_HCLK);//设置低速AHB时钟(PCLK1) 1 T$ u8 s# M( q 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) 13、void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//设置ADC时钟(ADCCLK) 14、void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//使能或者失能AHB外设时钟7 O7 h( _. o/ |- ] " S1 u2 F+ D3 s5 G 15、void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//使能或者失能APB2外设时钟 16、void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//使能或者失能APB1外设时钟2 M' f ~( F" k/ D5 v! g6 T % z' _0 }1 p, }7 C 17、void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//强制或者释放高速AHB外设复位 " Z/ Q% @2 r# k5 q' ?( n 18、void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//强制或者释放高速APB(APB2)外设复位, m. {/ A" B1 L5 r 19、void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//强制或者释放低速APB(APB1)外设复位) H$ ]9 i9 l: i* c" {% ]* ]( w6 a 20、void RCC_ClockSecuritySystemCmd(FunctionalState NewState);//使能或者失能时钟安全系统 21、void RCC_MCOConfig(uint8_t RCC_MCO);//选择在MCO管脚上输出的时钟源,警告:当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。 , r, u$ r. ?* t9 u5 ` 22、FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//检查指定的RCC标志位3 K, p1 n, f, j n //RCC_FLAG_HSIRDY ,HSI晶振就绪;RCC_FLAG_HSERDY ,HSE晶振就绪;1 e5 ]6 A5 o4 R; o# p$ V: U- i 7 A. E( s& e% h5 ]! Q3 K //RCC_FLAG_PLLRDY ,PLL就绪;RCC_FLAG_LSERDY ,LSI晶振就绪;3 a7 S X/ I; |( E8 u" T# Q " g4 V) K; Z* Q$ V) l2 C6 e //RCC_FLAG_LSIRDY ,LSE晶振就绪;RCC_FLAG_PINRST ,管脚复位 ; 3 W8 q+ M4 M4 e9 @% R //RCC_FLAG_PORRST ,POR/PDR复位;RCC_FLAG_SFTRST ,软件复位 ; 7 T- [/ Y' Y; k y9 ^/ E* ~9 i- m //RCC_FLAG_IWDGRST ,IWDG复位;RCC_FLAG_WWDGRST ,WWDG复位;2 y( D8 ^! W ?. i& D$ Q / K( i! s" ~: L //RCC_FLAG_LPWRRST ,低功耗复位% a8 {. q2 i- ~: ^! E$ ]6 L 0 r: K1 t+ I7 e7 E# u. l 23、void RCC_ClearFlag(void);//清除RCC的复位标志位5 t, E: u/ S" @( w# \% h2 | 24、ITStatus RCC_GetITStatus(uint8_t RCC_IT);//检查指定的RCC中断发生与否& e, \! k) |% c1 b. d //输入:RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断 1 F7 c+ }% D8 S% X1 E/ G$ R //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断 8 H1 k f" N9 {" V //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断' x* b, ^! ] e9 c! ^9 i: M 25、void RCC_ClearITPendingBit(uint8_t RCC_IT);//清除RCC的中断待处理位1 z, S5 T4 u1 B; s; {* j g3 F. U! H2 {% B C. R/ { //RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断" x# Q- I+ y; |1 b+ J //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断 - i# ]* x# V2 W8 p8 b! \ //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断 ' t0 i8 U3 b1 D / ~, p. P1 X! ]9 e; W/ X) T6 |" K |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数