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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下! c8 C; [/ K( I) _3 q* f# u5 n
; p9 [( g: J: |  G  W) I
  1. void SystemClock_Config(void)0 J' ^8 t' P, P) N% B/ G, V4 e" w0 o- b
  2. {
    # e8 D$ _& N7 A1 S( P! V
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};! N# U- Y1 Z  M/ }
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    : H$ _7 j* z  U, I. T3 R) _
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
    $ ^9 W3 k6 `; C" @8 I* k2 }6 J; K

  6. - ]4 E  X( L) H8 Z0 W
  7.   /** Supply configuration update enable 5 f% d1 B, c# |8 g& n7 G4 U/ o
  8.   */
    1 s9 n/ e3 B! e2 a% `* w
  9.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
    ) R* ~% L$ q9 ]' ~0 B$ V# j  r/ K7 _; V8 @
  10.   /** Configure the main internal regulator output voltage 2 v. a8 @8 Q5 S3 n  {3 \6 e. K
  11.   */- z( N* ~; y. w' o" f
  12.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);0 J$ L# o; P- v5 D4 u& m
  13. ! }. c/ T6 ^. q
  14.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
    " B% T0 C8 Q7 P/ L3 ?7 _
  15.   /** Macro to configure the PLL clock source % T5 B7 ~+ {2 b, ~1 O2 ^
  16.   */: M3 I" z3 T8 j+ @; a, A! _' K- n
  17.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);2 {; t! O" y" I( E2 ~* ?8 u" a
  18.   /** Initializes the CPU, AHB and APB busses clocks $ g# I+ e+ r7 f$ y5 r
  19.   */' S% A/ W' [, j; a" ?9 K
  20.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;4 t% I; ~- z( p& N$ b. J7 o
  21.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;5 f) v* O* c5 k. Y, b% s1 ]
  22.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    2 }. H) O0 i. v9 {" O6 X/ ^3 o
  23.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    ( j- e# b6 B5 E: w4 G4 w
  24.   RCC_OscInitStruct.PLL.PLLM = 1;
    - Y6 q( {' I9 d) C3 c; v
  25.   RCC_OscInitStruct.PLL.PLLN = 80;
    & K2 w% K) E; o" I# C
  26.   RCC_OscInitStruct.PLL.PLLP = 2;
    7 D  X( m4 D8 k
  27.   RCC_OscInitStruct.PLL.PLLQ = 40;
    ( l5 k% n+ h- h# l( w
  28.   RCC_OscInitStruct.PLL.PLLR = 2;) j  N3 P% p3 s6 ~) W; l6 a
  29.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;0 g0 s+ A9 @" [1 [6 A
  30.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    ; u/ R2 B- @' D
  31.   RCC_OscInitStruct.PLL.PLLFRACN = 0;7 V7 y% c* b/ ~1 u* f% b
  32.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)4 U" l: ~- X6 f. K5 \, C3 g
  33.   {, {( ~/ R/ }0 x: H# h2 s; q; G
  34.     Error_Handler();- o/ S. d! E1 `; [# ~9 n
  35.   }( j, J: `) C* `  f' ]5 s3 E
  36.   /** Initializes the CPU, AHB and APB busses clocks & i! l) m. X9 N8 m6 H8 k$ o9 S
  37.   *// K4 `' j+ R' f/ z: X" e# \% M
  38.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    / r5 U6 Z" R5 S9 ~( w
  39.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
    9 y) c0 X" E5 M
  40.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;; y- L! Y  R$ y1 V8 s8 d
  41.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    " y6 P8 ]* q5 q8 m5 K: \
  42.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;; J' {% P5 q" b9 Y: g1 W- G
  43.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
    + {3 Q& t  C; x4 n8 T& h0 W6 _
  44.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;/ m- o5 K  i: p% Y+ f( p
  45.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;# T4 B: e4 i+ o+ @
  46.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;' S% R5 F/ I+ O4 `6 A' ~% x
  47.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;* M) ]- ?( R+ @

  48.   ?. l# N# f9 w* k% v4 A
  49.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
    3 j3 ^6 r% ~9 t
  50.   {  F6 K. F( g  H% [) G+ ^7 G4 M
  51.     Error_Handler();
    - Z0 H1 m/ [# H, c: L! j3 o; \
  52.   }9 B% s$ J9 d) n9 T/ g  W$ K1 P
  53.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
    ' R9 l9 P2 L3 S, [: E
  54.                               |RCC_PERIPHCLK_FMC;
    % F# |( s3 F, s, l- H) S
  55.   PeriphClkInitStruct.PLL2.PLL2M = 4;
    % `* Z! Q* q7 a& U$ m" w  {
  56.   PeriphClkInitStruct.PLL2.PLL2N = 80;6 u& ?6 l" v+ {' v- k, S5 N7 y6 s
  57.   PeriphClkInitStruct.PLL2.PLL2P = 20;! q1 \% k- r% i& o% k
  58.   PeriphClkInitStruct.PLL2.PLL2Q = 10;3 C  E2 _* n; s% F. X
  59.   PeriphClkInitStruct.PLL2.PLL2R = 2;& u0 @- I2 a, X2 t6 U5 z* r
  60.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
    3 I1 X! n( _0 D+ F: y+ q; A& }
  61.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    - M" F' i8 C- |
  62.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    + \/ B5 W6 [& H& L) s
  63.   PeriphClkInitStruct.PLL3.PLL3M = 8;; `% b; s) V/ t0 F" ~& Z! h
  64.   PeriphClkInitStruct.PLL3.PLL3N = 128;
    . y) d) d( T# E& ?; p2 Z& [
  65.   PeriphClkInitStruct.PLL3.PLL3P = 2;2 ?1 S7 w; l( C
  66.   PeriphClkInitStruct.PLL3.PLL3Q = 2;
    * J  N0 p9 i/ Q8 r4 J# S. N
  67.   PeriphClkInitStruct.PLL3.PLL3R = 8;
    & F; ]0 K  B3 R! m' H) M. b; y
  68.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
    & E6 B- y3 L( h* v
  69.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
    5 R7 U  V- I% O, T) W
  70.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
    # z  E6 k# U; b: H& e/ y
  71.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;  X( t+ h" `9 d7 h1 b
  72.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;* W6 H; a5 _2 R: Q
  73.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
    3 P/ @3 E/ @4 g  ^* J* C
  74.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    / q6 |# X5 J) L  |0 F" J( b
  75.   {; Z2 P7 \1 e- t& @4 l6 {5 h
  76.     Error_Handler();& h% l! c* k8 J0 U1 ^" v4 E1 W
  77.   }1 A  l8 A' v' B- D8 N
  78.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);
    " B- J7 M' t; v) V" i& x( ~( p
  79.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
    * S) W; Y  i" T9 v+ T
  80.         & P0 U; R9 R' D7 I2 G2 Q" F' t  |
  81.         //HAL_EnableCompensationCell();
      e& ~# Z2 i% q; F+ B& h
  82. }
复制代码

9 _0 p* E! }) y3 F% z可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,$ r% D! m& m% M& W1 W" u; s5 W

2 R  s6 C6 Z" h$ R9 D/ Z7 s; K0 K4 N
  1. void MX_GPIO_Init(void)
    ' q* [; `& y" d! L$ y2 e
  2. {
    7 _- G0 T6 X% p/ b& P
  3. 0 w6 k5 Y8 [0 h5 |8 I" ]
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};7 i7 y: A/ N4 a

  5.   S5 u& c1 h% z
  6.   /* GPIO Ports Clock Enable */* i3 @9 ?" r8 K( w7 d
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();
    ! S" A7 g+ Z- \; l' v$ [6 m
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    * j7 m& @- z8 Y0 L" E- x
  9.   __HAL_RCC_GPIOH_CLK_ENABLE();
    / J% g% d. O; w! ]' a4 m
  10.   __HAL_RCC_GPIOC_CLK_ENABLE();
    " V& k" A2 o: a1 v! E& V
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();
    8 @1 _0 m" L2 Y% D
  12.   __HAL_RCC_GPIOB_CLK_ENABLE();. S5 X6 X4 a: [* e$ v
  13.   __HAL_RCC_GPIOG_CLK_ENABLE();' N& U4 a8 [, R0 k. t4 z
  14.   __HAL_RCC_GPIOD_CLK_ENABLE();
    1 n4 Y# l5 R7 O9 `3 B5 Z
  15. - c8 ?. a! E/ P: d' n( R$ h6 \- W
  16.   /*Configure GPIO pin : PC9 */% f: i, u  ?! }2 C
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;
    2 m3 _3 N1 e% ^* o, L
  18.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;( r. i, \) h+ R% M
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;$ L" J7 x/ d- d# S0 D, h6 d2 N; m
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;* j4 }' C: S0 s' b; R
  21.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
    ' Z+ s. F; Y& [
  22.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);" M% `' o1 V: g  s2 V  I3 s) ^

  23. 0 M% p6 I4 y) O4 s/ D. E
  24.   /*Configure GPIO pin : PA8 */
    8 ^8 r+ a2 w" p8 S" U- l
  25.   GPIO_InitStruct.Pin = GPIO_PIN_8;( W' S; \1 D: c5 R# y
  26.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;7 c( _0 L+ V7 W
  27.   GPIO_InitStruct.Pull = GPIO_NOPULL;! G" z0 G0 \  u5 H
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;4 I2 M% b. x3 U2 [. H* l5 |# z
  29.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;5 L. o5 T6 K/ e( |# j0 `2 V
  30.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    / i2 ?# I8 w- A
  31. $ i# a. B7 E" W& V8 u, E
  32. }
复制代码

( e( H% i- Z% H" `所以,超出引脚承受范围是不可能的/ e" F2 ]+ ]) {7 m
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。4 S4 a) g$ A# j1 P/ X- ?  R

4 f9 G, d: v5 U6 o3 Q" m, p/ G赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,
  L8 k8 c7 F# b) B2 [; v5 X
  I+ u2 a( T3 b6 y" g+ n1 ~# x
  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)
    & g8 b) e, z8 w! V% {
  2. {
    - e# ^+ Y# X: C. Q5 c6 q; ?' \! Z9 l
  3.    。。。。。 原来的代码原封不动。。。。。
    0 U' Y1 @$ Z3 V! f

  4. # I* a) z( w0 Z, y9 x" H
  5.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到8 H' b8 ~  a* S6 c* d, f
  6.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);; p" v+ q: @5 f5 H6 K+ b; ]( ]: H3 z- S
  7.         
    6 z9 `( T9 i2 r, S: U
  8.   if (status == HAL_OK)
    2 D5 |0 d/ L4 Q' e
  9.   {
    & M) z8 m2 C: u, s; \1 i  j% m
  10.     return HAL_OK;; x, i7 |! _0 X( z8 B
  11.   }
    : s" P+ m# c5 t" S* O- a  X
  12.   return HAL_ERROR;
    . ?6 _6 k, Q+ C4 p9 T
  13. }4 M$ C! p, S# a4 b% l/ L
复制代码
! x8 v& V/ s/ q. D

3 N9 x1 Z2 O! b; a
3 @$ T1 y, N1 W9 r2 t' m5 l6 p
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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