请选择 进入手机版 | 继续访问电脑版

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

【经验分享】STM32-STM32H7时钟配置问题

[复制链接]
STMCU小助手 发布时间:2021-12-22 13:46
STM32H7时钟配置问题
5 w. U. g5 Z7 {7 h; U设备:stm32h735VGxxx
+ F! |6 v7 S5 e4 e) ?- l1 ]" K5 H: @9 F  S* w3 ?/ b: V2 c! M
问题:STM32时钟配置不正确,一直没法启动。7 v% o; N6 b. ^+ P+ C4 J
, G4 ~$ y$ Q: I8 J
解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。) |8 [, q' H' Y0 N
. y7 y7 V1 K, f3 z" r3 a
下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。
3 R# i8 O. S/ Z# u  I" T并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行
$ s' X) H' }3 B' R  N4 i" R
$ _, g; Z3 l3 N; T* t! u
  1. /*! {$ l+ E3 s  [/ U
  2. *  时钟设置函数
    8 u9 `/ `4 j7 x7 w4 n
  3. *  Fvco: VCO 频率
    0 b3 ?5 s& Z; G7 ~5 |
  4. *  Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率
    + v# ^4 s, D3 d$ K
  5. *  Fq: PLL1 的 q 分频输出时钟频率, d+ |4 s% i: {! {( ]. Q0 {, X7 g( y
  6. *  Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等. ' k! w, J9 J: z/ e- u: g8 x
  7. *  Fvco = Fs *  (plln/pllm) = (Fs/DIVM)*DIVN;
    ! x+ D5 Q! F. v: P
  8. *  Fsys = Fvco/pllp = Fs * (plln/(pllm *  pllp));. T6 x( E/ E; z( S5 s( b
  9. *  Fq = Fvco/pllq = Fs * (plln/(pllm *  pllq));
    ; Y% I0 u/ n* Z
  10. *
    6 g0 r0 ?) \9 [# g* s
  11. *
    9 k9 `5 B. H% B( H
  12. *  plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512./ ~' ]7 b, y7 d4 i% A5 p: |9 P
  13. *  pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56.0 \4 z5 ^+ `" d) U
  14. *  pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~128) D9 B2 x% ?# U& H' |3 C' ~' V
  15. *  pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.7 D- }9 ?7 }3 o7 k1 ?. W
  16. *  CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz
    9 {  R7 V! Q4 t/ M+ D
  17. *  rcc_aclk = rcc_hclk3 = 200Mhz
    9 U4 {" m( h2 K1 A, T* H3 c. n
  18. *  AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz " }/ ]" P( p, P; [; P8 z0 G3 D
  19. *  APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz ; q( a& t' {/ a3 Q& S9 w
  20. *  FMC 时钟频率  =pll2_r_ck=((25/25) * 512/2) = 256Mhz7 K( c1 v- ?% ~: v
  21. * . W6 x* w/ W$ |8 ]
  22. *  Example:
    - L6 v% F$ P& \0 g, y/ b' p
  23. *      外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.
    0 B- h" a+ Z3 D* o; }  o) x9 ^
  24. *      得到:Fvco = 25 * (160/5) = 800Mhz' L9 R) }% p7 g4 ^9 t
  25. *      Fsys = 800/2 = 400Mhz; K1 E- Y, I1 l9 K0 B
  26. *      Fq = 800/4 = 200Mhz
    9 o' P3 x# J& }" `  q9 C* M5 o
  27. */
    : g5 k3 @& x4 Y, [" q+ d0 _* P0 f/ @

  28.   o* M2 v$ r2 t5 A6 {+ V
  29. #define PLL_N   160# R4 M& k+ x# X5 A9 v9 U
  30. #define PLL_M   5
    8 R3 s: g5 n4 }1 U* |% X
  31. #define PLL_P   23 D: V& B/ r1 n" e7 P$ e. k
  32. #define PLL_Q   4+ M# w) W. Y7 D6 ~' N6 T- L
  33. 1 K& L# M9 j6 f$ ^
  34. // 时钟设置函数
    1 d: M0 \0 d" Q8 c5 P" |5 u
  35. static void SystemClock_Config(void)
    ! m5 R- r3 n2 J* E' [
  36. {
    . Z9 x% f7 t4 o3 R) n( e: u  O
  37.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};9 f; Q8 [: ]) c- m% h
  38.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};/ H/ a/ q$ L! z; @3 J; S. A
  39.   HAL_StatusTypeDef ret = HAL_OK;
    2 K8 n& X8 a% a9 e& L
  40. ! E- W/ ?5 l9 ~9 V+ Z3 e: f7 ~, b
  41.   /*!< Supply configuration update enable */) S) Q- X1 W& Q: R; |
  42.   HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);5 G+ q# {( j5 m( u% N; |( b$ T' J
  43. 4 c0 i, b7 ~" h" R
  44.   /* The voltage scaling allows optimizing the power consumption when the device is, a! s; t2 O$ U* O) U
  45.      clocked below the maximum system frequency, to update the voltage scaling value
    8 M  c6 m2 ~+ y, P4 G1 G
  46.      regarding system frequency refer to product datasheet.  */) {) Z9 G5 e7 ~3 J, G; S7 K/ B
  47.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);0 \& D/ K: _" v
  48. 9 ^$ j: S! A- g3 E6 ~) }
  49.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
    $ L  Y0 `1 s5 r' B

  50. $ b7 D) e. h/ y" f( l
  51.   /* Enable HSE Oscillator and activate PLL with HSE as source */4 F% d9 o) W5 V" M2 V
  52.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    ! [+ A2 Z; d1 u8 R5 _' \, L( l6 t1 B
  53.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    7 ]# w5 Y; T1 }1 s6 @* G4 M
  54.   RCC_OscInitStruct.HSIState = RCC_HSI_OFF;) a% f% }, q+ W1 J  c
  55.   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
    5 D0 M4 X( z3 ]: \5 ?. D
  56.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;! K/ e$ w- L( \# b# n% u4 `* g
  57.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
      d* u  A3 q: \

  58. * G$ a+ A. B* S, ?2 e2 w
  59.   RCC_OscInitStruct.PLL.PLLM = PLL_M;! z6 ?8 H2 L2 `" u1 m
  60.   RCC_OscInitStruct.PLL.PLLN = PLL_N;
    0 b7 z5 Z$ Q0 H3 l. ]
  61.   RCC_OscInitStruct.PLL.PLLFRACN = 0;- w5 C1 e$ R& y6 E" u) D) O$ v
  62.   RCC_OscInitStruct.PLL.PLLP = PLL_P;
    ; C% z8 _. h! T8 g7 u% ~
  63.   RCC_OscInitStruct.PLL.PLLR = 2;
    9 w4 Y' b- g; R* j" i+ W& m) G$ T
  64.   RCC_OscInitStruct.PLL.PLLQ = PLL_Q;3 R8 j* B$ N0 N, o
  65. 9 g5 q. t3 E6 O+ ]3 S
  66.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    : P# c' Z: ]# I* X3 d- i  J" r5 r
  67.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;7 F" T# y: k9 X* }
  68.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
    ' [2 U* g- e+ A( M' u
  69.   if(ret != HAL_OK)
    ' ~" \( ?6 _% ^8 i
  70.   {
    . R! b$ i# e& Z6 S7 C8 u- U" F9 H0 Y
  71.     while(1) {};
    ( j3 j% w6 P! }# d1 B% `- L
  72.   }) \. G8 E8 D5 a7 R7 x3 v
  73. ( J' i- l, }' u5 [9 W+ S/ O& @
  74. /* Select PLL as system clock source and configure  bus clocks dividers */6 g9 {' ^( H, |( \( B
  75.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \4 y& \; P- Z( P$ }% N* O0 d7 [
  76.                                  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);
    , Q6 c/ k) Y5 o# |7 S" _3 w- h
  77. ( t% Z) }/ ^& q4 v( S9 E3 e
  78.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;2 v+ G/ G# ?9 x2 `  X
  79.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;+ ]6 m0 o2 m1 D/ u0 }( ~) f
  80.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
    , |# Q( w6 R/ _3 q
  81.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;8 Z6 y' T5 ], X& w) V; g6 [% ]5 g
  82.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
      \' k5 a) c) Z5 B- h0 I0 C5 y% V
  83.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
    9 `" [- j4 L5 n4 a% v
  84.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;5 r1 G- _! }% k7 w5 }/ Z4 R
  85.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
    : r4 i4 y1 h( z5 \& L
  86.   if(ret != HAL_OK)9 b; D( i8 k" O! t+ X
  87.   {
    2 y% W: j+ R! [  ]) {+ c! i3 C
  88.     while(1) {};- d% f$ o8 K0 d9 O* f, t) ]
  89.   }
    " u3 {, k0 i' g+ T; d; ]

  90. & R2 T" ?5 k" W$ A' `8 [: d: N
  91. }
    3 r& ], T! F0 n1 M6 ^8 [- Z; i% N
复制代码
0 \( o9 x8 N9 `; t. \) g" I" _

; q$ t! F% d: x3 R  u" s# v
收藏 评论0 发布时间:2021-12-22 13:46

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版