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

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

[复制链接]
STMCU小助手 发布时间:2021-12-22 13:46
STM32H7时钟配置问题
  z7 ?2 X0 S6 z- r设备:stm32h735VGxxx5 p& z, S# ~) A+ j4 g8 f, t% J
1 d0 G/ D, ^4 J- r; [5 d
问题:STM32时钟配置不正确,一直没法启动。
, K1 V! _) T. i' H/ n; q, [) [4 g. n' S5 M
解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。- k' ^# J9 S! X) W4 @5 t

. ?2 c9 N3 e# v$ ^  }) n下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。) G, _1 P) x+ Y9 ]7 W$ x
并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行
  `8 a/ b; b3 \; ~8 F* {' P. L% w% ^- n( i
  1. /*+ I; }. b7 ~2 O" N" F4 {* `1 V
  2. *  时钟设置函数; c4 l$ i  j. K0 N( Z& i' y
  3. *  Fvco: VCO 频率+ j9 K. n# W4 W
  4. *  Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率" U( T* n5 m9 ]. F$ i& M
  5. *  Fq: PLL1 的 q 分频输出时钟频率" _/ p  y2 l. O+ y+ V" P5 O+ D# W
  6. *  Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等. , p: x+ s! F' Q, }) G2 g( p
  7. *  Fvco = Fs *  (plln/pllm) = (Fs/DIVM)*DIVN;
    4 m8 ^# ~1 ~) K! t4 f
  8. *  Fsys = Fvco/pllp = Fs * (plln/(pllm *  pllp));4 [" x" H) H7 D% L+ p1 Z
  9. *  Fq = Fvco/pllq = Fs * (plln/(pllm *  pllq));- K9 ]/ d$ \: b
  10. *
    ) U+ H! ?: D7 }: V( M' Q1 _8 E
  11. * 6 O' B  }1 j) [3 a' {" ?: U3 X
  12. *  plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512.
    + ~* X, c0 X, k- K* g# A5 C
  13. *  pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56.5 f: B; `6 j9 ]+ Q$ j9 H
  14. *  pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~128: d  P: K) U2 d2 e7 S7 \
  15. *  pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.
    4 A$ w. ^2 d3 X$ ?) B0 P% M
  16. *  CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz   ~0 d9 a& V7 V; `
  17. *  rcc_aclk = rcc_hclk3 = 200Mhz
    ( w7 S$ z7 H. m: F8 E2 r, ]1 s
  18. *  AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz : O' t9 O* p4 C& E* c/ Y9 ?
  19. *  APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz $ [/ d/ V9 C! z  e. Z& P
  20. *  FMC 时钟频率  =pll2_r_ck=((25/25) * 512/2) = 256Mhz
    % b. P) @0 J) }$ `
  21. * 3 V# y: u- Y3 {/ K3 v& _6 z  }
  22. *  Example:# |1 L( k& y! A! F. Q& d( j; r
  23. *      外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.' K4 I; w4 j3 C: h% V
  24. *      得到:Fvco = 25 * (160/5) = 800Mhz
    0 D6 D  a' w6 O2 h
  25. *      Fsys = 800/2 = 400Mhz
    ! I$ K: f" R/ l! X% j. H* D
  26. *      Fq = 800/4 = 200Mhz  D. K* v" w, o" C
  27. */
    - ~4 G5 f5 ?  m& e/ N: Y
  28.   i& G& O: a! y; {2 _/ j
  29. #define PLL_N   160
    : G% e9 x3 I  n% [
  30. #define PLL_M   5
    / Z7 V1 C. J/ Z" W' I! S9 ]% v8 }
  31. #define PLL_P   2
    * R/ A8 a& V9 }! G% `* P" I
  32. #define PLL_Q   4
    " l% J. o5 f: Q: T6 R

  33. , A9 U4 k/ w  T2 T8 b# s) Y1 d8 q2 H
  34. // 时钟设置函数( R4 q0 `. S8 v9 J# y
  35. static void SystemClock_Config(void)
    - j2 c3 D6 Y5 w6 O. w
  36. {& }# n; x" _+ C7 \2 j, O$ E3 O5 f
  37.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    8 P- v, K4 b$ h! w+ ?
  38.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};% o4 f7 D5 r: a6 T6 B1 U# J
  39.   HAL_StatusTypeDef ret = HAL_OK;
    * S. ^) [9 }( e: {$ t- o6 D
  40. ! A7 y8 `4 L. I; c& h6 f8 O6 j1 k
  41.   /*!< Supply configuration update enable */
    : v+ y3 W# V' L$ N/ ]. J
  42.   HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);
    , d) M) X/ P  [' g8 \) N* q, O7 n! P- z

  43. 3 B* f" O  J  B
  44.   /* The voltage scaling allows optimizing the power consumption when the device is
    ; O5 ]) o. Y# R' m* T5 T8 Q0 t
  45.      clocked below the maximum system frequency, to update the voltage scaling value7 f. D# z7 s7 R8 S
  46.      regarding system frequency refer to product datasheet.  */5 y% d& ^! s# M' H. {: `! t! P' Z
  47.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
    7 \2 Z- c+ _  c% D: t/ D  \* b
  48. ' Z$ q9 V5 c- L' [2 ]! T9 N6 U5 g0 z' y
  49.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}# W1 F) v0 g- ?, _
  50. & Z3 L; A) r& D( m7 ]. i4 e
  51.   /* Enable HSE Oscillator and activate PLL with HSE as source */
    3 Y* n* [9 l0 N& L7 g! S
  52.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;/ N7 e' |; U0 m; [
  53.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;  L6 u# ?, Q* o3 P0 J
  54.   RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
    0 q5 g4 q: ]4 D
  55.   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;5 D- p% x' [2 F+ V5 e  k" m
  56.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;, B& _7 K; y! f; H1 Z; A+ E
  57.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;% R5 b7 Z, c6 ^! K
  58. 8 g7 h$ H% B% I0 h/ R
  59.   RCC_OscInitStruct.PLL.PLLM = PLL_M;+ S6 a2 ^1 H3 T" F! [; `
  60.   RCC_OscInitStruct.PLL.PLLN = PLL_N;  \/ d/ R+ @! V4 v" _" I$ \7 E
  61.   RCC_OscInitStruct.PLL.PLLFRACN = 0;% w5 F6 Y" s" u* f, G1 _! `& x
  62.   RCC_OscInitStruct.PLL.PLLP = PLL_P;5 U; D( u  O3 I3 z; I; }6 R) u3 s
  63.   RCC_OscInitStruct.PLL.PLLR = 2;5 x8 _; i( V4 C% t8 J2 C) `+ |
  64.   RCC_OscInitStruct.PLL.PLLQ = PLL_Q;
    8 W" G5 e2 F' x; S

  65. $ y8 o+ \; i8 P& J
  66.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    5 p, C2 W0 o3 o5 J( W
  67.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
    ! U$ ~8 R  E5 r# x- p2 I4 Q; i
  68.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
    # X: }9 {; D7 k# T7 y: m- q2 z! s
  69.   if(ret != HAL_OK)
    + A; N9 B. R  _$ t
  70.   {
    , a5 h- @: Z% f" P/ Q
  71.     while(1) {};
    ; d, s0 K+ h( p5 c. T& Z9 O; A# \
  72.   }
    1 F. Z8 a+ b$ d, F
  73. 9 ]/ ^& j) a2 ~! K) \; i6 R
  74. /* Select PLL as system clock source and configure  bus clocks dividers */1 K& T5 J5 s6 q2 P
  75.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \! v- S0 \% N) o1 C  g
  76.                                  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);1 @5 u: K- S7 z' [) x; b
  77. 2 R4 W& X! g! p- G, `; I
  78.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    ( J, g) ]- c% }& ]* V% s
  79.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;. B3 g, W2 U2 T! U- i: l( }1 Z  j
  80.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;$ Q, \# U$ ]8 i$ y! Y4 N
  81.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
    ' N8 a: G" `# e: P
  82.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;8 }4 o7 Z* _8 [: o2 ]. x
  83.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;& o, [. F$ q9 o! n. a- ]% D- I  T
  84.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;! F' e  c$ A, m* z9 p
  85.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
    * E) Q% o1 L5 Z3 s
  86.   if(ret != HAL_OK)
    4 F' {3 y! M( M( `* S
  87.   {1 d) i4 X  T$ _( k2 f+ `
  88.     while(1) {};( U$ L$ d$ \7 P' U( S) Z
  89.   }
    4 f; X2 G( X& M. @+ A! A1 k
  90. + b1 m( b6 X7 _& D7 W* q
  91. }4 d' F) R7 c/ L# s
复制代码
3 \1 E( o9 l+ ?8 Y

6 S6 ~$ W, K, j6 |+ i  [
收藏 评论0 发布时间:2021-12-22 13:46

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版