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

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

[复制链接]
STMCU小助手 发布时间:2022-2-3 18:00
RCC(Reset Clock Controller) —— 复位与时钟控制
0 P: I/ u4 s5 y1 Z, g2 S一、复位/ u1 y+ h  Z; y
STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。
系统复位:除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统
; |" O6 H9 p( _9 i, v( h  w复位将复位所有寄存器至它们的复位状态。
电源复位:将复位除了备份区域外的所有寄存器。  
6 M$ F! ?, q( M1 ^/ J
备份区域复位:备份区域拥有两个专门的复位,它们只影响备份区域。
: e2 f: c& r& I5 K
1205648-20171105093228295-994988143.png
* t: g# `% Y9 C! Z
- x8 g$ c, d1 ?% d二、时钟
有四种时钟:高速外部时钟信号(HSE)—— HSE外部晶体/陶瓷谐振器 、HSE用户外部时钟
      高速内部时钟信号(HSI)—— 由内部8MHz的RC振荡器产生% h* b" r- y3 P; F, z# V5 w
      低速外部时钟信号(LSE)—— 32.768kHz的低速外部晶体或陶瓷谐振器7 ~4 d. v& R5 C. S/ G7 ?( J1 o
      低速内部时钟信号(LSI)—— LSI时钟频率大约40kHz(在30kHz和60kHz之间)
" r0 Y* w, g$ w1 d. \8 r1 x1 z
时钟的输出:微控制器允许输出时钟信号到外部MCO引脚。 可以时钟配置寄存器来选择输出的时钟。
& b9 c6 S: w$ C9 v$ a; w2 m: e
" w' e! L7 h( g+ \, a+ @( o
1205648-20171105094626920-643991666.png $ A" |4 n4 B8 i6 z' Q/ v
* U7 U# f% b' S+ B; ^
其中:
PLLMUL 用于设置 STM32 的 PLLCLK, STM32 支持 2~16 倍频设置。我们常用. n1 t& \6 v+ [8 a- h3 B
的是 8M 外部晶振+9 倍频设置,刚好得到 72Mhz 的 PLLCLK。
SW 是 STM32 的 SYSCLK(系统时钟)切换开关,从上图可以看出, SYSCLK 的
9 d- b! g/ L: s3 K来源可以是 3个:HSI、PLLCLK和 HSE。
CSS是时钟安全系统,可以通过软件被激活。一旦其被激活,时钟监测器将在HSE振荡器启动延迟后被" T" b, K* k4 ~# I4 e
使能,并在HSE时钟关闭后关闭 。
' n( C2 X) R, K5 W: R/ r
  u1 \3 }7 V. V4 N. c
三、时钟启动过程
1、开机或复位时使用内部时钟
* O  Y7 k  U4 Q# ?& y7 h2、用软件进行切换,尝试开启外部时钟
3 S/ p5 n$ f5 F: t7 T& ]3、如果开启成功,则使用外部时钟,否则使用内部
+ o- U* c! ]( _
四、配置时钟的步骤
1、APB1、APB2的外设接口复位结束(即RESET),关闭APB1、APB2的外设时钟 # P7 A& j- w  e0 p2 e3 {5 w& a$ j
  打开内部8MHz振荡器,复位RCC->CFGR中的SW[1:0]、HPRE[3:0]、PRE1[2:0]、PRE2[2:0]、ADCPRE[2:0]、MCO[2:0]9 L  {4 J5 f# i' U: W1 s
  复位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、打开要使用的外设时钟

4 }# b2 M9 t0 F; g( F/ `* e9 R+ o五、代码5 _6 h: n& B4 G# H; G
  1. void RCC_Init(void)
    ! U( A' A8 C( ?/ r7 ?% L
  2. {4 k! ]$ d# u/ z( O& y
  3.     RCC->APB1RSTR = 0x00000000;   //APB1、APB2复位结束1 \! [- A+ H% }5 X' Y( G
  4.     RCC->APB2RSTR = 0x00000000;
    $ i8 z: ^% S% z/ x
  5.     RCC->AHBENR   = 0x00000014;   //睡眠模式时闪存和 SRAM 时钟使能,其他关闭(其实可以注释掉,因为AHBENR复位的值就是该值)3 J6 G+ R( m' f) Z, W
  6.     RCC->APB1ENR  = 0x00000000;   //关闭APB1、APB2的外设时钟# C/ Y2 M- g, Z9 S* y/ X
  7.     RCC->APB2ENR  = 0x00000000; # g1 ~, a; v; Q
  8. $ \" f% J: Y* w0 o, l2 P8 n7 N, x9 G
  9.     RCC->CR      |= 0x00000001;   //使能内部时钟HSI: N( {5 }! I5 f: _% j' ?: ]3 n7 z- d
  10.     RCC->CFGR    &= 0xF8FF0000;   //复位RCC->CFGR中的SW[1:0],HPRE[3:0],PRE1[2:0],PRE2[2:0],ADCPRE[2:0],MCO[2:0]$ j/ b$ l& @4 l0 P2 A
  11.     RCC->CR      &= 0xFEF2FFFF;   //复位HSEON、CSSON、PLLON、HSEBYP
    ; C* X( _. u' R2 e/ V& r
  12.     RCC->CFGR    &= 0xFF80FFFF;   //复位RCC->CFGR中的PLLSRC,PLLXTPRE,PLLMUL[3:0],USBPRE
    - {: }4 [& p0 E' W  Q4 g8 @! F
  13.     RCC->CIR     &= 0x00000000;   //关闭所有中断[12:0]
    # c5 M( G6 ?8 J7 ]' J* |

  14. & ~/ M, k% S' ?1 A" Q8 g
  15.     RCC->CR      |= (1<<16);      //使能HSE
    + s8 s. p! S4 y
  16.     while(!(RCC->CR & (1<<17)));  //等待HSE稳定6 |, e- c# _3 B3 X- y# r) `: Y. w
  17. 4 Y" N+ s( F$ M: l& _
  18.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);          // 预取指缓存使能8 F* O+ c) _; n  W* _+ S9 v
  19.     FLASH_SetLatency(FLASH_Latency_2);                             //FLASH_Latency_2  2延时周期; J( W' o* A$ `4 w3 I- u" d
  20. 0 l- E* R: a" Q
  21.     RCC->CFGR    |= 0x00000400;      //AHB不分频,APB1二分频,APB2不分频
    3 c9 A  A$ y% |9 D9 K
  22.     RCC->CFGR    |= 0x001D0000;      //配置PLL:HSE为输入时钟,HSE不分频,9倍频输出+ d7 Z+ G& g# q- E6 F
  23.     RCC->CR      |= (1<<24);         //使能PLL+ ?6 V+ }: n( a' f5 A5 k5 B
  24.     while(!(RCC->CR & (1<<25)));     //等待PLL锁定- o' `( A1 }  U/ o; G

  25. $ P! S4 H2 B1 h, |# `" E# f
  26.     RCC->CFGR    |= 0x00000002;      //选择PLL输出作为SYSCLK
    " Z4 Y4 `6 u7 C# u- w" v' ]2 K
  27.     while(!(RCC->CFGR & (2<<2)));    //等待 PLL 作为系统时钟设置成功1 T7 j' ^9 E3 h; V

  28. 0 `/ _- V7 b1 e5 {9 d, c
  29.     //下面就是打开所要用的外设时钟(RCC_AHBENR、RCC_APB1ENR、RCC_APB2ENR). P0 x5 ^  ~  a" F! T* n
  30. }
复制代码

% b$ b# g* M4 J$ z  e$ M, R" o3 ~/ b
仿真结果为:
1205648-20171105181231232-279836018.png " c) U* N. _1 e

7 y0 Y$ D9 X& l% b$ f& F) _
收藏 评论0 发布时间:2022-2-3 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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