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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
) P* d( v6 L9 y. d' w' r& R3 U& s* O; W+ Y( R. x4 ?
  1. void SystemClock_Config(void)/ ?% G5 x4 Y& y
  2. {
    ) R8 W+ @# u) Z  j
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};4 g. V) ?3 g) ?: b$ {& H" k
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    % |; z6 M% }; |
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};' ?" k. p4 s( ~  o! z

  6. : z% C0 I  ~7 S# l' b
  7.   /** Supply configuration update enable   X3 X4 e9 ~# }. S
  8.   */ ( Q; x' c$ O7 W8 b3 z6 D
  9.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
    ; i3 t* v. f9 i/ }
  10.   /** Configure the main internal regulator output voltage
    ; g, q5 G# ~# \% p$ ^
  11.   */
    3 P) L+ a. f6 k
  12.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);  q* _& `, O, o% I2 g+ r; `

  13. / \/ G$ p; u! }, m% C* k
  14.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}7 U! j# @- R0 \8 L6 C. L
  15.   /** Macro to configure the PLL clock source 8 B! k' D' V9 t
  16.   */
    " g  f. o5 b- j, \
  17.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);1 h+ z% B, F8 J& j% W
  18.   /** Initializes the CPU, AHB and APB busses clocks $ ?: p: @) p4 d( [5 O
  19.   */4 [( b. X% d$ O: ~6 l) A. m5 {
  20.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    0 i4 N1 d4 r1 E, C
  21.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    " I8 @, W, B5 E  Q4 e
  22.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;" h( C) x$ H$ m7 ~- [: i
  23.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    / P' Z" ?! {2 K& B6 \* o+ u
  24.   RCC_OscInitStruct.PLL.PLLM = 1;" U: X, @! f4 l  T- g$ o) L
  25.   RCC_OscInitStruct.PLL.PLLN = 80;
    , x+ n8 P5 B0 ^- n
  26.   RCC_OscInitStruct.PLL.PLLP = 2;
    $ r+ [4 x  q( z6 K9 W# o; [/ v
  27.   RCC_OscInitStruct.PLL.PLLQ = 40;1 k# H+ k- {/ X+ V* B  b4 z
  28.   RCC_OscInitStruct.PLL.PLLR = 2;/ C8 ^, I  @8 d' h1 E9 _
  29.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
    . k: F2 k5 v1 Y; P0 K# T
  30.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    ) x. a/ D# [% H6 G
  31.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
    5 j- V# B! X/ t/ i$ D6 x5 Q! e7 P
  32.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)6 K7 U' d$ w3 K  a! U5 p6 R
  33.   {( u, s3 b( M/ k( |& g* U" D
  34.     Error_Handler();( E3 w  Y" i, q3 M0 @2 m/ H
  35.   }3 C0 f* ~% h  I' R" }* q! L$ `
  36.   /** Initializes the CPU, AHB and APB busses clocks
    / Q; k+ y( _/ M
  37.   */
    ! s/ S1 }1 V5 D8 b- \# p% a
  38.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK* B0 V+ u! h5 U; }2 v
  39.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
    ! }$ E; H1 Z7 L
  40.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
    % b. A' B3 ?5 f) j) Z8 A2 B; ?
  41.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;" a4 D' c4 g* O) b9 Y% `$ E8 ~
  42.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;' J* v7 F6 q! `0 ?+ t4 D% {$ ^5 ^
  43.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
      V1 w6 x! k/ H2 r& W  I
  44.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
    . T1 s* U' |8 w4 u6 E7 L
  45.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;# J+ p& r% C0 M7 M1 F
  46.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
    ! G7 @/ i3 T% H* g
  47.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;% S3 ^1 |# X0 w5 U, H8 g
  48. 6 U/ G: n5 j$ F0 j  U" v3 U
  49.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)0 `0 z7 E$ J  b/ C% n3 x+ o& d
  50.   {% I. {/ B" _% t9 ~
  51.     Error_Handler();0 t7 {# N' l  Q. ?3 _! B
  52.   }
    & k# M/ T' w6 M% M. V
  53.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
    4 B. F- v/ w- Z3 A) W, I" P+ b
  54.                               |RCC_PERIPHCLK_FMC;
    7 c0 f. ?3 z6 j$ t
  55.   PeriphClkInitStruct.PLL2.PLL2M = 4;
    6 @' S4 x1 X! Z. v! K
  56.   PeriphClkInitStruct.PLL2.PLL2N = 80;0 d+ q- ~. b. H( Y- R( p7 E
  57.   PeriphClkInitStruct.PLL2.PLL2P = 20;/ M- t7 b. F/ g" y$ T# I( D
  58.   PeriphClkInitStruct.PLL2.PLL2Q = 10;
    - b# L, c! j/ c- O5 g" r* ^8 y4 R6 e
  59.   PeriphClkInitStruct.PLL2.PLL2R = 2;
    % n4 U- x: M. K+ y$ C5 o
  60.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;) V/ i. R) V2 a+ Q
  61.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;- f+ C& I- i( u: Z
  62.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    5 p5 G" S8 E" X- ]- n1 v
  63.   PeriphClkInitStruct.PLL3.PLL3M = 8;! h' i9 d1 G: ]' A2 Q  K; w
  64.   PeriphClkInitStruct.PLL3.PLL3N = 128;
    6 u8 B3 s7 Q. K7 J
  65.   PeriphClkInitStruct.PLL3.PLL3P = 2;/ `3 L; K7 h: E* r. I
  66.   PeriphClkInitStruct.PLL3.PLL3Q = 2;* X9 q$ d6 D' b$ J7 m  I
  67.   PeriphClkInitStruct.PLL3.PLL3R = 8;0 _3 ^$ O' `  ~) {+ j& R
  68.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
    ; b+ a  h. ?$ m& H5 J& M& u' e# j
  69.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
    ; r" r: O$ `& c- H/ G( U4 k% q3 E
  70.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
    4 Y9 J5 i/ p5 k1 p  Q# Z
  71.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;$ G/ B, W% h1 _6 d
  72.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;9 ]" p4 }, p2 V9 a
  73.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
    . Q" ]8 Q& D; [- {, [" g
  74.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK), ^1 n- Z& ^1 L1 q1 O" U, y
  75.   {, d; a' l9 _3 k3 y; f) F0 S
  76.     Error_Handler();
    - r% j2 Y# k* Q2 ^3 w  W/ ?! A' f
  77.   }
    4 z( N# P2 h$ V3 Q! p! B
  78.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);
    ( l0 d! F  e% P( I6 v
  79.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);  R! n, I- X" p" ]  C* |- _
  80.         9 k/ e- T( ~9 u$ l% l
  81.         //HAL_EnableCompensationCell();
    ' f! s- W% R: Y9 W8 o2 S
  82. }
复制代码

8 ^" c' P) `) U  ~6 e可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,
# v2 q* ~4 ?/ a" t
9 e; H/ Q0 Z. G, h6 U; j
  1. void MX_GPIO_Init(void)
    1 G6 \) f+ {/ g, V' P5 \" }7 S
  2. {
    9 n0 Y  z) f9 f" `% }5 q  Q* l+ T
  3. 9 Q' W: V* X  c6 [& y% h" a* ?
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};; f; I( X6 Z6 e$ E( T

  5. + w, _- n  t- s
  6.   /* GPIO Ports Clock Enable */8 w' O  }$ z7 c. S- h; I4 O- b' j
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();
    ) A% f) P6 t, }; C
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    $ ?5 r) ^' m3 e6 r2 T. h4 z( K! {
  9.   __HAL_RCC_GPIOH_CLK_ENABLE();/ M) v6 f# E2 n, L9 |
  10.   __HAL_RCC_GPIOC_CLK_ENABLE();. @8 n8 ^( Z5 j& D
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();
    ( U) \1 F' l- }! {( B) `: g
  12.   __HAL_RCC_GPIOB_CLK_ENABLE();: v$ M' ~* q- M; `3 W7 ]- ~' V# S
  13.   __HAL_RCC_GPIOG_CLK_ENABLE();
    : S7 ^/ t# m# R) ^. _/ r# E7 `
  14.   __HAL_RCC_GPIOD_CLK_ENABLE();
    1 X/ T; A0 b* E; b' Z$ [+ Q
  15. $ F: L, S8 O6 V( R
  16.   /*Configure GPIO pin : PC9 */; F6 w7 T$ ~9 X& t* P
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;
    5 L! s1 g# K( O! M) f& v* i  @
  18.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;. g* ]' Q5 S) r$ m
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    : K" ^( {0 d& I% f
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;# {. l' i/ {7 F
  21.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
    ! B. @2 A4 ]( A% C% ~
  22.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);0 p9 p7 S1 {0 U, R8 n
  23.   B! b1 G) E6 x) }; `
  24.   /*Configure GPIO pin : PA8 */
    / t$ m% |4 m4 d3 b
  25.   GPIO_InitStruct.Pin = GPIO_PIN_8;
      v' e$ O% k$ L/ O
  26.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    $ y0 |% V3 }1 c5 w( `! h+ [
  27.   GPIO_InitStruct.Pull = GPIO_NOPULL;4 Q' O! e0 B4 l6 Y7 ~  S' c: y/ Y
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
    4 N" j  {2 E6 v# w
  29.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;# \) s$ ?5 b" q* W$ w1 o
  30.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 Z, }/ S8 n2 c$ a) H0 ?

  31. 9 h8 C+ P: E9 A% I- ^
  32. }
复制代码
5 |+ v, O- i# w0 o
所以,超出引脚承受范围是不可能的
8 a) O4 f6 W4 G- p! S里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。
- r/ z3 m  a9 [. }9 F. q+ Z
, ^, ]! G1 c1 A" v5 z赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,9 ^1 x% z: i# w7 @  N
9 C4 V/ F$ }& g' T, y1 ?0 l
  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)
    . |  K+ Q( P& h' W9 Q7 {# x( b2 l. h
  2. {. }- b% V4 Y  G& v: N3 u" `+ I' V
  3.    。。。。。 原来的代码原封不动。。。。。7 i8 S1 R8 U$ Y7 H) Y
  4. ! A+ I0 \$ s5 i% \
  5.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
    8 r% i* {! V/ f0 @- \3 M9 {
  6.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);0 j5 i" V5 ?# i( T4 R% W$ D7 o
  7.         2 T( N+ A( K, u/ y. d
  8.   if (status == HAL_OK)4 n  \& c- X4 I$ ^& u
  9.   {* A4 h- ]3 ?& f. D' v
  10.     return HAL_OK;
    4 a' g% C2 B* }* }& W* U( o7 ?
  11.   }+ h  C7 Y& ^0 ^* f" Q8 E
  12.   return HAL_ERROR;+ d" U$ c/ e9 F8 {% ^  V
  13. }
    % y2 b! u2 l  u- a& V3 A
复制代码

  m& m* i! ~0 h: U1 {1 |# m
9 w- S6 j- D/ F6 Z5 K2 Z6 M! n5 v- T7 d
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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