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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
% a" o% R" r3 B# |5 `7 a
2 g/ L( [. P) l9 _! A
  1. void SystemClock_Config(void)& @7 o5 H" }' m2 Y! w8 }( C
  2. {
    . x! X, F% u- e- _7 J: B: U5 \
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    & q+ `5 O; X8 ]+ b: [6 u7 ]* _6 B+ b
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    , L7 i% ^& t) G/ v4 {$ @+ Z. c0 ^
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
    " H8 D! S( q& W  b# d
  6. 0 I0 E4 V- i- F1 ^  S$ L* I
  7.   /** Supply configuration update enable   X7 b. i' B! W. _5 c  w  f
  8.   */
    ! u7 K# O5 h8 Z0 {# E0 p
  9.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
    . ^% t* [+ J6 T  C( D; A" W# |! Q
  10.   /** Configure the main internal regulator output voltage - C0 {; Q6 I: e
  11.   */
    6 K0 t9 u8 J6 M+ r) N: t* Q
  12.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
    , D- Q8 B! H( s% R4 Z

  13. , ?) Y- k- w( C7 b3 _6 _+ ?
  14.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}1 s( B& L5 s2 j* d. U" v5 z: Q
  15.   /** Macro to configure the PLL clock source / a8 Q( h9 T2 X5 }4 i) ]
  16.   */
    % K8 E, H' ?! f  P9 ~
  17.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);. K  p, ?6 @# I; E) e0 z4 r7 A9 C
  18.   /** Initializes the CPU, AHB and APB busses clocks
    - S( l' A. ^1 [9 F* b$ z4 a7 F
  19.   */8 N* _9 f2 {, F+ G1 P: |) v9 J
  20.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;. m" k0 `# Q+ t
  21.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;# {+ ~$ L8 [( Y' s4 I- Z9 m9 D
  22.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    4 I( b+ j2 y6 t0 w9 u
  23.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;3 A, K+ b6 ]* g
  24.   RCC_OscInitStruct.PLL.PLLM = 1;
    6 @+ w3 n$ V+ U: L9 |7 ^! U/ O
  25.   RCC_OscInitStruct.PLL.PLLN = 80;
    ; o$ I% F6 Q7 P
  26.   RCC_OscInitStruct.PLL.PLLP = 2;5 s% W+ w. i- @4 [9 C! ?* d( K7 O
  27.   RCC_OscInitStruct.PLL.PLLQ = 40;
    % e& b6 l# B, a5 i* k
  28.   RCC_OscInitStruct.PLL.PLLR = 2;! c9 }* {  a+ M& p7 p" g, R* U
  29.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;5 d/ A) m# O  u8 \
  30.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    2 g* w7 k& n; y& _' O) h
  31.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
    3 z8 M! O. C# h4 {: z( t; N
  32.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    1 p2 V* n) D9 k
  33.   {3 k5 X2 e- T' d7 s0 p* l; p
  34.     Error_Handler();
    4 H7 M" }( x8 u7 f3 ]
  35.   }* g3 f; c8 v- {' h  ^# W  p
  36.   /** Initializes the CPU, AHB and APB busses clocks : s9 \$ H& \8 g+ Z, g1 D/ d3 Y) n+ R
  37.   */
    % z/ _7 M& b7 e/ q8 y
  38.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK( a( Z, o/ J5 M+ e5 c; Z  J0 u( z
  39.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
    4 Z" L  z& c* I! `! ?
  40.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;& ^8 b4 L! p3 M2 B' {, m; z8 d
  41.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    8 A8 t# ^- x% x
  42.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
    1 f# R& D! D7 d* b; V3 B/ u! ~
  43.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;( m; s+ d" X, k) P3 L% M8 S. `
  44.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;# B/ j: V* ]! C6 q8 C6 X: y
  45.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;  Q$ V. V9 a. f4 e8 G, }$ _" _
  46.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
    ; i; x5 Q& X( b3 p
  47.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;/ j/ W* @: m% \! p$ k9 U; }. D7 Z

  48. 5 L/ }5 Z: A& m8 w% ^
  49.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
    ) }: E8 ^" }( l# ^! k  T" Y0 i% T# z
  50.   {
    9 D0 n3 m3 g8 O3 T
  51.     Error_Handler();
    9 U0 @& s* s& s
  52.   }' w) I3 p" I! Z2 y5 ~1 O2 Q
  53.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C19 o# }( H: |/ l& D1 w; s: B! L
  54.                               |RCC_PERIPHCLK_FMC;
    ) n# U5 z8 D. n0 D/ c
  55.   PeriphClkInitStruct.PLL2.PLL2M = 4;
    ) c+ U1 E  i0 q0 A* F6 V$ c/ c
  56.   PeriphClkInitStruct.PLL2.PLL2N = 80;
    ; O5 w' T8 j' |+ `
  57.   PeriphClkInitStruct.PLL2.PLL2P = 20;/ K, u& I! k) g9 x7 d/ s
  58.   PeriphClkInitStruct.PLL2.PLL2Q = 10;
    3 v+ p3 Q- h+ S. l
  59.   PeriphClkInitStruct.PLL2.PLL2R = 2;$ r5 n3 V: D. }6 \8 q
  60.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
    . ?. T  a4 e; g5 ?6 K# F$ ^
  61.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;+ O$ T- r' w- c: o$ p0 }6 M
  62.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    # ~+ n) ~4 T% h8 m* P$ K; c
  63.   PeriphClkInitStruct.PLL3.PLL3M = 8;
    : {/ T9 M& w6 c+ C- T4 W. j
  64.   PeriphClkInitStruct.PLL3.PLL3N = 128;, q& ]# Z/ l- A4 A$ M5 L
  65.   PeriphClkInitStruct.PLL3.PLL3P = 2;
    7 Y5 n9 f2 r( ^* Z$ _2 k6 ~4 g
  66.   PeriphClkInitStruct.PLL3.PLL3Q = 2;3 {6 s9 v/ T  L4 a0 S9 i
  67.   PeriphClkInitStruct.PLL3.PLL3R = 8;& l( b: x6 B# W' J( c
  68.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;, E+ v" z3 x: l6 d
  69.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;5 s: C/ ~% s- n1 b" \
  70.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;  s1 u  S& v( T: ^* I+ `
  71.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;
      [' o! O, F5 d
  72.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;
    3 f/ A, }7 v6 ~3 V- ]2 {. s
  73.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
    4 W8 r9 S6 j$ X, V
  74.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    ; i! J2 O" w  x6 ?# W
  75.   {+ S* c4 M# c# u" s5 t6 G
  76.     Error_Handler();
    & D% \% f+ H0 R$ R2 W8 W
  77.   }
    & E4 Z" v1 u: Q4 _7 S% p% u* m+ _$ D: E
  78.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);0 W# D' h3 f& \0 z
  79.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
    , r9 y2 |& F3 z) f. l1 n7 x+ X' ^  O
  80.         
    5 ^$ Y% B: m2 J! }
  81.         //HAL_EnableCompensationCell();! ^4 L, ?) s  s* w; Z
  82. }
复制代码

9 I, ]/ R) y  y, E2 Q可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,3 g- z5 w2 q, z& {" A. _2 y
  I% v; n( y5 I- g9 f
  1. void MX_GPIO_Init(void)9 p8 l5 C3 d! {
  2. {
    $ n: l5 Q2 @+ p$ u2 R* J% d
  3. 6 q' s8 s4 z" t' v8 R2 w& w
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    # {( R5 x; W# z9 T

  5. $ r/ a- c8 s1 j8 |9 t5 g
  6.   /* GPIO Ports Clock Enable */
    3 Y. Z( J( t+ ~
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();* {  s6 ?8 f0 R& D5 A
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();% |% y( n6 a, g9 p2 K
  9.   __HAL_RCC_GPIOH_CLK_ENABLE();# W' I+ o' T) f6 G, s
  10.   __HAL_RCC_GPIOC_CLK_ENABLE();1 f1 Z. M9 b  M9 ^0 X
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();
    " f- Q2 j. L7 @; m' U
  12.   __HAL_RCC_GPIOB_CLK_ENABLE();3 F7 @" z; D+ l' p$ [" q! ?
  13.   __HAL_RCC_GPIOG_CLK_ENABLE();* H2 k# z) A1 b3 P- [0 ^# Q
  14.   __HAL_RCC_GPIOD_CLK_ENABLE();
    5 q. A; @; j1 H5 V

  15. 7 K" L$ o: @4 Y  P- x$ q1 `
  16.   /*Configure GPIO pin : PC9 */" H! N5 p% ~0 a0 s
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;, n2 P" U1 h7 ^8 Y5 Y
  18.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;3 G8 W$ k- R: i1 r) X! n! j
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;3 H( Z$ X! ~5 O0 s& Z8 |1 ~
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
    6 u, x& R6 B8 p3 _
  21.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;8 u, S& y5 Q4 v& e
  22.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);0 F: Z( @0 w6 V6 c/ m

  23. + j9 I; ?; d& h# k
  24.   /*Configure GPIO pin : PA8 */
    " M* d, j& s3 t( G. J, n
  25.   GPIO_InitStruct.Pin = GPIO_PIN_8;& G; p9 T5 c8 D3 F5 r
  26.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;! ]7 r" |8 m) r! R! q3 q" t- U
  27.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    # `3 x% _& {* R5 y8 c; f! M  Z
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;- j5 @; A% Q* q0 [  \" ~% o2 T  o
  29.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
    7 t, g/ k4 z" ]' d: i7 [7 u' E! V+ A
  30.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 Z3 s8 C, n8 n2 W6 l
  31. 6 b+ I3 C6 `: B1 W: E' K
  32. }
复制代码

6 Q- c# @) J/ s8 Q" A所以,超出引脚承受范围是不可能的8 A7 X! G$ m. x! b- M0 O( C7 F; O6 ^
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。* }. }( t, \) b% O- g
! C% K. \, r6 |6 a8 S4 [- O
赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,% ]4 x9 t: ^# p# d

2 n" B$ G, G! E; W" @9 ^/ D  k1 n0 s* O
  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit). a& o  k3 P0 f, q$ u4 r
  2. {
    ) e$ p: V3 j4 B7 q0 V) B2 [& J/ K
  3.    。。。。。 原来的代码原封不动。。。。。
    ( F( x. U9 l' h# f" F

  4. ; p. H( @3 u# T1 a  u
  5.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到& T2 l4 T$ O( ^+ D, s8 Q* u
  6.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
    : m2 v- Y0 ?# q$ l$ E+ _
  7.         
    ( [. m* R1 q9 _' p
  8.   if (status == HAL_OK)
    * N& |) m6 i+ l4 L" G* F' N
  9.   {
    + c8 j/ j) I. v# D1 ]. i# Q7 h
  10.     return HAL_OK;
    " j/ {/ \& L3 r/ J* a
  11.   }
    7 K  H3 J  |0 w- S
  12.   return HAL_ERROR;
    1 r4 D1 G5 l1 r: d5 e  A( h/ ]
  13. }" k. d8 O" g9 q/ {4 n
复制代码
( m7 o, R: ^1 z+ N+ A/ ], j2 Q' n

! I: G! O& q; x  S3 {) H2 w
, F/ Y! h' O- ~- Q
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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