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

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

[复制链接]
STMCU小助手 发布时间:2022-2-3 18:00
RCC(Reset Clock Controller) —— 复位与时钟控制
" S. s6 F% }' K, `一、复位
+ i/ d* V* J- c) h, z* v
STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。
系统复位:除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统
2 {4 s+ R0 Q) ~0 b/ B2 g复位将复位所有寄存器至它们的复位状态。
电源复位:将复位除了备份区域外的所有寄存器。  
' z* C1 N5 L! d
备份区域复位:备份区域拥有两个专门的复位,它们只影响备份区域。
( W- ?8 t# ~7 b7 f( R! Z- u7 ]
1205648-20171105093228295-994988143.png : [( a5 o6 c1 B$ H, C. o
' G& {# \; a7 w
二、时钟
有四种时钟:高速外部时钟信号(HSE)—— HSE外部晶体/陶瓷谐振器 、HSE用户外部时钟
      高速内部时钟信号(HSI)—— 由内部8MHz的RC振荡器产生* F( {$ U/ g/ h  q: z5 l4 b
      低速外部时钟信号(LSE)—— 32.768kHz的低速外部晶体或陶瓷谐振器$ v) v; b0 i$ P( D7 B
      低速内部时钟信号(LSI)—— LSI时钟频率大约40kHz(在30kHz和60kHz之间)4 O5 P/ ~: q+ y
时钟的输出:微控制器允许输出时钟信号到外部MCO引脚。 可以时钟配置寄存器来选择输出的时钟。4 V2 N0 `/ K0 Q  N6 }; Y
& f; A% V/ [5 I, T" H$ d
1205648-20171105094626920-643991666.png ) }+ d/ j  L$ l' f# E
) O/ X7 O1 c9 G- J. `# p
其中:
PLLMUL 用于设置 STM32 的 PLLCLK, STM32 支持 2~16 倍频设置。我们常用" s7 X9 y5 I$ V: a/ }
的是 8M 外部晶振+9 倍频设置,刚好得到 72Mhz 的 PLLCLK。
SW 是 STM32 的 SYSCLK(系统时钟)切换开关,从上图可以看出, SYSCLK 的3 j; k/ ~0 `* M- F, A1 q' ?& x
来源可以是 3个:HSI、PLLCLK和 HSE。
CSS是时钟安全系统,可以通过软件被激活。一旦其被激活,时钟监测器将在HSE振荡器启动延迟后被: K" o* _. \! t' g' B
使能,并在HSE时钟关闭后关闭 。; F( w( {2 g1 u' E6 v8 u7 m% V

; ]+ d, S- v* ?& R' J
三、时钟启动过程
1、开机或复位时使用内部时钟/ b1 a" i2 }" z2 D9 [& I- G( b- R0 B
2、用软件进行切换,尝试开启外部时钟
3 ]0 ~% O4 K" n4 X2 P3、如果开启成功,则使用外部时钟,否则使用内部

* |6 n' i- e; H: Y9 r四、配置时钟的步骤
1、APB1、APB2的外设接口复位结束(即RESET),关闭APB1、APB2的外设时钟 / E: U' M% H' m1 Y7 W# t/ z( Z
  打开内部8MHz振荡器,复位RCC->CFGR中的SW[1:0]、HPRE[3:0]、PRE1[2:0]、PRE2[2:0]、ADCPRE[2:0]、MCO[2:0]( o3 {( n7 i' ^5 r( @. ]
  复位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、打开要使用的外设时钟
9 p" D7 }! K- O" D* \: |
五、代码) }6 ^3 V! y' U2 A
  1. void RCC_Init(void)
    5 l" _5 c+ b" g
  2. {
    * o1 X1 y! P) S/ }# p# V$ C
  3.     RCC->APB1RSTR = 0x00000000;   //APB1、APB2复位结束: O$ Z# V- l6 f) y$ M
  4.     RCC->APB2RSTR = 0x00000000;
    $ C" h* z' e- V0 }& q, q, S
  5.     RCC->AHBENR   = 0x00000014;   //睡眠模式时闪存和 SRAM 时钟使能,其他关闭(其实可以注释掉,因为AHBENR复位的值就是该值)
    , Z: P  L" J# P8 {6 p1 E! i/ w  I
  6.     RCC->APB1ENR  = 0x00000000;   //关闭APB1、APB2的外设时钟
    / T  Z1 C+ s8 i  n7 C9 ~5 U
  7.     RCC->APB2ENR  = 0x00000000;
    , k. k: |* [1 F$ b# j, _, j
  8. ; C2 l3 m) L' ]3 t9 l8 R
  9.     RCC->CR      |= 0x00000001;   //使能内部时钟HSI
    9 o% J* y" p" Z' U) h; ]
  10.     RCC->CFGR    &= 0xF8FF0000;   //复位RCC->CFGR中的SW[1:0],HPRE[3:0],PRE1[2:0],PRE2[2:0],ADCPRE[2:0],MCO[2:0]
    * X# Q; {7 A# _1 j+ T
  11.     RCC->CR      &= 0xFEF2FFFF;   //复位HSEON、CSSON、PLLON、HSEBYP3 E/ E% M6 s4 K- k8 K. F" p
  12.     RCC->CFGR    &= 0xFF80FFFF;   //复位RCC->CFGR中的PLLSRC,PLLXTPRE,PLLMUL[3:0],USBPRE4 b/ W0 U6 d% ~4 J) H- }* D( `
  13.     RCC->CIR     &= 0x00000000;   //关闭所有中断[12:0]# W$ K7 C! ]/ i1 F3 e: H3 `% b- b
  14. 6 @9 ^5 W0 d" f
  15.     RCC->CR      |= (1<<16);      //使能HSE
    5 M5 p' E% x7 ]& q: v* P
  16.     while(!(RCC->CR & (1<<17)));  //等待HSE稳定
    % m- N# K& X3 N/ `% T. V8 I$ j

  17. * a" r! o8 ]5 q
  18.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);          // 预取指缓存使能& Q, G2 F0 I* q
  19.     FLASH_SetLatency(FLASH_Latency_2);                             //FLASH_Latency_2  2延时周期3 S% |$ c( q0 w  u6 T9 Y

  20. + J' j( K; x  w# U0 P
  21.     RCC->CFGR    |= 0x00000400;      //AHB不分频,APB1二分频,APB2不分频/ C/ P+ L/ `& c# f! B0 M
  22.     RCC->CFGR    |= 0x001D0000;      //配置PLL:HSE为输入时钟,HSE不分频,9倍频输出0 _, C- S2 h3 M4 @- ?# l1 K
  23.     RCC->CR      |= (1<<24);         //使能PLL
    0 t3 Q! Z; N4 M, x/ [+ d8 }
  24.     while(!(RCC->CR & (1<<25)));     //等待PLL锁定
    ' m% Y9 e- p% m/ j) I/ O
  25. 9 ?( e" Q$ ?# f# b
  26.     RCC->CFGR    |= 0x00000002;      //选择PLL输出作为SYSCLK4 S: S; ~4 W& t
  27.     while(!(RCC->CFGR & (2<<2)));    //等待 PLL 作为系统时钟设置成功
    , z4 ^9 Q$ A6 M5 v+ F

  28. ; e: I& @6 G% |  a6 Y1 Q5 c- Z
  29.     //下面就是打开所要用的外设时钟(RCC_AHBENR、RCC_APB1ENR、RCC_APB2ENR)
    / A1 f$ Y6 y; }+ C: [
  30. }
复制代码

$ |8 Q# x; t' r
仿真结果为:
1205648-20171105181231232-279836018.png * S& i2 a  [; @" v! n

4 M" A# e0 a; X$ u% z# F" {1 h
收藏 评论0 发布时间:2022-2-3 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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