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

【经验分享】MCU_STM32H7XX系列通过STM32CUBEMX配置MCO2

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
4 \/ Z5 S$ F/ a6 J. M' m! i$ L9 A4 i3 C: u0 ~
  1. void SystemClock_Config(void)" C' e' e$ h* g9 q4 b% c' U
  2. {. P; ^7 @! ^' o$ |  V5 x
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    2 h* i" x: p% b6 P' l& U
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    1 H9 O1 @% q2 j. w
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};% p; u8 {/ n0 F( ^5 u+ J& J- m% d

  6. , Q% F) x9 O3 a5 ?& P* N' @6 N, Z" w
  7.   /** Supply configuration update enable
    * J' B* M) k7 @9 S- l$ P/ T6 E
  8.   */ : q9 u# `4 q! L- _5 R" M! b+ t8 ~
  9.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
    & }5 [& h  g5 t+ [" e3 Q$ Q( ^
  10.   /** Configure the main internal regulator output voltage , s2 e2 E& K* }2 i, M8 c  X
  11.   */
    # {6 S# ~; p4 L: |4 j
  12.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);3 x7 G( e! \4 X  f
  13. ! o" M% C+ I: U& t3 F
  14.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
    % [8 V; y7 z$ d, S, ~4 {! Q' i
  15.   /** Macro to configure the PLL clock source
    6 |0 |/ K' M1 F/ c3 H( P  `4 T7 r
  16.   */
    0 }) T8 b0 p9 ~9 [; P; n' W' T
  17.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);( J( q9 N# h* ~0 d3 N( e8 j0 }/ j
  18.   /** Initializes the CPU, AHB and APB busses clocks 2 R2 j& u' t- Q" M$ Q8 m
  19.   */
    7 x4 K6 D- X9 S2 n* E8 @8 X
  20.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    $ @  Z6 d! W: m( A( c2 ^6 f5 ^
  21.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;- |0 c- U: q; c7 s( e/ |. y+ q
  22.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;6 U7 c0 v/ ^# J/ K
  23.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    - N7 Q: S, C3 S$ U
  24.   RCC_OscInitStruct.PLL.PLLM = 1;5 Y/ A5 ]& [& Q
  25.   RCC_OscInitStruct.PLL.PLLN = 80;; [6 p6 U8 p' |3 |2 N
  26.   RCC_OscInitStruct.PLL.PLLP = 2;
    & }: m2 b1 G" j0 f9 k0 P! C- y$ i
  27.   RCC_OscInitStruct.PLL.PLLQ = 40;
    # e# r& {9 ~3 n* P
  28.   RCC_OscInitStruct.PLL.PLLR = 2;
    2 M+ w! b- U. g5 g
  29.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;, M+ I& z* n. E6 c/ y, S
  30.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;4 o9 ^* _* K; s# h
  31.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
    * D- h& g7 L6 h" y: I
  32.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)* O8 `# K# A! _# q# v+ I: y1 G
  33.   {& S+ W7 ?/ d+ d
  34.     Error_Handler();: q) [" V" M2 S
  35.   }
    : M9 `  d8 l; G  ]( a9 ?. v6 h: u9 W
  36.   /** Initializes the CPU, AHB and APB busses clocks ; O! @6 p3 B0 I1 a3 |
  37.   */1 P) c6 I- Y5 @. {# ~
  38.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK3 _, T0 O2 {: l0 q
  39.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2# q  s  {6 e' l' x3 Y
  40.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;% x& V4 d, n1 c8 ]. Z+ z& F0 x( Y6 {
  41.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;0 R, o+ Q9 s# \" U  A
  42.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
    ! S" x" A2 h4 C6 r% T! P
  43.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
    . `9 D4 c! S, P; o. S8 O
  44.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;+ [& a2 J" u6 ~) ^6 O- u
  45.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
    ( g6 x( E) I7 }& s4 P  s8 c
  46.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;. E0 L% q: q( `3 G" d. e8 G$ K; `
  47.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;* c, F' d0 E2 ]4 ~; _6 E
  48. . |: i) P- P0 {% S1 V2 s
  49.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
      A$ H6 l- a9 t( q
  50.   {- k; r% ~8 z. g- p5 P& D
  51.     Error_Handler();
    ( s9 g( N8 U7 F1 ]% ~1 X6 A
  52.   }: ~$ L  u' O& [% {8 @, g4 O
  53.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
    ! }. G, v6 t5 N4 I4 F) v+ |
  54.                               |RCC_PERIPHCLK_FMC;
    : C) i" Y  E: g
  55.   PeriphClkInitStruct.PLL2.PLL2M = 4;: j! H2 C2 t# O
  56.   PeriphClkInitStruct.PLL2.PLL2N = 80;+ h8 d# T: m6 T' {+ J
  57.   PeriphClkInitStruct.PLL2.PLL2P = 20;
    + G- L" X; H; ]
  58.   PeriphClkInitStruct.PLL2.PLL2Q = 10;
    . s9 K+ A, C( L5 P6 \
  59.   PeriphClkInitStruct.PLL2.PLL2R = 2;
    + h# j3 A: G+ z$ [: V
  60.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
    2 `$ E1 b4 o& |
  61.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;) e; Y) X( C* E, ?1 u
  62.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    + i- D1 j9 W0 S! P- I7 I
  63.   PeriphClkInitStruct.PLL3.PLL3M = 8;8 j# F* B5 S6 Y4 L, E
  64.   PeriphClkInitStruct.PLL3.PLL3N = 128;. m, K6 L- x7 `6 ?
  65.   PeriphClkInitStruct.PLL3.PLL3P = 2;
    " a* b2 t( W; Q8 {0 z4 P
  66.   PeriphClkInitStruct.PLL3.PLL3Q = 2;
    # K  J: @1 e/ i
  67.   PeriphClkInitStruct.PLL3.PLL3R = 8;
    - I9 H9 x- N) x7 ?% A
  68.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;9 D) u& b5 \, L3 L
  69.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
    ' t1 E9 r# r  G0 b* O1 \) z
  70.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;4 d7 Q' W6 ^5 t8 w
  71.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;( R  u' Q5 x- n) U
  72.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;( `; m0 d! \+ @; U
  73.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;. X0 N$ \5 Y* i+ v( D
  74.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    0 t/ R6 G( V/ v6 P" F- K1 k
  75.   {# X" k! b; }9 N9 A! p* Z
  76.     Error_Handler();
      n$ S/ k+ ^( g. M1 e# e& u. |2 ~; c. G  W
  77.   }, T, z$ Q6 L* l: L9 U
  78.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);2 v( a& m7 J, L
  79.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);1 H* B! z' c5 ]. ^; P+ C7 f- G% \( K
  80.         5 Y! t' ]3 \' i# \  V8 |9 H
  81.         //HAL_EnableCompensationCell();
    & |8 o: `9 L8 z- w( w. J& S
  82. }
复制代码

: r3 m6 b; h0 P$ {" \& }& W可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,
1 b) e# p) s/ W! w4 C3 h
; j: Y4 H9 a+ g2 c# j/ N
  1. void MX_GPIO_Init(void)
    % [3 p6 Y! U% X' y5 P  f! G7 \( P
  2. {
    - \$ l' P  W. G3 o
  3. ! T# J# R& W" y' K  p
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};, }" _6 E! Y+ O- Y$ G* k

  5. 6 `2 V* [& H0 J; n8 y$ R
  6.   /* GPIO Ports Clock Enable */
    ! ~1 ^3 }+ {3 g# e7 W$ b7 W
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();
    % g2 k% m* [8 S: G# e3 ~. H  K
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();, p6 \' L( L- j# t- _/ S' P
  9.   __HAL_RCC_GPIOH_CLK_ENABLE();
    " i: R+ U  k  a2 `7 a2 I0 u/ w: Q
  10.   __HAL_RCC_GPIOC_CLK_ENABLE();% M/ _+ f" l, [3 O
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();
    ' j6 \. f, a% G% \* k& I" j1 ~
  12.   __HAL_RCC_GPIOB_CLK_ENABLE();6 g2 z! o' J' U4 z1 ^
  13.   __HAL_RCC_GPIOG_CLK_ENABLE();! W% |9 G+ _, ~6 X
  14.   __HAL_RCC_GPIOD_CLK_ENABLE();1 {9 s5 S) c8 X* ?

  15. 0 J+ a( m/ l& E2 s' m3 P
  16.   /*Configure GPIO pin : PC9 */% O& N; N5 `0 }1 R3 k- f6 |
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;
    2 F4 K% j4 x) b6 W* J" e
  18.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    ( w- x& x# m( t- n
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;3 T' S7 ]$ b( P0 Z- ?! B
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
    * N2 \) M. ]/ f
  21.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
    - @- y/ b$ A% Z9 }* |+ t
  22.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);  P/ h# D4 C/ r

  23. & |3 C* L1 X1 e8 m
  24.   /*Configure GPIO pin : PA8 */6 @  a7 S! @6 s' \6 i
  25.   GPIO_InitStruct.Pin = GPIO_PIN_8;' w% H0 Z7 q! `
  26.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    : F" q+ N: h- I5 E# a' p
  27.   GPIO_InitStruct.Pull = GPIO_NOPULL;6 N1 K* O( z) V$ x2 @- U! Q, R
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
    ; M4 W1 f- b  H2 c
  29.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;& O5 J, b, Y- v) ]6 x1 ~
  30.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);% p" J1 h, ]5 [+ t6 V9 S! t
  31. % D# j: B" v! Q) I8 L  l, ?! B5 N' D
  32. }
复制代码

0 o) O6 F2 T0 B, f所以,超出引脚承受范围是不可能的. p& ?# l" s) ^* N  K) o
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。5 x0 ^6 e+ c# Q4 y. K( x

8 C$ g+ }0 ~* g* [赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,* A8 t& d! f) ^# \6 K! D
* }' Z- k4 M! T5 X4 g
  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)2 k: B, H5 P% F$ h" |
  2. {  g6 x9 }3 h' t* q6 U# V
  3.    。。。。。 原来的代码原封不动。。。。。
      }" ]6 [- R- E% m, j3 V+ s
  4. & H. x, g8 ]+ U% y3 K
  5.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
    # l) u7 z) q9 m# i" S% a
  6.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);* N7 F; g) m4 b) s  X, d5 G
  7.         * w2 y! g6 ?/ M5 u
  8.   if (status == HAL_OK)! V; i, f# R4 r5 d/ o
  9.   {
    7 n8 l) Z! i* H* W. u+ C0 x1 P& s
  10.     return HAL_OK;
    : d5 C( Q; O6 W8 k
  11.   }+ `1 [. Y: p/ z) g( A
  12.   return HAL_ERROR;
    + ~+ X: n% Y' R' t, M
  13. }
    # X* f) E. e' z$ S7 |( I: \; }
复制代码
7 T3 G# b3 N& m
9 k( m& ?" E1 Z, P. M2 \
3 {# f! `8 r: t9 L3 x$ S; B% u
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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