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

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

[复制链接]
STMCU小助手 发布时间:2022-2-3 18:00
RCC(Reset Clock Controller) —— 复位与时钟控制
4 H, t* M% S8 r一、复位
  K5 l1 B0 y  v$ k7 _9 U
STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。
系统复位:除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统
$ O3 K! N9 L+ Q复位将复位所有寄存器至它们的复位状态。
电源复位:将复位除了备份区域外的所有寄存器。  
3 r6 r7 \6 b; Y' U) u+ c7 `
备份区域复位:备份区域拥有两个专门的复位,它们只影响备份区域。
* l3 `& x' x% p6 Z2 F( O4 h5 ^
1205648-20171105093228295-994988143.png : @# ]: e1 g9 D/ B" p! }

" o8 v/ x/ L" I& _4 E) `二、时钟
有四种时钟:高速外部时钟信号(HSE)—— HSE外部晶体/陶瓷谐振器 、HSE用户外部时钟
      高速内部时钟信号(HSI)—— 由内部8MHz的RC振荡器产生& o4 z& n3 |2 c0 Y' t
      低速外部时钟信号(LSE)—— 32.768kHz的低速外部晶体或陶瓷谐振器/ E, l! x: ?! c+ b! c
      低速内部时钟信号(LSI)—— LSI时钟频率大约40kHz(在30kHz和60kHz之间)
% o) W4 m) N, {% L6 G
时钟的输出:微控制器允许输出时钟信号到外部MCO引脚。 可以时钟配置寄存器来选择输出的时钟。) Q1 K1 A' n% w6 f0 L5 r: d9 N

+ L+ j0 E3 _% a( K; H8 ~ 1205648-20171105094626920-643991666.png 0 r$ C# c( C3 [! O5 A9 r
) R( @/ }* P4 y4 u% A
其中:
PLLMUL 用于设置 STM32 的 PLLCLK, STM32 支持 2~16 倍频设置。我们常用
& u6 w7 |4 s1 @7 p0 D* [7 D的是 8M 外部晶振+9 倍频设置,刚好得到 72Mhz 的 PLLCLK。
SW 是 STM32 的 SYSCLK(系统时钟)切换开关,从上图可以看出, SYSCLK 的
4 {" y$ X, T, ]2 W8 M来源可以是 3个:HSI、PLLCLK和 HSE。
CSS是时钟安全系统,可以通过软件被激活。一旦其被激活,时钟监测器将在HSE振荡器启动延迟后被
1 N. u% y" o& z使能,并在HSE时钟关闭后关闭 。5 O: w( A/ T3 r$ m- s% U

$ U- O6 Q' Q/ ~2 K" r: G- d1 _
三、时钟启动过程
1、开机或复位时使用内部时钟. M1 x6 x+ B$ W. I5 Y6 ~" _7 ?
2、用软件进行切换,尝试开启外部时钟  L* \3 X0 P& ]; U9 o2 {5 Y+ b
3、如果开启成功,则使用外部时钟,否则使用内部
& U1 @4 f# y: ^# J7 h* D
四、配置时钟的步骤
1、APB1、APB2的外设接口复位结束(即RESET),关闭APB1、APB2的外设时钟 & H6 q; I& n) C% K( z
  打开内部8MHz振荡器,复位RCC->CFGR中的SW[1:0]、HPRE[3:0]、PRE1[2:0]、PRE2[2:0]、ADCPRE[2:0]、MCO[2:0]  P, h. |# H0 w6 u
  复位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、打开要使用的外设时钟

7 N* J, V  p8 Z五、代码
: m% X% f; e( i. j- t' z0 a
  1. void RCC_Init(void)  |9 v: {" G1 H5 x
  2. {
    " m! E6 `8 ~7 `4 G3 P
  3.     RCC->APB1RSTR = 0x00000000;   //APB1、APB2复位结束
    2 B; x& }4 G* D: `" E5 f
  4.     RCC->APB2RSTR = 0x00000000;% q! b8 d- w; T4 ~% W
  5.     RCC->AHBENR   = 0x00000014;   //睡眠模式时闪存和 SRAM 时钟使能,其他关闭(其实可以注释掉,因为AHBENR复位的值就是该值)
    - ~$ `+ G/ o1 f$ O" u6 k
  6.     RCC->APB1ENR  = 0x00000000;   //关闭APB1、APB2的外设时钟
    - A( S: W4 {1 E! f4 d4 ?
  7.     RCC->APB2ENR  = 0x00000000;
    : g6 n- y' U- w6 C
  8. ) M$ B# B; S1 u& d; t& _6 ~
  9.     RCC->CR      |= 0x00000001;   //使能内部时钟HSI+ R$ C6 P; Z) }7 _0 {( _" X; Z0 Y
  10.     RCC->CFGR    &= 0xF8FF0000;   //复位RCC->CFGR中的SW[1:0],HPRE[3:0],PRE1[2:0],PRE2[2:0],ADCPRE[2:0],MCO[2:0]
    0 M9 L1 l1 [. F3 S
  11.     RCC->CR      &= 0xFEF2FFFF;   //复位HSEON、CSSON、PLLON、HSEBYP+ o% Y4 @2 p: {& o" e3 I
  12.     RCC->CFGR    &= 0xFF80FFFF;   //复位RCC->CFGR中的PLLSRC,PLLXTPRE,PLLMUL[3:0],USBPRE
    ! D" m$ F' B  D8 I1 t# t! s) D
  13.     RCC->CIR     &= 0x00000000;   //关闭所有中断[12:0]( q5 R' {  T3 k+ ]  K
  14. 2 o+ K$ m6 E9 \6 W1 Y! f
  15.     RCC->CR      |= (1<<16);      //使能HSE
    ( `" V% J; m6 X& m5 M7 O* W' L
  16.     while(!(RCC->CR & (1<<17)));  //等待HSE稳定
    ! j# ^# Z" l* y, n
  17. . l+ ]  Z! Z6 ^. |4 k4 g
  18.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);          // 预取指缓存使能/ ~  v* k5 X, Q
  19.     FLASH_SetLatency(FLASH_Latency_2);                             //FLASH_Latency_2  2延时周期3 o  v& S" d1 ]. P( e

  20. 2 P) R( L0 ]# w- N
  21.     RCC->CFGR    |= 0x00000400;      //AHB不分频,APB1二分频,APB2不分频
    0 b# Q4 v1 Y$ x+ k% W
  22.     RCC->CFGR    |= 0x001D0000;      //配置PLL:HSE为输入时钟,HSE不分频,9倍频输出
    # Z( Y: @! E6 M7 V) @6 }" U# h
  23.     RCC->CR      |= (1<<24);         //使能PLL
    ( B/ ]# U2 z+ [, b# |  i
  24.     while(!(RCC->CR & (1<<25)));     //等待PLL锁定
    ( F/ e' `  `9 J. X0 G4 b

  25. 5 n" H* n: [! ?! K! h1 E! o
  26.     RCC->CFGR    |= 0x00000002;      //选择PLL输出作为SYSCLK
    + h5 u$ D: H" }; l* g0 F
  27.     while(!(RCC->CFGR & (2<<2)));    //等待 PLL 作为系统时钟设置成功
    % A5 ~9 T8 [4 G
  28. 5 I3 T+ u: V+ r2 Z) U: q) s
  29.     //下面就是打开所要用的外设时钟(RCC_AHBENR、RCC_APB1ENR、RCC_APB2ENR). Z" a: F1 P: W* Y4 c( \  h" s
  30. }
复制代码

  Q. I8 o. p% X9 C
仿真结果为:
1205648-20171105181231232-279836018.png
0 O  k; W: c/ l0 a( ~2 P% |5 }4 B( w. Q
赞 收藏 评论0 发布时间:2022-2-3 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版