你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】stm32之RCC寄存器学习

[复制链接]
STMCU小助手 发布时间:2022-2-3 18:00
RCC(Reset Clock Controller) —— 复位与时钟控制! w2 S: U9 [, P" i7 o: j1 w
一、复位1 ]7 _" P' H6 {
STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。
系统复位:除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统+ h7 \$ E/ q0 ?( v) m+ o
复位将复位所有寄存器至它们的复位状态。
电源复位:将复位除了备份区域外的所有寄存器。  * j/ `5 A5 H1 V9 M6 h9 s; q8 N
备份区域复位:备份区域拥有两个专门的复位,它们只影响备份区域。' ~, a$ S" p; w
1205648-20171105093228295-994988143.png % B  {* j! p6 f) Y/ ?
. k# ]* ]/ W4 q7 b; S( w# g, `& W7 s
二、时钟
有四种时钟:高速外部时钟信号(HSE)—— HSE外部晶体/陶瓷谐振器 、HSE用户外部时钟
      高速内部时钟信号(HSI)—— 由内部8MHz的RC振荡器产生
; x$ e$ p* W: \, }
      低速外部时钟信号(LSE)—— 32.768kHz的低速外部晶体或陶瓷谐振器
3 Z/ y( i) g7 o6 H. p) Y8 o
      低速内部时钟信号(LSI)—— LSI时钟频率大约40kHz(在30kHz和60kHz之间)
! |/ k8 i1 ~7 S! A
时钟的输出:微控制器允许输出时钟信号到外部MCO引脚。 可以时钟配置寄存器来选择输出的时钟。
' U6 P" Y5 \" x3 ^/ P- h

$ Q% j) [: j& t, w4 h9 C$ b6 F/ Y 1205648-20171105094626920-643991666.png , G, n+ m) g, `
5 v. `1 z* k7 ~! E$ P4 j
其中:
PLLMUL 用于设置 STM32 的 PLLCLK, STM32 支持 2~16 倍频设置。我们常用" I8 S; ?+ N. e1 F, {
的是 8M 外部晶振+9 倍频设置,刚好得到 72Mhz 的 PLLCLK。
SW 是 STM32 的 SYSCLK(系统时钟)切换开关,从上图可以看出, SYSCLK 的
5 Y5 B  w0 u; N) ^: |" p! `来源可以是 3个:HSI、PLLCLK和 HSE。
CSS是时钟安全系统,可以通过软件被激活。一旦其被激活,时钟监测器将在HSE振荡器启动延迟后被0 Y0 b# F/ K: V: T, d3 ?
使能,并在HSE时钟关闭后关闭 。
# K3 _6 E* P' v! a) w
2 ~2 h/ o% @% f5 a
三、时钟启动过程
1、开机或复位时使用内部时钟
0 f3 K& @7 x  z2、用软件进行切换,尝试开启外部时钟
6 l5 N8 h6 o( z: o! S5 j4 t/ d3、如果开启成功,则使用外部时钟,否则使用内部

  p; l9 M" y5 H8 A$ t四、配置时钟的步骤
1、APB1、APB2的外设接口复位结束(即RESET),关闭APB1、APB2的外设时钟
$ b% S& ^( C. i( |3 s
  打开内部8MHz振荡器,复位RCC->CFGR中的SW[1:0]、HPRE[3:0]、PRE1[2:0]、PRE2[2:0]、ADCPRE[2:0]、MCO[2:0]
* |- F. F+ ]: u$ R2 R5 K
  复位RCC->CR中的HSEON、CSSON、PLLON、HSEBYP
  复位RCC->CFGR中的PLLSRC、PLLXTPRE、PLLMUL[3:0]、USBPRE
  关闭RCC->CIR中的所有中断
2、使能外部高速时钟晶振HSE
3、等待外部高速时钟晶振工作稳定
4、设置AHB时钟的预分频(在这之前要先执行FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH))
5、设置APB1时钟的预分频
6、设置APB2时钟的预分频
7、设置PLL的时钟源以及PLL的倍频数,然后使能PLL
8、等待PLL工作稳定
9、选择SYSCLK的时钟源
10、判断PLL是否是系统时钟(若选择SYSCLK的时钟源是PLL的话)
11、打开要使用的外设时钟

* D# C# b! q+ x9 ^% q; O五、代码4 K9 R; }4 f+ U5 X
  1. void RCC_Init(void)& }3 W: D! E! h$ ~/ I
  2. {! a7 Z& x) w" k2 j
  3.     RCC->APB1RSTR = 0x00000000;   //APB1、APB2复位结束/ t5 @4 H" {1 ?* z6 [' ?
  4.     RCC->APB2RSTR = 0x00000000;
    / C0 U! U7 I4 I7 ~; D
  5.     RCC->AHBENR   = 0x00000014;   //睡眠模式时闪存和 SRAM 时钟使能,其他关闭(其实可以注释掉,因为AHBENR复位的值就是该值)4 Q0 g. x, c' ]' X
  6.     RCC->APB1ENR  = 0x00000000;   //关闭APB1、APB2的外设时钟. P0 s8 L$ j# d9 Y0 n
  7.     RCC->APB2ENR  = 0x00000000;
    9 q0 q- {* D& q/ r

  8. $ Z9 h# g6 R+ X0 W
  9.     RCC->CR      |= 0x00000001;   //使能内部时钟HSI
    + M. \3 Z5 \/ H$ Y6 G
  10.     RCC->CFGR    &= 0xF8FF0000;   //复位RCC->CFGR中的SW[1:0],HPRE[3:0],PRE1[2:0],PRE2[2:0],ADCPRE[2:0],MCO[2:0]- l; I6 f  c7 P
  11.     RCC->CR      &= 0xFEF2FFFF;   //复位HSEON、CSSON、PLLON、HSEBYP7 ~9 T* E2 p8 _2 ?4 p
  12.     RCC->CFGR    &= 0xFF80FFFF;   //复位RCC->CFGR中的PLLSRC,PLLXTPRE,PLLMUL[3:0],USBPRE7 n1 z7 B) p$ ?) {8 ~: c% z
  13.     RCC->CIR     &= 0x00000000;   //关闭所有中断[12:0]
    / @4 l$ ?& O- @$ I) J% ]# b
  14. 7 N! {! m) ~, o8 L
  15.     RCC->CR      |= (1<<16);      //使能HSE7 L( d* y8 }% n( a* U  a# h; g* x
  16.     while(!(RCC->CR & (1<<17)));  //等待HSE稳定9 O% V: r; }8 H1 _& C* W' ^) O

  17. 7 A6 B; J" x5 |; V' h$ I, Y. z
  18.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);          // 预取指缓存使能
    1 x9 ]6 t1 ~" n" D
  19.     FLASH_SetLatency(FLASH_Latency_2);                             //FLASH_Latency_2  2延时周期
    ' f+ Z4 X& R. p5 _3 y. L0 @
  20. 2 Z( \$ ^; F9 B* {6 [; Q: c- f
  21.     RCC->CFGR    |= 0x00000400;      //AHB不分频,APB1二分频,APB2不分频0 Y+ Y' G7 u+ ~: z+ h
  22.     RCC->CFGR    |= 0x001D0000;      //配置PLL:HSE为输入时钟,HSE不分频,9倍频输出: Z$ x" i) P. P; n  C
  23.     RCC->CR      |= (1<<24);         //使能PLL9 Y# K& f1 b# e- ]4 Q2 l
  24.     while(!(RCC->CR & (1<<25)));     //等待PLL锁定
    0 W% E  d9 a/ f8 |$ y  u% a

  25. / r& t: o( s' h" z& |" u
  26.     RCC->CFGR    |= 0x00000002;      //选择PLL输出作为SYSCLK% t8 x1 `% M6 z$ Q
  27.     while(!(RCC->CFGR & (2<<2)));    //等待 PLL 作为系统时钟设置成功
    9 t- W! w8 n1 P; [0 D( R# C
  28. . c5 |# }/ R- F3 l7 c8 b
  29.     //下面就是打开所要用的外设时钟(RCC_AHBENR、RCC_APB1ENR、RCC_APB2ENR)7 ^$ I2 O& r! s6 s+ n0 v1 E+ o. d* i, ^
  30. }
复制代码
/ x2 J+ R/ W, @! I7 {0 {
仿真结果为:
1205648-20171105181231232-279836018.png 5 {: }- e+ |1 M: i9 c5 S

& b; l' m8 c3 T. n2 n: R1 ~
收藏 评论0 发布时间:2022-2-3 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版