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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
& k+ k! d! T" g, O) I% l- O; b8 e. C. r. ?
  1. void SystemClock_Config(void)
    ' H7 _/ S8 ]4 ^: |
  2. {
    , x# O8 `% b' j
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    0 C( a* d1 k. d7 e! M
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};$ r+ g1 G1 X- i. I$ @
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
    4 A* ^: r8 {0 s
  6. 3 Z, Y$ R$ w$ f8 j) s3 F# H7 Y
  7.   /** Supply configuration update enable : `" y- G# N; @# `( `2 x5 U' z
  8.   */
    9 i8 n0 G8 T3 Z9 `; d
  9.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
    8 w) e7 ?7 ], B1 i7 x, I; r0 f% b) I
  10.   /** Configure the main internal regulator output voltage & K  E3 X) [4 e- q7 ?
  11.   */
    9 T  F. T- c7 ?% _
  12.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);" K! M, \4 i) E3 \; c# C6 ]6 X' \
  13. ! h7 Q2 u* e! `/ M
  14.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
    1 N, M) \( a: r5 P
  15.   /** Macro to configure the PLL clock source
    0 B4 G! P# j. _) k
  16.   */
    0 Y. @9 Q" S/ m+ q
  17.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
    4 t. Y7 v& K1 z5 B3 ]+ b2 m! ?6 G5 J
  18.   /** Initializes the CPU, AHB and APB busses clocks
    4 i0 |& G0 j% I4 a
  19.   */
    ; |  o( h6 R# J" e. B8 c
  20.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    1 o2 i* _2 h9 @9 S
  21.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    ' _7 ?9 B; _1 J* ^/ g! h" O# \% j
  22.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      d% t3 ^8 y2 O% M' {# V
  23.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    2 p4 I2 i, l3 J8 q# S* S" o
  24.   RCC_OscInitStruct.PLL.PLLM = 1;
    ) @( {$ c! H) V7 n) v/ J
  25.   RCC_OscInitStruct.PLL.PLLN = 80;, Z# f( b' I4 k7 F) Y
  26.   RCC_OscInitStruct.PLL.PLLP = 2;/ d! V0 @  u2 c& ^8 e3 ~, C8 H
  27.   RCC_OscInitStruct.PLL.PLLQ = 40;( T+ N) l! a: b
  28.   RCC_OscInitStruct.PLL.PLLR = 2;
    " s  M% E4 a  L6 G! e, o
  29.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
    # y  |" d, g3 `- N
  30.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;1 T$ B3 w6 `5 \7 Y
  31.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
    - ]/ I9 r  U$ K0 T5 m
  32.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    , Z* r) b0 h6 L0 q! r# c
  33.   {
    % x, n6 X* U8 M% z6 o0 O, c
  34.     Error_Handler();
    ( z8 Z& \1 G( \5 m
  35.   }* k3 n5 f* ^1 u
  36.   /** Initializes the CPU, AHB and APB busses clocks , D; m8 D, C( n: X9 M' ]& m1 R" W& `1 f
  37.   */
    5 R3 |9 F+ K0 p6 V
  38.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
      d  N/ B  u6 c& C( ^/ F+ R4 c: p
  39.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
    1 ~/ x) I/ t# I8 ~7 r+ l( P% m
  40.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
    & p# y3 b7 h. p* o1 ?7 a
  41.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      j, c# ~" {6 }, f! Y
  42.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
    + `8 }% L* R6 i3 E
  43.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;7 V9 p, B. s/ w9 F1 }. l8 C
  44.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;+ Y* ~, D& v/ |- \6 c' j9 i
  45.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
    * s& l' [! A! U9 R5 G' u
  46.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;) Y; W' z4 c6 A6 a- N2 e
  47.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;5 J9 p: k- b7 z7 I/ `) X

  48. ' Q" ?, C% Q9 U* A/ l  l
  49.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
    2 k% Y' C# R8 N& ]1 b2 @
  50.   {
    9 S; Q4 {1 c/ R" y* t* R. ?; ~
  51.     Error_Handler();- Y9 a( U- ~# O9 {' s3 l2 e
  52.   }
    6 h: d8 n0 c0 H; N4 ]* J6 w
  53.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
    - H& t0 K/ p* L0 e( f- ~) A
  54.                               |RCC_PERIPHCLK_FMC;
    " T* n% U0 B# z( w! I1 r% o; T, ]
  55.   PeriphClkInitStruct.PLL2.PLL2M = 4;7 U5 d6 ~% O: Y( a3 U- e$ c8 k2 n
  56.   PeriphClkInitStruct.PLL2.PLL2N = 80;
    2 o  R# ^% y/ t, L
  57.   PeriphClkInitStruct.PLL2.PLL2P = 20;5 _2 g2 ?# @: [( l: p1 b0 x" p; u
  58.   PeriphClkInitStruct.PLL2.PLL2Q = 10;1 v/ x& ]/ ?' _0 e
  59.   PeriphClkInitStruct.PLL2.PLL2R = 2;7 }3 F6 z' Q) A2 p, c
  60.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
    : s5 p% @+ u! T# I8 P% T( y- C
  61.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    % F+ d" t  p* x; g; y& y
  62.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;1 |0 o9 r9 k5 w
  63.   PeriphClkInitStruct.PLL3.PLL3M = 8;9 p8 R1 x6 R; `0 k. G6 x
  64.   PeriphClkInitStruct.PLL3.PLL3N = 128;+ k0 I+ i0 v! q1 k, X, L
  65.   PeriphClkInitStruct.PLL3.PLL3P = 2;
    # r( E- \4 [1 N8 L9 i
  66.   PeriphClkInitStruct.PLL3.PLL3Q = 2;
    ! @% z! t/ s4 Y! R- P2 `
  67.   PeriphClkInitStruct.PLL3.PLL3R = 8;
    ; G# l8 A; [. B8 J! k6 S' j. p
  68.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
    2 ]' i2 f$ T+ H: M- `/ f
  69.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;4 M4 u; X+ Z& R* F  {- |' o; @
  70.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
    9 E, Y# U8 D) }' x' t( x! X/ R. W1 c
  71.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;
    7 K: W& Q& n: U
  72.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;
    # F6 L1 X5 ?0 v# U# p
  73.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
    3 a3 p/ }+ U0 X) F* N
  74.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)% F. n1 x& y4 f$ W. L( E$ n
  75.   {6 Q. e( O. a) j3 y  ]6 H8 a, u' H5 k
  76.     Error_Handler();
    , V% J2 p) v% K# f  d
  77.   }
    1 n, N1 |. q( V9 Z! F
  78.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);2 `/ g& m# @4 T! h
  79.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);5 ^( N% O% I0 H( l! K0 Q+ @9 l
  80.         2 Z; ^; F, M  W3 @' A$ K+ x' E
  81.         //HAL_EnableCompensationCell();
    ( H5 C; d# J0 {" U1 Y8 J; I. l) O
  82. }
复制代码
# J% p( Q4 f1 Z& B
可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,, J' v, M% ?9 w- Z. |+ g8 ~. W

. _0 b4 h3 \% {0 C
  1. void MX_GPIO_Init(void)
    # h6 o0 G) T) |9 h3 _% l( M( a4 L
  2. {
    , {* F3 N' g8 J* R8 o: k# q

  3. 1 H" W* C# `' _! w3 m# t
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    - E# [. x; g3 R5 d0 R5 [

  5.   ~* Z2 D% v8 v: f
  6.   /* GPIO Ports Clock Enable */
    1 d) k" X) V$ G
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();
    ! B0 |% r& a  Q2 i/ Y! B$ L% S
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
      W# C- }$ t  g0 S; E! g
  9.   __HAL_RCC_GPIOH_CLK_ENABLE();
    # P* W' |. b2 A+ p1 R
  10.   __HAL_RCC_GPIOC_CLK_ENABLE();
    ! O* |7 G# i6 @
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();: g: E8 `$ x1 S  j/ w- C. `
  12.   __HAL_RCC_GPIOB_CLK_ENABLE();
    ' j( e" G: @3 p# N" @7 o9 Z% Z
  13.   __HAL_RCC_GPIOG_CLK_ENABLE();
    $ ]/ ~& q2 A1 ?+ B& K
  14.   __HAL_RCC_GPIOD_CLK_ENABLE();  h: g4 I4 W+ k: N; h" H
  15. : |3 O4 I' H0 s& N; v) Q7 Z, G
  16.   /*Configure GPIO pin : PC9 */. l8 i7 D: Q8 {0 r9 P2 K
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;
    9 z6 ~/ w" {* v, m0 M
  18.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    $ V  s# g/ w9 T
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;, J1 I6 v, [$ A% j9 M3 t+ h9 |
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;$ P( _& G5 z  w5 i5 s) @
  21.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;, w' Z8 }' U0 s0 p* }* e; d
  22.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);! R* Y5 ]  G: W) u

  23. - z9 J- p) G3 V# i/ d1 r
  24.   /*Configure GPIO pin : PA8 */
    9 x4 @( {/ h. v" c8 [/ J, P4 k4 d
  25.   GPIO_InitStruct.Pin = GPIO_PIN_8;
    # S! A8 N9 A* b5 W3 Q; \
  26.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;! G% ~4 f+ E( C3 p) u+ k( n2 C
  27.   GPIO_InitStruct.Pull = GPIO_NOPULL;% f6 o4 W" E7 }/ s4 ~
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;0 g6 o$ T' {! I/ q
  29.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;7 G# S& `% P* p! K4 |
  30.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  d5 x3 ^$ c. w; e% E2 o( d

  31. . C5 z' T2 l! e, e2 C
  32. }
复制代码

# M3 m/ s0 j. ~5 m" T所以,超出引脚承受范围是不可能的
7 A7 Q; f+ z3 m" u3 |6 q! T里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。/ {; u% g3 J4 i, F% g9 P
! `5 Z7 R4 n" R2 }3 W8 D
赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,
1 d3 j) h. e* F$ F0 ^/ k3 V  [( V) o0 V. A, l
  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)
    + ~) }* M. q1 y; V4 H
  2. {
    . E# [! Q7 T- a# k/ L
  3.    。。。。。 原来的代码原封不动。。。。。
    9 ]' M1 U( V1 @( q6 u* m
  4. $ [7 z" E$ K% E, q3 \6 z. l
  5.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到( c, e: f% m7 T+ S0 V
  6.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
    3 x7 ?* ?: C: g5 ]5 H
  7.         
    3 W! H" @0 l2 \6 O4 B
  8.   if (status == HAL_OK)
    ( z6 M% b$ {" E1 M4 Q! U0 s
  9.   {* q4 C9 k: Y+ H9 f- b+ I
  10.     return HAL_OK;% B) E0 z" N& N0 {, e  Z  @' E
  11.   }; z# S! O8 _/ m* n/ e
  12.   return HAL_ERROR;
    2 q1 ?( i, L: u! t7 H
  13. }
    ! b7 v; M0 J( T) d) R
复制代码

2 V: m) K3 D% q/ e# w' E
( f# n+ n; k6 @' [4 Y  V8 P& |4 H# U$ t$ B! U+ G
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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