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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
6 ]4 N) O; a" ~8 }% i
' I2 k* k& {' |* ~% k
  1. void SystemClock_Config(void)
    7 _& b) l6 u1 _6 [  C
  2. {- s: @3 i) J. g
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    7 S. w* y2 H/ ]/ _' ]
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    6 l+ P# x' h4 ~9 M! ^
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};0 A4 f1 R. B7 F, S! a/ d& E6 ]" u
  6. ) N9 u! Y( W: C# X+ D! P
  7.   /** Supply configuration update enable ! f# |7 F; O! G+ `& k$ J
  8.   */ 4 U7 d9 e, N5 t
  9.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);- `7 `+ Z$ H8 H5 _# `' P2 `
  10.   /** Configure the main internal regulator output voltage 9 W" l3 J# D+ R* h8 S
  11.   */! Z  b7 V+ Q* E' ^; T5 i
  12.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
    ( H# X4 v. b( y& G" A
  13. , b% r" \! T, ?% R/ g
  14.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}' {# \! ~* t4 A$ x
  15.   /** Macro to configure the PLL clock source
    ! R, b+ M" S2 ?3 f; S7 f& M1 `
  16.   */: }; P3 Q9 G* ]; J2 K7 y) Q
  17.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);# T) I" y2 @( L3 s
  18.   /** Initializes the CPU, AHB and APB busses clocks # k. ?( X5 q% N6 j9 H; U! e  g
  19.   */
    * i& Q! [0 B& [" h  @
  20.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    * j! A7 S- p; J# C, {
  21.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    ) S9 K+ \, R& y" p. p' t' d5 j
  22.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;- E, l6 k- e; S4 V) f
  23.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    - G, K( X4 N9 _2 N$ S, R: j" R
  24.   RCC_OscInitStruct.PLL.PLLM = 1;
    4 p7 w7 {# C  Q
  25.   RCC_OscInitStruct.PLL.PLLN = 80;
    ' D- f4 l. P/ w* T1 t+ v# M0 u8 k
  26.   RCC_OscInitStruct.PLL.PLLP = 2;5 \+ t0 i: ]3 X$ G
  27.   RCC_OscInitStruct.PLL.PLLQ = 40;
    1 U" ^! v0 v) C& ~& a1 u" O
  28.   RCC_OscInitStruct.PLL.PLLR = 2;
      f/ U, T0 }6 n3 ]
  29.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
    # Q* o! ~, W+ G% x( z" N: M& \. ]
  30.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    / F3 [$ B* \3 V" F8 C/ v( t+ f
  31.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
    - l' w- w4 ]& W5 P5 }( ~
  32.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    9 J3 v. ~2 ^& h2 z( h6 Y& _/ L
  33.   {
    4 }0 l% R2 N7 P( C& j7 H
  34.     Error_Handler();* s3 \9 R* \0 Q
  35.   }9 H- ?; K0 z  d8 v
  36.   /** Initializes the CPU, AHB and APB busses clocks $ S/ r$ m* U# L: Y) l% t6 ]
  37.   */, E# \. d+ }( U. U% f+ a6 ~
  38.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK! c, S0 z$ B+ d! t" ]( Z
  39.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK27 j* n  p3 [$ O
  40.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;  K1 t" T4 Q; ~8 J" ]
  41.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;6 N0 v2 c- o" `: ^" N$ z' V2 o# i2 A
  42.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
    * L/ z* S4 r& L
  43.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
    9 a$ L8 l0 _7 K1 R
  44.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
    : _/ }1 ^6 R+ h5 A
  45.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;$ |/ G# q4 ~1 _
  46.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;/ n+ e1 M8 r) L
  47.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;2 x+ C) X9 C5 e+ v. N

  48. $ a# T! r* g5 z, q
  49.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)+ P. e( t' j- v
  50.   {
    . y. K  F4 _. x7 n; W+ z
  51.     Error_Handler();/ U. N% l( T0 K* ~
  52.   }
    - R# r! Y3 H  f  L# E" i
  53.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1; b* h; V9 J7 Z, d4 h  m
  54.                               |RCC_PERIPHCLK_FMC;
    % [- S% p8 d5 U' P/ z; {8 K4 [
  55.   PeriphClkInitStruct.PLL2.PLL2M = 4;
      Q$ l9 z; c$ I' u8 O! |% C
  56.   PeriphClkInitStruct.PLL2.PLL2N = 80;
    8 T3 p4 c: F, j5 k1 W8 O
  57.   PeriphClkInitStruct.PLL2.PLL2P = 20;
    1 [& @( D8 N# y2 n6 ~1 s6 J
  58.   PeriphClkInitStruct.PLL2.PLL2Q = 10;* Q; y! b& D/ O7 D: R/ r; N+ q% \
  59.   PeriphClkInitStruct.PLL2.PLL2R = 2;5 r) Y( A& t& g8 r
  60.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
    ' _* n" C8 q6 a* I+ t
  61.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    ; j  @- P2 k  m
  62.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    / o9 Y7 s4 K8 E
  63.   PeriphClkInitStruct.PLL3.PLL3M = 8;
    8 p0 Z5 m& f9 O/ J3 _% I. {
  64.   PeriphClkInitStruct.PLL3.PLL3N = 128;
    9 [* j8 ?; _3 g
  65.   PeriphClkInitStruct.PLL3.PLL3P = 2;
    ) U/ m8 ?% G- }$ ]8 n
  66.   PeriphClkInitStruct.PLL3.PLL3Q = 2;* v( e" q) H% x# w
  67.   PeriphClkInitStruct.PLL3.PLL3R = 8;
    ! y+ z# t6 u/ l! W, U+ H, ?
  68.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;2 e: R- H+ t  f/ x  b3 H3 D# P' T% ]
  69.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
    & f( k# \5 |: p
  70.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
    ) m/ M0 f8 d" ?+ j. }
  71.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;. n4 w; N! d. N' q1 I% z
  72.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;
    % C. {+ @. x3 z! {' g/ U5 U( [
  73.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
    - l, Z0 ~* J# _. {( \4 t
  74.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)# D' g! a5 N7 i; n7 u! [  C" m
  75.   {
    ' r3 n* ~5 q. e7 f# {) z
  76.     Error_Handler();
    % Q# ^$ V$ k  v% |% ~1 {
  77.   }4 \7 u+ [! ?: y* G+ o: x! H: A+ P' G
  78.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);6 S; j% N% b( y
  79.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
    , l" L7 @5 g- z8 r
  80.         
    6 x8 b. Z2 ^4 D3 Q! z+ z6 d( f  k
  81.         //HAL_EnableCompensationCell();
    1 z3 A! B( L9 z( |
  82. }
复制代码

% O1 }+ I2 p& `/ y9 ~' Y  j可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,' g- m2 o+ S3 K7 t6 q

5 B7 m9 }5 b1 F. {
  1. void MX_GPIO_Init(void)
    , i+ x! t( ]+ e: _+ {. V3 H% b
  2. {. D0 k1 {8 D# D% p. i

  3. 2 `: Z, t: Q6 j0 E
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    . v1 ?8 Y: E. `0 K: R$ ]/ A. E
  5. " A0 `& S. y' ]9 U8 b! Q
  6.   /* GPIO Ports Clock Enable */
    5 c+ a  p/ s4 D8 W8 [
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();
    , W0 v2 p* J/ g  a3 G! z% ^
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    / Y: V! E) ^8 i- [+ x: j
  9.   __HAL_RCC_GPIOH_CLK_ENABLE();
    " [, v! D* d7 B- T
  10.   __HAL_RCC_GPIOC_CLK_ENABLE();
      c5 G4 @" v% U. R; G6 h
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();2 I0 _3 c* C% G) k$ q5 E; w% z; A
  12.   __HAL_RCC_GPIOB_CLK_ENABLE();
    2 [; V3 s" s0 ]9 M2 |
  13.   __HAL_RCC_GPIOG_CLK_ENABLE();
    8 r& W5 S4 Y. b& ]. I; c3 N9 h
  14.   __HAL_RCC_GPIOD_CLK_ENABLE();
    3 g3 [6 D: |+ r8 r6 m* o
  15. . T* S. {/ Q( ~6 K5 s
  16.   /*Configure GPIO pin : PC9 */) v2 a0 i% l- E1 d; j! H
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;7 J) f& u  X. R$ G9 a% Q3 e
  18.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;) i: d1 e7 x1 M2 S. H
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    " U  A! _& t; a: n4 Y3 e3 }' J
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;4 g4 J# }: ]% m7 a" p, z
  21.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;, j# O8 C) R  @6 ^( F1 Q( J
  22.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    * b- G- F+ U2 c$ a( f+ Y

  23. . S5 M/ Q" U  m
  24.   /*Configure GPIO pin : PA8 */
    - p- }4 {4 ^+ z4 I; r6 W1 @
  25.   GPIO_InitStruct.Pin = GPIO_PIN_8;
    0 Z) Z/ T+ z% T6 ~3 H, Z# G# h
  26.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    0 ?& ]; y8 ?  M2 l$ Z0 x
  27.   GPIO_InitStruct.Pull = GPIO_NOPULL;, d8 W* d% ^: o
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;& o8 ^8 l( ^' |
  29.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
    , x; i. d2 ~, ~! J9 i) v
  30.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    1 E9 u" N, `: O' {' |- s3 Z
  31. , n! i& I. m. n- K% k0 ~9 A$ ^3 Z
  32. }
复制代码
* _3 n" _3 j' E) \1 W0 T  v$ d
所以,超出引脚承受范围是不可能的3 h5 u$ T: F  [% w
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。
' V. c8 K: p% I4 b7 Z# l! E( O; G' p! ?! }  S2 U# k
赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,7 [! y4 q: F& t: }* ?  V/ T

6 E1 K5 h6 O: `& C5 U
  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)
    " q1 k2 ~- c; p  W; l
  2. {
    1 F2 q' R3 j3 a7 z( p* I7 Y
  3.    。。。。。 原来的代码原封不动。。。。。) S/ p) F5 M' @) h7 f

  4. - g1 [7 i6 \. H" ]. r
  5.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
    7 b# y7 O9 p5 x' v' ?" p
  6.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
    & w- {8 V  N& N% E( Y5 [
  7.         
    4 k* Q1 C, ~( @: b
  8.   if (status == HAL_OK)" [4 \: n. V& X. K* O% T9 J7 P
  9.   {6 D0 i2 b# d1 o3 s) h
  10.     return HAL_OK;
    8 |. E; \* n& z) P. C9 R
  11.   }5 |! S) |: H  S8 A* q' t# }
  12.   return HAL_ERROR;
    ( }' y" [! y0 ]( V+ a: M' z+ Q
  13. }
    4 ~  g4 G# e# B7 Y: w7 @0 m
复制代码

+ ^) Y: P. G& ?+ _0 m' q) l/ N( O. z' g2 u( g0 l- h# g+ I* F
/ |% e5 A; f5 r. v" m
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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