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

【经验分享】STM32的时钟配置随笔

[复制链接]
STMCU小助手 发布时间:2022-2-6 20:05
  以前使用STM32都是使用库函数开发,最近心血来潮想要使用寄存器来试试手感,于是乎便在工作之余研究了一下STM32F4的时钟配置,在此将经历过程写下来作为锻炼,同时也供和我一样的新手参考,如有错误或者更好的方法欢迎大家批评指正。
        
1252227-20180810232025214-366986574.png
5 I0 r# ^( k/ I9 P
                   从技术文档上得到STM32时钟源有三种, HSI 振荡器时钟 、HSE 振荡器时钟 、主 PLL时钟,由于每个时钟的工作特性的差异,若想将系统时钟设置为最高频时需使用PLL将基础时钟源进行倍频。
由于使用外部晶振倍频精确度会比内部震荡时钟高很多,所以一般都是使用外部晶振,这跟我们使用库开发是一样的原理,所以一般的配置关键点大概如下图红框所示:
  l6 Z% `. \: ~3 P6 b
1252227-20180810232959582-1666063849.jpg
                  
1、第一步首先要将外部HSE时钟打开,等待震荡稳定后再进行下一步操作。
2、配置PLL寄存器参数。
3、切换系统时钟源。

; A4 j% d+ H% o" ~4 @: C0 V) F/ `
第一步实现:
依据:

3 `7 @1 l' d" r( G6 M: [
1252227-20180810233635609-176712394.png
# N4 V2 Q- }  Q
          开启HSE时钟源主要是控制CR寄存器的16位,然后打开后硬件会自动将第17位置位,如果未成功则等待,当然在这个地方可以加入时间等待,如果超时说明打开失败,进行其他方法设置。
          实现:
         
1252227-20180810233838022-204794165.png
. U  t% ?& {* ^' l/ g3 Z4 a2 {
第二步实现:
依据:
         
1252227-20180810234237106-1240631565.png
& V+ D3 V% L3 h5 i% g& X
在这里技术文档上说明了各个参数的设置范围:
2 ≤ PLLQ  ≤ 15 、 PLLP = 2、4、6 或 8、 192 ≤ PLLN ≤ 432 、 2 ≤ PLLM ≤  63
由于我想将STM32设置成最高频168M,于是根据以上参数范围以及计算方法,选择一组设置参数如下:
PLL_M = 8,PLL_N  = 336,PLL_P  =  1  (2分频),PLLQ  =  7;
参数确定便可以直接设置,这些位只能在 PLL 已禁止时写入。
实现:在这里记录一下自己的小心得,以前配置寄存器都是将要配置的数先算出来,耽误时间,今天在看技术文档时突然发现直接用移位即可,且为提高代码的可读性,最好是选用或运算单个设置每个设置点。这样看起来就舒服多了。
* t' Q5 ?+ Z4 I4 X5 d2 c7 g
1252227-20180810234940565-1231503649.png

2 Q& b6 q, {3 Z( M( j
第三步实现:
依据:
( _2 I" z1 z" k! M7 f& _
1252227-20180810235349798-1180723592.png

: Y3 h1 Z7 B# U, P
这个时候就需要将系统时钟切换过来了,主要是设置SW开关,然后再设置AHB、APB1、APB2、等时钟,在上时钟树上可看出。
还是操作对应的位,在这里又发现一个小技巧,原来STM32系统头文件已经做好这些设置的宏定义,直接使用即可,而且从可读性来说大大加强,如下图所示。最后将设置好的时钟通过MCO1输出,检测。
实现:
9 S( j) ?% b5 {: L
1252227-20180810235935003-2113932910.png ' v+ s; B2 T$ ?) q1 Q  ]1 N! d

) c) ?4 ~* G4 Y4 ?+ }' q' I
整个时钟就到此配置结束,原以为会梦想成真,可实际却发现不尽人意,为啥波形没有呢,苦思冥想了很长时间,最后参考库函数底层实现方式,加了一句:

+ r! S# F: n- c3 M$ b( h: Y
# ^! Z* R. @6 j( c& h0 f
然后就完美输出,在这里我不是很理解为什么要添加这句,以前用msp430的时候好像也没这个设置,而且我发现光设置CPU等待周期还不行,还得设置前面两个参数,不然设置的时钟偏差很大。
实际设置函数如下所示:
  1. void SystemClockInit(void)$ }" |& N/ Z1 `/ P( @
  2. {
    ! i$ Y9 J5 N7 w5 I$ q! u/ g

  3. 9 B/ C' \. ]. P% v2 l- v
  4.    RCC->CR |= RCC_CR_HSEON;: m6 G# u4 R6 a0 m; D
  5.    while(!(RCC->CR & RCC_CR_HSERDY)){}
    7 A( N$ i* U1 _( W
  6. 6 I- r- P9 Q) b6 _: j2 n
  7.    RCC->CR &= ~RCC_CR_PLLON;
    $ W2 V0 ^  E, s# w
  8.    RCC->PLLCFGR = 0x00000000;1 Z! m# u7 X  @  \- G
  9.    //PLL_M = 8,PLL_N = 336,PLL_P = 1  (2分频)
    * i, I* v% M% J
  10.    RCC->PLLCFGR |= 8 << 0;
    : T0 x7 P0 M( R: C* l4 c' e
  11.    RCC->PLLCFGR |= 336 << 6;0 p& |3 V' N: r8 N+ c! i$ M, y
  12.    RCC->PLLCFGR |= 1 << 16;
    ' G5 A3 T) h! j, i9 E

  13. - B" s8 U% Q# U% u# F. E) ^) \- H- a( J
  14.    RCC->PLLCFGR |= 7 << 24;    //配置PLLQ为48M3 |# C, I6 u' p* l$ M: B
  15.    RCC->CR |= RCC_CR_PLLON;
    , y" r  K% j5 B+ E; j) K" Y

  16.   C1 v1 ?" `* u; I8 Q
  17.    while(!(RCC->CR & RCC_CR_PLLRDY)){}/ s1 z) a9 {. j( r. G; h8 z5 _. o
  18. ' e4 A8 \: L$ O2 m9 N
  19.    FLASH->ACR = FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS;
    9 O# U" X9 I9 s" Q5 W+ l6 D/ K
  20. 2 _1 T& S1 ^: L7 T' i! m7 \6 Y
  21.    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;   //不分频使AHB时钟为168M
    8 g( h7 f# A, q  k0 X* O. }' ^( q  I
  22.    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;  //APB2 = 84M
    ( x) C1 g2 F3 P" j6 h
  23.    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;  //APB1 = 42M( \$ s7 a: l" u& c* m+ O" |

  24. 4 l5 ^7 ~8 @( ?7 o
  25.    RCC->CFGR |= RCC_CFGR_SWS_PLL;5 @& o+ P; }3 S( [; A
  26.    RCC->CFGR |= RCC_CFGR_SW_PLL;
    # f. h+ V' u% Z. i+ V( l" ^

  27. ( w% C& s* b; |$ n8 k5 s, U
  28.    RCC->CFGR |= 3 << 21;    //PLL输出
    2 _: g# C3 W8 s5 m1 J! S8 x9 |. C6 \
  29.    RCC->CFGR |= 4 << 24;    // 2分频, [# P( i" W  N

  30. - z4 t0 t& F  e  ^2 j+ _
  31. }
复制代码
% T) N8 ?# _7 A  T2 Q) }

2 z( d+ v6 @1 G9 {# I7 f1 m
最后两分频的波形显示如下:
7 A$ s+ {) d1 N2 P' P
1252227-20180811000740131-1384043886.jpg
7 l9 S9 ?% n1 a+ v: M* K( t
到此配置就结束了,留有一个问题,那就是STM32时钟配置为啥要配置那个CPU等待周期,也就是这条语句:

+ j$ ?3 {7 S3 j  P& V 1252227-20180811000249407-2086513743.png 9 f" {! D! {& N) ?) S- D
赞 收藏 评论0 发布时间:2022-2-6 20:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

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