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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
  Q: u, `1 \* g. q% b* H# G2 f# s) C9 u/ z5 H/ U1 C" @
  1. void SystemClock_Config(void)
    2 @  R5 P0 F$ M0 }6 M9 J% p
  2. {
    2 m% k. ?; y( @% ^7 w
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};# l. ]3 D. E( M- @  B9 n1 r) d* L
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    / s8 ^) D  z0 j  S1 T! ~
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};+ g  l3 G9 Y& b- I2 w- B6 K8 f

  6. ( P+ y! R5 W! B6 H/ v
  7.   /** Supply configuration update enable * F4 `3 i; P, R* Y; x
  8.   */
    1 L4 X" e9 q  \- i5 [2 [& S; \
  9.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);1 \1 |: p+ a" _7 u" H
  10.   /** Configure the main internal regulator output voltage 0 j) m1 ^% Y$ Z1 w6 ^8 u& _
  11.   */' o/ \/ r: p- v: P8 b
  12.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);+ O& a' }3 z6 J  M

  13. 1 H: j; W' @+ \" c1 V
  14.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
    ( u' N! t6 B) X- m% l
  15.   /** Macro to configure the PLL clock source
    " E: k! A! f  h" ]# ]: `
  16.   */) d  T! C4 M1 x) C
  17.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
    : O3 w, m8 D8 x; G) E6 e$ H
  18.   /** Initializes the CPU, AHB and APB busses clocks 9 t" T9 X0 ^# P8 t& W/ F  N
  19.   */
    " Z2 ?% o) Y3 P, p! r' S$ Q
  20.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;! r. @. u, V5 i0 d8 Q( Z
  21.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;2 r/ y" s+ ?9 Y0 Q& G9 P
  22.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;0 ]  R8 e+ q( N* x1 b- K; z
  23.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;* b" E. ]$ J# X. u5 d! E& }! g
  24.   RCC_OscInitStruct.PLL.PLLM = 1;$ H" @. p7 L6 y6 U' a
  25.   RCC_OscInitStruct.PLL.PLLN = 80;
    / {. A1 Z6 q6 Z  \6 f/ r. X
  26.   RCC_OscInitStruct.PLL.PLLP = 2;
    4 T* _, `+ \! I7 K$ L- G, ^
  27.   RCC_OscInitStruct.PLL.PLLQ = 40;
    ! P" E  ]; y. Y+ Z  f
  28.   RCC_OscInitStruct.PLL.PLLR = 2;/ |# A) v* [, E/ V: m7 P1 `
  29.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
    6 R) U9 J* o2 U- D( L
  30.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    1 Z# n, j* j' v: p
  31.   RCC_OscInitStruct.PLL.PLLFRACN = 0;& P6 }: F  u" {0 i) C5 u
  32.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK); \& E. @1 S2 L- j0 l9 J
  33.   {
    % E$ ~6 G3 t5 b' l! Q# O) b: B
  34.     Error_Handler();
    ' B; i! p: x9 |! t/ `2 W
  35.   }& o9 v6 y* Y; y1 v4 R; W0 U
  36.   /** Initializes the CPU, AHB and APB busses clocks
    9 t+ e& z6 h/ S/ F& }  p7 Y3 q9 ]4 g' A# H
  37.   */% s4 z/ U+ l% h5 p; _/ ]* t
  38.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK* f5 E/ s3 B+ k! o8 |
  39.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
    1 D$ v% p: b4 ]+ V$ ~9 M1 W
  40.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
    $ n2 E' s: M2 v+ }9 t& [# {
  41.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    - [6 F- Y& s7 ?4 N5 M* T/ q
  42.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
    ; `5 ]7 E+ f6 ^) ~' y% Q4 M
  43.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;! [5 t# e3 q+ }4 n. y" N5 H
  44.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
    % I3 h' h7 R$ X8 y+ d9 Y. h! w
  45.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;7 ~6 K+ D8 _/ ~" ]
  46.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;( @: K# N* A; R+ F& n6 t6 z
  47.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
    " ^. k; J& \# z3 k  T) l
  48. " L& C% _0 M, l7 V6 z) }' W4 V
  49.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)  S6 N. c! W5 L/ J  D% ?) B9 f
  50.   {
    & f, V6 n! Z- D( o: e/ \
  51.     Error_Handler();
    2 m( @5 x2 r+ i0 Y$ @
  52.   }; i: [: A  G5 ^
  53.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
    7 i! x# ?7 u8 U4 O. D$ T( p
  54.                               |RCC_PERIPHCLK_FMC;
    . a* ^2 n( x3 I) b/ y% i
  55.   PeriphClkInitStruct.PLL2.PLL2M = 4;; p0 I' h% L/ t5 I8 w" i8 @! P
  56.   PeriphClkInitStruct.PLL2.PLL2N = 80;- ]8 i9 h# y0 y4 p/ m3 \
  57.   PeriphClkInitStruct.PLL2.PLL2P = 20;0 v1 ~. ~. Y' C; J+ [* P% L, }
  58.   PeriphClkInitStruct.PLL2.PLL2Q = 10;9 D1 L5 h* {$ }- V  _; X. N
  59.   PeriphClkInitStruct.PLL2.PLL2R = 2;! `+ n" d$ T) }3 y% m) }
  60.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
    , a. N% D! z$ v
  61.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;# v) `% O. O  O- C+ H# C
  62.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;- {( f; i  W5 X% x7 A* h/ i5 M, B$ X
  63.   PeriphClkInitStruct.PLL3.PLL3M = 8;
    ' C  m- ]- O! J& I# a8 y* [, M
  64.   PeriphClkInitStruct.PLL3.PLL3N = 128;
    - p/ p/ A- m/ u) E; K! m- b
  65.   PeriphClkInitStruct.PLL3.PLL3P = 2;- B3 h, Y) e2 ^. I& S
  66.   PeriphClkInitStruct.PLL3.PLL3Q = 2;& m4 [$ r. |2 v
  67.   PeriphClkInitStruct.PLL3.PLL3R = 8;
    9 ^) _: A: q' U+ b- `" L/ c
  68.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;! I' p' h# |$ S
  69.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
    ( A* Z* i& d6 l
  70.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
    1 u& f0 z1 P$ e% _( v
  71.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;
    / ~2 A/ `; \; p
  72.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;6 U- I3 a3 |& y7 A
  73.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;2 L$ \6 q" Z! M( W/ E2 L
  74.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    ! {, C6 ~3 Z7 q( c3 }
  75.   {* M* X6 N0 C! b2 a
  76.     Error_Handler();
    & d/ c3 G0 g$ u6 n+ l! c1 d$ f
  77.   }
    4 B- x/ P9 L4 h) U
  78.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);4 s! [- _( u! H+ J
  79.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
    8 T' f2 x/ o, y/ n3 Y; d. E# J& b" A
  80.         8 F, f9 N* Y! u7 S, Z
  81.         //HAL_EnableCompensationCell();
    8 p1 D2 C6 L9 K3 @% K
  82. }
复制代码
" Y% q. n* F& a6 c( a  H
可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,
% T% {3 C8 q* ^! k0 Z
9 J% D6 D9 f4 z
  1. void MX_GPIO_Init(void)
    3 Q  R3 S6 c+ W
  2. {
    3 |; P, N: L8 U4 }

  3. , s! H0 {# u8 v' {
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    2 Y+ `* F# m' s! b) ^; ^; @
  5. : O; V+ D! ~( _. S  C
  6.   /* GPIO Ports Clock Enable */5 d7 a* \- i* |# g6 I8 m* ^0 N
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();
    0 m) b$ t$ B) b) @/ Z
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();0 ?7 u- H& [6 o9 R4 I, {3 O
  9.   __HAL_RCC_GPIOH_CLK_ENABLE();: W4 F! K+ C1 D7 J
  10.   __HAL_RCC_GPIOC_CLK_ENABLE();% I% N- m# S' r0 Z6 U# w
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();: V* S3 z/ `" N- K9 B; Z$ L
  12.   __HAL_RCC_GPIOB_CLK_ENABLE();# {/ Z; r1 C% _- |8 ^- _$ z+ Y
  13.   __HAL_RCC_GPIOG_CLK_ENABLE();
    / w. @7 z7 s7 D( ^
  14.   __HAL_RCC_GPIOD_CLK_ENABLE();$ Q! V1 Q) m  p, ^: ]$ p
  15. 5 ~6 ^( t, L! Y( H8 R' y
  16.   /*Configure GPIO pin : PC9 */
    / f' D! s: c1 X1 o
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;$ L* R0 p# B! Q, k
  18.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    9 @6 a: S+ ^" i. N  m
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    / G$ ?; b- p) ?: E5 P$ x
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
    6 N4 |; E9 b# J8 e* a  s
  21.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
    + \1 X$ H( q6 a, `  a, k( c
  22.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);( F! ^' b/ A5 M: b- j9 F5 q7 z5 `4 T

  23. 0 Z6 h7 Y/ ?* `( z3 G
  24.   /*Configure GPIO pin : PA8 */$ x2 L  y, Y" B# W4 r6 Q. v6 b
  25.   GPIO_InitStruct.Pin = GPIO_PIN_8;5 u" P- b7 m+ U- C
  26.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    : y6 I7 ^: i7 Y7 H% `8 s7 r
  27.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    ) M( j  W1 A5 `3 F4 |4 w9 E
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
    * @3 @' Y3 \$ H- o" R
  29.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
    ) q' l" B' i3 h, f
  30.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    $ z' j9 T6 t2 M% J. @4 f6 ?5 L

  31. - e8 g! ?, M' j8 @& Z$ y" ~
  32. }
复制代码
: L' w# E0 K- }, A: K: ?
所以,超出引脚承受范围是不可能的6 K6 P6 V# a( ~9 k0 {
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。2 S; \2 N3 L; G% s4 S

5 I( {* K) x/ n6 D4 w5 G1 V) r赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,
; b) b4 F0 i2 H; X  y0 n
: }* ^' M" d8 d' T! I- {  @9 Q
  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)
    ' N* S' |- b) c- R
  2. {
    * E- f* K& K8 S1 V$ s+ G0 s
  3.    。。。。。 原来的代码原封不动。。。。。
    4 p" x2 i; w1 [+ J5 v8 e- y0 J

  4. 9 O) D4 w6 \! @9 y& H( B7 s7 {
  5.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
    - O$ X/ M/ |& k5 R( ~$ T* ^: M
  6.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
    % i/ X3 |+ `) T( @
  7.         " S& z+ P! N) I1 {
  8.   if (status == HAL_OK)
    2 R( t+ c: |4 G9 e
  9.   {
    ) K$ X: ?, F" h1 r& {
  10.     return HAL_OK;
    ! g2 e; P# j6 p  P
  11.   }
    : `$ \8 \: c" T: L# T
  12.   return HAL_ERROR;
    % D! V) q8 }* F9 r
  13. }* I: G' ?$ {2 Y! K6 Z( v
复制代码
% k4 B7 Q! e" H
, k5 S* \  U9 X: J& Z. g3 x: J. j
1 \9 B1 V% \( B6 R  c4 h
赞 收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版