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

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

[复制链接]
STMCU小助手 发布时间:2021-12-22 13:46
STM32H7时钟配置问题
: T2 S7 i9 k& {设备:stm32h735VGxxx
7 k2 G: C2 E5 B4 @8 V& B$ Q; `6 q4 q+ f% a& l
问题:STM32时钟配置不正确,一直没法启动。$ [" |% U+ D$ K

& @6 g% C( I/ B8 G  Y( V$ G解决:原因是配置时钟的一些参数超出的范围,所以配置导致不成功。+ _$ A; z: Q% @' V0 |

& C  o- u- n/ A9 I+ f6 r2 U下面是H735的时钟的一些解释,其中 Fvco 是有范围的,这边从文档上面查到,FVCO的最大配置值为836M,所以配置的时候一定要注意。
" g" [# z0 I! E8 g2 t/ h- ]/ w并且plln, pllm,pllp,pllq,这些都是有范围限制的,如果配置错误,那么芯片将不会正常运行
  x  {  @" K6 }5 p- i1 p6 y* Z# I# O- [
  1. /*
    9 k+ i% C. f5 P4 Q
  2. *  时钟设置函数
    6 X# [9 y" O+ C$ P8 ]9 l! v( P
  3. *  Fvco: VCO 频率& ~- n3 U$ w0 Z: B* x" j& |
  4. *  Fsys: 系统时钟频率,也是 PLL1 的 p 分频输出时钟频率
    & ~, @8 N3 ]8 k. y; n
  5. *  Fq: PLL1 的 q 分频输出时钟频率
    . H! H2 k% a6 _5 L
  6. *  Fs: PLL 输入时钟频率,可以是 HSI,CSI,HSE 等.
    ' _$ F9 }) z, K, g+ D
  7. *  Fvco = Fs *  (plln/pllm) = (Fs/DIVM)*DIVN;, N1 _  ^- s* ~, D
  8. *  Fsys = Fvco/pllp = Fs * (plln/(pllm *  pllp));% J, y+ X* j" {  l: \/ n4 o
  9. *  Fq = Fvco/pllq = Fs * (plln/(pllm *  pllq));
      u5 i7 s' l; ]' _, Z
  10. *
    ! [$ c8 i- ?( f, Z0 A1 X
  11. *
    ! L% m1 A1 v' p9 ^- X
  12. *  plln: PLL1 倍频系数(PLL 倍频),取值范围:4~512.1 S1 \+ [4 L9 S# [8 g* \8 u2 M
  13. *  pllm: PLL1 预分频系数(进 PLL 之前的分频),取值范围:2~56.$ X+ P1 ~8 ^# ?% {# b; h
  14. *  pllp: PLL1 的 p 分频系数(PLL 之后的分频),分频后作为系统时钟,取值范围:2~128
    & D6 B! J% J* z& L8 ~
  15. *  pllq: PLL1 的 q 分频系数(PLL 之后的分频),取值范围:1~128.
    # u' a2 b5 b( C! u/ m' f+ M, v
  16. *  CPU 频率(rcc_c_ck) = sys_d1cpre_ck = 400Mhz
    + ?0 [( Q5 ?/ F( K- H
  17. *  rcc_aclk = rcc_hclk3 = 200Mhz
      {# T6 Z- h' _3 `6 \
  18. *  AHB1/2/3/4(rcc_hclk1/2/3/4) = 200Mhz 0 H5 i& |# Z0 @) U) V: o
  19. *  APB1/2/3/4(rcc_pclk1/2/3/4) = 100Mhz 2 Y- m' F% ]" L& |) p' J# V9 D+ }
  20. *  FMC 时钟频率  =pll2_r_ck=((25/25) * 512/2) = 256Mhz' c4 j$ t: _; L$ n6 B( r
  21. * ! Z; e  I! W  c3 V
  22. *  Example:
    0 m; ~3 ^) Z- Q$ f1 i
  23. *      外部晶振为 25M 的时候,推荐值:plln = 160, pllm = 5, pllp = 2, pllq = 4.* X* w  B  u4 r  z. f& i
  24. *      得到:Fvco = 25 * (160/5) = 800Mhz& R, ?5 t, E% I
  25. *      Fsys = 800/2 = 400Mhz
    7 y+ a  M2 ^0 s1 g( ?
  26. *      Fq = 800/4 = 200Mhz
    " y& D; z7 K8 P% _9 ~; ]
  27. */
    7 p0 a( S: `; i
  28. 4 {+ x+ I* i3 v
  29. #define PLL_N   160
    * V/ ~7 i5 S4 \& j; }1 x
  30. #define PLL_M   5
    9 h* Y4 K4 b% r) v# U
  31. #define PLL_P   2
    3 Z$ i; H! M. }- T7 L1 i7 F, n- X
  32. #define PLL_Q   4
    6 K5 F, m4 A- K3 _+ V: Z

  33. 8 r/ A' R( d3 {0 Y
  34. // 时钟设置函数
    / D" |$ u" u3 F' f# c
  35. static void SystemClock_Config(void)
    ; p9 |6 t) A& ~4 y: l5 S# h
  36. {  @, p3 H0 i8 J6 Y
  37.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    * C0 Z- C2 N7 q, C7 h2 m
  38.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      V2 K* |' }. W( N% b) s9 a8 r
  39.   HAL_StatusTypeDef ret = HAL_OK;% y, z2 [- M9 u! S( \) A
  40. 7 X4 s- ^3 ^/ H& W, s1 o
  41.   /*!< Supply configuration update enable */
    9 q9 w- ^6 ?5 T  I* `/ L1 u' o
  42.   HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);5 Q. h4 s- E3 C# a
  43. 6 q" R3 E, o. Y8 H6 ^0 i. b+ b
  44.   /* The voltage scaling allows optimizing the power consumption when the device is
    1 |$ m2 X" d$ V/ O7 z
  45.      clocked below the maximum system frequency, to update the voltage scaling value9 O; i% s/ {3 m- V/ ?+ X. q4 N
  46.      regarding system frequency refer to product datasheet.  */
    1 i+ o- `( ~! u* f: p0 h8 X
  47.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
    " c4 v% \: h% I
  48. $ d7 y$ J' i8 v. Q5 |% J4 p
  49.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}( |/ [9 H6 Y9 g  \! M) G

  50. ! }! f& w8 ^4 h2 a. P3 ?  q4 w$ J
  51.   /* Enable HSE Oscillator and activate PLL with HSE as source */7 v8 n/ E$ x% t, B/ r
  52.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;9 e. z8 v; U. o. w
  53.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    8 J" _( D! J6 `9 v1 T! E. u0 h' d* I
  54.   RCC_OscInitStruct.HSIState = RCC_HSI_OFF;( s! V; ~( j6 B! |3 q- I; W
  55.   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
    + r( g) k3 S  V* y- w
  56.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    % \' M; |/ M; ~# _% s: k+ M/ W
  57.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    1 n) p* @$ Z* i" U

  58. % z  I( ], f5 O0 E2 y( |
  59.   RCC_OscInitStruct.PLL.PLLM = PLL_M;
    8 l1 q5 q7 ^. U  u) b8 d
  60.   RCC_OscInitStruct.PLL.PLLN = PLL_N;
    8 s& L* m' ?! M9 O
  61.   RCC_OscInitStruct.PLL.PLLFRACN = 0;9 |7 z9 K, v# V8 n' y% l4 j
  62.   RCC_OscInitStruct.PLL.PLLP = PLL_P;: k) y* M& }  n) i+ R0 r9 _
  63.   RCC_OscInitStruct.PLL.PLLR = 2;) m9 @' }2 h* G' Q/ Z
  64.   RCC_OscInitStruct.PLL.PLLQ = PLL_Q;
    , K# E+ |. ~; g9 A1 ]4 |# x# q  I
  65. 5 T3 F& }5 e4 e" r
  66.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    6 G7 \, q* U1 C# D$ b& e; }
  67.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
    5 H( D( ?$ z2 p2 Y1 H, ~2 A. p- p
  68.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);- H7 V3 P2 X$ y2 t: w  ^6 L. z
  69.   if(ret != HAL_OK)
    ! o# {( e) G: b) G8 f6 k
  70.   {
    # `/ e7 ~. O( e+ `
  71.     while(1) {};
    ) E) {0 L: \  g, l  m7 _
  72.   }! l8 P% ?6 I2 y+ V) u
  73. 5 O7 o7 H7 U3 J2 \8 {/ a
  74. /* Select PLL as system clock source and configure  bus clocks dividers */4 @3 r' q; M5 {
  75.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
    . ^+ ?  [( ^# L1 `; L/ F+ g) P
  76.                                  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);
    - v3 h* C1 D* q% x) p' H' w! U$ e
  77. " e1 a0 E) D: B( L
  78.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;2 y( t0 Y8 c0 ~
  79.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
    ) _& v# ^6 ~1 r1 U' Z5 L
  80.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
    * X1 e0 X  D# L0 Q/ P  q9 J
  81.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
    + s  @$ M0 c2 R1 o4 R( l5 {
  82.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;2 p% v) [. Y$ c/ K
  83.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;4 X. ]* N6 b8 ~7 b7 m7 ^
  84.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
    / s" g, u; T7 @
  85.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
    : K- x. N5 u& @5 Y* P/ Z. T
  86.   if(ret != HAL_OK)/ Y$ z! s# n- r. W6 f
  87.   {
    - R2 _' a/ U0 [
  88.     while(1) {};2 C5 s  w7 K' c7 P: s
  89.   }
    " n1 o' {( n7 v" [8 d4 [
  90. ! D' S8 d+ D) M! @7 [
  91. }7 v" n0 I7 L7 l# J! d
复制代码

$ J* ?; n1 M( [1 Z7 k: F1 T" h8 z9 y1 T" N- J% b
赞 收藏 评论0 发布时间:2021-12-22 13:46

举报

0个回答

所属标签

相似技术帖

官网相关资源

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