STM32f1时钟系统( m$ Q% t( k: }; r3 M% W5 J( D 4 O6 M& u& X( [; T/ {8 Y ? 一、祭出STM32F1的官方时钟框图 二、寄存器说明 : K: c1 I# |" U( i 1、时钟控制寄存器RCC_CR 第0位:HSION(0,关闭;1,开启)! g! I6 w/ E6 C9 U/ l; T $ O9 ^) w: M: q8 s C" P: o 第1位:HSIRDY(0,HSI未就绪;1,HSI就绪) 第16位:HSEON(0,关闭;1,开启) * O3 y2 c Z' z2 k! F 第17位:HSERDY(0,HSE未就绪;1,HSE就绪)! Q- C6 f1 k# ?2 @6 w 第19位:CSSON(0,时钟检测关闭;1,时钟监控开启) 第24位:PLLON(0,关闭PLL;1,使能PLL)# ]" K: r4 N9 U: x 0 X2 v6 D$ z1 f7 C/ T9 G 第25位:PLLRDY(0,PLL未锁定,1:PLL锁定) " i( _$ N3 }0 P 1 [/ R, t: Z0 y1 I, W& |7 q 2、时钟配置寄存器RCC_CFGR% u( R" R u2 h/ {' W 5 O% y* H2 d3 L& s 第1:0位SW: 软件设置时钟源 00:HSI为系统时钟 - @1 c6 |! f) x) ?" K/ m( y2 u' k1 E 6 J6 n8 l6 ?- G- x; a 01:HSE为系统时钟8 p4 r! V8 T2 Y$ ?( l* \1 R 6 v2 v2 Y/ x2 B 10:PLL作为系统时钟: u* D+ Z' g3 C' _ 11:时钟不可用: g9 R& ~! b4 J6 F. o - k6 p) }: z- u 第3:2位SWS:硬件指示时钟源 00:HSI为系统时钟 8 I( x9 _) A9 z! j; s 01:HSE为系统时钟: m: l' A4 y. C6 f: G 10:PLL作为系统时钟 11:时钟不可用1 o1 [+ z' }+ r: X! A3 |' m 2 u6 Y" |& ~- E& a4 L+ X' U 第7:4位HPRE:软件设置AHB的分频系数(具体见参考手册)" M- }$ F& ]6 }# d- q% i, e 第10:8位PPPRE1:软件设置低速APB1(PCLK1)的与分频系数(具体见参考手册)) B, E. b0 I5 u+ M9 T1 L" w N4 M1 g) n' o& C$ F- y 第13:11位PPPRE2:软件设置高速APB2(PCLK2)的预分频系数(具体见参考手册)8 M" w) \% o( n1 m, ^( X2 n : Z$ A1 N: V0 F 第15:14位ADCPPE:软件设置ADC的时钟频率(最大14Mhz)8 D' J0 _( V `' e 6 e$ H! d! U4 p) k9 v 00:APB2的2分频* F: ~* `4 q; v) X5 U; T 01:APB2的4分频 / ^* M* x# `+ J 10:APB2的6分频 _0 y# D. a1 R6 e+ s ( X7 d- z2 j$ x% ` 11:APB2的8分频$ d, |* w0 p/ ~9 T# |3 D1 P 0 q$ O; D% U* u c 第16位PLLSRC:软件选择PLL的时钟源(关闭PLL时写入) 0:HSI的2分频作为PLL的输入时钟 1:HSE作为PLL的输入时钟( ^ L) e3 L+ ?2 r , N$ R" ~3 M# R: Z. K" d 第17位PLLXTPRE:软件选择HSE作为PLL输入时是否分频 . v% p9 I5 u$ a# ?3 ?" `5 h: \7 P' Q8 j - i" F; O1 ^8 [: q- | 0:HSE不分频 1:HSE 2分频9 F/ b! Z- h& A 第21:18位PLLMUL:软件设置PLL的倍频系数(最高不超过72M,实测超过100M后还能工作) 8 K% A8 o9 c$ r* V 详见参考手册 第22位USBPRE:软件设置USB时钟* Q. L) a0 W9 M 8 i* n' ^9 j# w( E. x : R6 D/ _& V" ?, Q 0:PLL时钟1.5倍分频作为USB时钟 9 Z$ F# O0 o* @/ ]4 b" i 1:PLL直接作为USB时钟1 p0 U% s2 X3 T2 j( Z 9 |1 O" r5 K/ Q6 N3 ^$ O4 X3 C& d 第26:24位MCO:时钟输出PA8引脚(对于STM32F1来说,最高频率不能超过IO口的频率50Mhz)1 Y) V& v2 l5 c# J# N 5 ^$ T8 ~9 P7 t, @8 Y9 | 0 w$ S5 n+ b. D# g: q 0xx:无输出- X9 c% I, n" C$ j# o* b, C % D w1 _: B& q, ~3 H" ]1 ` 100:输出系统时钟SYSCLK 101:HSI输出$ Z9 b ?9 [* W6 P1 l 3 o. t8 E- g1 Y; }/ {) B0 B; _0 } 110:HSE输出5 O. G- N) n4 [7 R" i2 x 111:PLL的2分频输出2 j8 e; k' f, H $ I( k2 v4 F" r+ F 3、时钟中断寄存器RCC_CIR. i2 `( h" R0 i9 n0 p0 B* U4 o) o : I; ~6 [* ^5 F2 h 4、APB2外设复位寄存器(RCC_APB2RSTR) 对应位写1复位相应外设,写0无作用 3 c# L K& n B* ~* D 5、APB1 外设复位寄存器 (RCC_APB1RSTR)8 ~) T7 G' V0 j! s , U5 H# E) G) X( D7 x5 y 对应位写1复位相应外设,写0无作用 4 w% p6 y% W4 |2 h4 E5 I8 f! v 6、 AHB外设时钟使能寄存器 (RCC_AHBENR) 对应位写1开启相应外设,写0关闭外设 * m3 T6 g1 A3 S% ]: V 3 ^) ^# {7 R$ P! e. y$ y+ F2 | 7、 APB2 外设时钟使能寄存器(RCC_APB2ENR)+ V4 L A% _+ [8 x # K! V. f% J+ k5 V! k2 \8 | 对应位写1开启相应外设,写0关闭外设 + }: u+ |3 c. K 3 d* D% _+ d1 j: P: p4 M & H0 ?& k) o7 }8 v5 o 8、 APB1 外设时钟使能寄存器(RCC_APB1ENR)# W0 L j* N' h - }. d9 v9 C# c1 ] 对应位写1开启相应外设,写0关闭外设: H6 P& z/ ]4 a$ F, x 1 V# y4 X7 _) V3 k3 z 9、备份域控制寄存器 (RCC_BDCR) / {% V1 b& r. |0 b- ?1 m0 o / I3 }2 s; M2 n 第0位LSEON:软件设置,外部低速振荡器使能:0:关闭,1:开启;) @" g6 P2 `. @: X0 ?6 W' ?$ j 第1位LSERDY:硬件指示,外部低速LSE就绪:0:未就绪,1:就绪;% B9 H) b8 u0 J- [/ |/ v) | 第15位RTCEN:RTC时钟使能:0:关闭,1开启; 10、控制/状态寄存器(RCC_CSR). B4 M5 m" r z4 {& t . _( I( }; F1 \( r6 A 第0位LSION:软件设置,内部低速振荡器就绪:0,:40kHz振荡器时钟就绪) h3 J9 `4 _ z) p* ~: b3 d 第1位LSIRDY:硬件指示,内部低速振荡器就绪:1:就绪,0:未就绪; # W% _4 l6 h8 p4 o* _$ }9 d7 b 第29位IWDGRSTF窗口看门狗复位标志:1:发生窗口看门狗复位;0:未发生/ N1 x9 p1 q, N6 a6 {4 ]" F 第30位WWDGRSTF独立看门狗复位标志:1:发生独立看门狗复位;0:未发生 + @! y5 `* E1 e 主要相关库函数:! t* k( B2 e+ [ 5 L% N* I! b1 P' H$ F% F+ v7 [) Z 1、void RCC_DeInit(void);//将外设RCC寄存器设为缺省值;, b, | }# v& @6 P 2、void RCC_HSEConfig(uint32_t RCC_HSE);//设置外部高速晶振(HSE); 3、void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);//调整内部高速晶振(HSI)校准值 4 O/ f+ w; g* }" j m: q 4、void RCC_HSICmd(FunctionalState NewState);//使能或者失能内部高速晶振(HSI) 5、void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);//设置PLL时钟源及倍频系数 6、void RCC_PLLCmd(FunctionalState NewState);//使能或者失能PLL ! D3 M" [% e* G9 ?$ n 7、void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//设置系统时钟(SYSCLK)源9 M" ~3 T5 x% v/ h7 |! P 8、void RCC_HCLKConfig(uint32_t RCC_SYSCLK);//设置AHB时钟(HCLK)6 u: l- E1 i0 W. N; R0 P& B ]; S 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中断 7 }! ?! D4 k- {: j+ F 12、 void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);//设置USB时钟(USBCLK)5 y% m2 R/ Z p; x , k; w8 b y w6 x1 I$ ] 13、void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//设置ADC时钟(ADCCLK) 14、void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//使能或者失能AHB外设时钟 8 e1 V: t4 O+ _# E- Z 15、void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//使能或者失能APB2外设时钟; ~$ T/ N/ |# y3 p 16、void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//使能或者失能APB1外设时钟 # _, D6 M b7 b& ] 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)外设复位! L' C) g6 m( f- c4 ~ * i0 { d& D. D* U- v 20、void RCC_ClockSecuritySystemCmd(FunctionalState NewState);//使能或者失能时钟安全系统 ; d0 y/ r: D1 m$ a/ \ 21、void RCC_MCOConfig(uint8_t RCC_MCO);//选择在MCO管脚上输出的时钟源,警告:当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。 22、FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//检查指定的RCC标志位1 E |- A* M9 m9 v. ^$ k+ I ~0 e //RCC_FLAG_HSIRDY ,HSI晶振就绪;RCC_FLAG_HSERDY ,HSE晶振就绪; / l, F7 e: p3 Y$ Y$ A2 W* `' L4 C //RCC_FLAG_PLLRDY ,PLL就绪;RCC_FLAG_LSERDY ,LSI晶振就绪; //RCC_FLAG_LSIRDY ,LSE晶振就绪;RCC_FLAG_PINRST ,管脚复位 ;7 P% Y4 I7 W$ m3 o, R0 M1 K' K , ]3 L0 L+ k! c //RCC_FLAG_PORRST ,POR/PDR复位;RCC_FLAG_SFTRST ,软件复位 ; , }% e8 [7 B' b: p //RCC_FLAG_IWDGRST ,IWDG复位;RCC_FLAG_WWDGRST ,WWDG复位; //RCC_FLAG_LPWRRST ,低功耗复位" c. ^8 [$ W; q+ ^9 j' }/ _ 23、void RCC_ClearFlag(void);//清除RCC的复位标志位 ; h5 G6 m* T" O8 O5 l. D 24、ITStatus RCC_GetITStatus(uint8_t RCC_IT);//检查指定的RCC中断发生与否 //输入:RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断 //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断8 Q2 D8 `, d6 S: R$ i * Y6 Y+ E- ?. X3 V //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断+ p- X7 A- {6 z$ [ ] 25、void RCC_ClearITPendingBit(uint8_t RCC_IT);//清除RCC的中断待处理位 //RCC_IT_LSIRDY,LSI晶振就绪中断;RCC_IT_LSERDY,LSE晶振就绪中断( y b0 S; J6 n & z7 a# m% a0 h //RCC_IT_HSIRDY,HSI晶振就绪中断;RCC_IT_HSERDY,HSE晶振就绪中断 ! I6 _5 s/ }' R) L8 N //RCC_IT_PLLRDY,PLL就绪中断;RCC_IT_CSS,时钟安全系统中断 ) m( d+ }5 ^! z ^3 a# q- T |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数