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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下& }# @. u1 P9 M' }+ ^$ \; k. U
8 W: Q& Z; x% L) G
  1. void SystemClock_Config(void)4 \# k# i: h' @
  2. {, ?, c( o, b! v7 k- m
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    9 O7 g6 ^+ x) ~! s7 h7 a
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};* q7 I. x7 v9 ]
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};$ f% W, J7 H" G+ }% W* D2 \; `
  6. ( ?5 l! s8 @0 l, u  p, o' m' \# M
  7.   /** Supply configuration update enable & h7 X: P1 w; G# |; |# |; o
  8.   */ & V# P7 f5 r: B- i1 d4 y5 s
  9.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
    ; P& W/ Q  V9 ^! v6 C( K" ?
  10.   /** Configure the main internal regulator output voltage - |8 W0 A; u$ G* q7 R- E
  11.   */, Q$ O6 z$ u( B
  12.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);- F- H; ~4 K+ @' m$ \4 F

  13. 7 C& w. _9 N% D9 D' P7 g( W3 i
  14.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}3 U  m! J2 ?9 K7 i
  15.   /** Macro to configure the PLL clock source
    ( Z7 q" n1 [; r% s! C9 [6 l
  16.   */7 Z  |+ l/ @  K+ n( Q6 ~, E+ A
  17.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);, h; ]' _5 p, U( b- t) Y; ^
  18.   /** Initializes the CPU, AHB and APB busses clocks
    - q( G+ ?) o9 k) G
  19.   */
    ' N, n2 X3 Q- J: H
  20.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    3 y8 S; c" `+ V" i' J  x
  21.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;# j4 L$ l/ |* x% }( [- j
  22.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;( c. A1 s" c) Y0 c( X7 b( F6 x
  23.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    $ c6 r; h2 ~. k* _/ K2 Z
  24.   RCC_OscInitStruct.PLL.PLLM = 1;% @5 ]4 A1 q# w- j
  25.   RCC_OscInitStruct.PLL.PLLN = 80;1 s8 M5 _8 b6 L% o) h$ M
  26.   RCC_OscInitStruct.PLL.PLLP = 2;
    1 Q! R* Z# a% g0 Q; j
  27.   RCC_OscInitStruct.PLL.PLLQ = 40;
    , X# d. u. Z# Y% v/ M( Q) P
  28.   RCC_OscInitStruct.PLL.PLLR = 2;0 I- Z" p3 q. D: ]6 r
  29.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;: {4 U8 ]2 i3 g% S9 F) _
  30.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;, N" T% S9 y6 y" l) `, J# P' P. y
  31.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
    # Z; s- B* D5 Z+ m$ A
  32.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)0 y2 W& s5 q' ^9 ], R! e3 L7 J
  33.   {
    - D1 k3 }0 H9 b% e$ {
  34.     Error_Handler();
    9 Y% ~" o/ ]0 ~0 s, z" K" @
  35.   }! k, v$ M( I% L: @9 u/ b) D
  36.   /** Initializes the CPU, AHB and APB busses clocks - R: w4 q1 @8 b4 X
  37.   */+ j" |8 i% a8 n* P' D* D
  38.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    ( Y4 m: U. f) ?% `, |
  39.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
    ; X7 J( R$ j' a2 w3 F' \
  40.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
    ; T% k, Y1 y8 O) X
  41.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;. _& I6 ]- ?, E8 b2 s
  42.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
    ; ^$ y( X) `, R
  43.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;+ q) J: h( A* z2 p
  44.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;: K( o$ b. G. C" }" [
  45.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;& u4 E5 l+ t4 H  h& R
  46.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
    $ H- h: L  ?; V6 b
  47.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
    1 U# o% y' I/ m/ K
  48. $ l' L: P) h" v) L& P
  49.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
    / M4 i1 g+ @+ k
  50.   {) p( U1 t# _, i! n  L8 M6 t
  51.     Error_Handler();
    ; u: w  |6 [6 K3 h
  52.   }
    4 a, I  N+ g9 K# I/ r7 }
  53.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
    # Q8 b  X+ ~: a7 Q) Z6 m8 [
  54.                               |RCC_PERIPHCLK_FMC;: x% M" K: P% i+ I* v2 ?2 k- {' r
  55.   PeriphClkInitStruct.PLL2.PLL2M = 4;4 s' \3 @' q. e% t8 s" b
  56.   PeriphClkInitStruct.PLL2.PLL2N = 80;5 C* L0 G# n( t/ A9 d( q- S. w9 _1 s
  57.   PeriphClkInitStruct.PLL2.PLL2P = 20;
    ' {1 D0 ^7 ~0 k0 Z. Q
  58.   PeriphClkInitStruct.PLL2.PLL2Q = 10;
    % b5 T8 ]+ Y* z5 Y+ Y# v
  59.   PeriphClkInitStruct.PLL2.PLL2R = 2;* z) u% D" ^% [" [3 G; t
  60.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;  Y5 I, c" V' [
  61.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    9 p- P1 m+ |, A1 y" X" m9 l2 |
  62.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;( f3 T: F3 z* D0 U
  63.   PeriphClkInitStruct.PLL3.PLL3M = 8;
    % R& A/ y! r5 S8 t& o1 r
  64.   PeriphClkInitStruct.PLL3.PLL3N = 128;
    2 s' v& I5 r  p  t1 w9 m
  65.   PeriphClkInitStruct.PLL3.PLL3P = 2;* Z  S+ G; [; f! s8 i$ G, D, z( H
  66.   PeriphClkInitStruct.PLL3.PLL3Q = 2;
    # V5 ]" u$ H& \6 F  l' H2 w* X
  67.   PeriphClkInitStruct.PLL3.PLL3R = 8;
    ! P) M* q  q8 ]* G0 `
  68.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
    : `6 q7 R1 \6 W' r" d0 z6 B
  69.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
    6 V4 ~* B2 ?) F
  70.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
    # Z1 r( J' s; n9 Y8 e2 _. q
  71.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;, [1 e- S: O. H1 Y
  72.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;  ^' Y0 u2 x+ K9 A( Z, U' p
  73.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;1 v+ t! z  j; n% a; r# E
  74.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    1 Z/ _/ n$ n0 e; Q( t: s& o+ k$ g
  75.   {
    : p3 A" S& h; \" {1 M" K* d. ^
  76.     Error_Handler();$ W" W+ `: w/ X9 }  Z) O: ~
  77.   }+ [# J1 M* K' z: c8 N2 @/ f- j
  78.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);
    " E5 k5 [9 D8 a. S! x+ A" |  t
  79.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);7 V' h5 C* O4 K! T
  80.         " T( k: r: s9 E: p0 D: b4 Y, a
  81.         //HAL_EnableCompensationCell();  [/ C1 c; j0 E, N' B6 l% r9 Z
  82. }
复制代码
! Y- ^; }5 q1 I( G5 R
可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,
, A! }7 O$ V' n* o; C
3 D* {7 |1 K6 I
  1. void MX_GPIO_Init(void)! C7 G. V7 ?4 h/ K8 H! J/ U+ j
  2. {+ w6 u( c) n" _: G
  3. 6 T/ ?6 ?9 {- O7 v- d0 H2 W3 b
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    $ v2 y4 I, h! D) j) V

  5. 8 R5 ]% o9 |$ i+ K
  6.   /* GPIO Ports Clock Enable */$ P* Q' a& }4 J# Y) J
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();
    9 ]2 e: o, w' |
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    + `4 O$ l9 R6 T( p% W% g& s6 q9 J+ y+ C
  9.   __HAL_RCC_GPIOH_CLK_ENABLE();
    , g3 s; W2 V: r9 }7 m" ~" F
  10.   __HAL_RCC_GPIOC_CLK_ENABLE();" a5 E$ N" E5 s5 \% z* L9 n; E; t
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();, Z4 S- B" t0 U9 I1 ]/ a
  12.   __HAL_RCC_GPIOB_CLK_ENABLE();
    $ ~0 B0 J) {/ _! A8 ]1 j5 H, S
  13.   __HAL_RCC_GPIOG_CLK_ENABLE();  i" c. I: }- ?6 _3 c. N: Z( }
  14.   __HAL_RCC_GPIOD_CLK_ENABLE();
    % H3 F" U. {/ R$ p
  15. % e/ H5 y) [7 K; S2 F7 h0 c' I. \0 G$ z
  16.   /*Configure GPIO pin : PC9 */* M  y7 P" @# {$ t
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;
    4 l# @( Q  l4 B+ p* ]0 ?
  18.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    * Y. I1 e) Z' U3 K( C/ v
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;, e9 `" M9 g' ?, @/ |7 c$ D+ c
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
    % t6 o* Z, U( _  Y
  21.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;' V8 Y( W7 ~  g4 C/ P' ~4 z1 S( G
  22.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);. P3 Z6 ?/ H& W, Z5 _

  23. & b, u* Q4 s7 D2 ?, s% c  x
  24.   /*Configure GPIO pin : PA8 */6 m5 x  E7 c+ B4 a
  25.   GPIO_InitStruct.Pin = GPIO_PIN_8;
    ( k( L% C5 h: N& G. Q
  26.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    , j  [0 J( I3 x  U7 {
  27.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    2 q% K2 k) M9 Y9 R! `
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;4 U1 W7 b8 U3 T3 F2 w6 U
  29.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;% F* D% }3 `% J  T# Y; T. ?
  30.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);! A% j1 \. y9 i$ E
  31. : N4 N' m8 F$ X1 J
  32. }
复制代码
; _7 N' e, J1 ]% q& Q
所以,超出引脚承受范围是不可能的  U( [2 p7 B( J9 c, F
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。4 n. L1 t* ^' c* [+ f4 W

9 p6 D3 l: ?( K$ d0 R/ f赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,& V) x4 ~( b" g/ H6 y
9 \$ {' L' h4 a
  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)' Z& B  ?! e$ j
  2. {
    # N' E6 W- n4 t* a+ ~& O; g
  3.    。。。。。 原来的代码原封不动。。。。。$ z# V. C% ~& S1 n) k# b

  4. 7 T+ A" E& ~+ i2 J
  5.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到) s4 a$ t) W5 o- B* Y, s
  6.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);4 F; V( ^( C- H: e0 t
  7.         % H0 A& s! J, \2 C: b3 `& s& Y
  8.   if (status == HAL_OK)( ^, V* G: G2 ^. q2 \: Z$ Q  d+ E
  9.   {2 K. F0 G( Z' A/ f. J7 @( {
  10.     return HAL_OK;+ L% I, L) _# e4 z
  11.   }% D+ h  E8 B( [0 c; B" f& W/ K
  12.   return HAL_ERROR;: J9 @% K: a' B! W, F
  13. }! ~* ~! Z2 a0 O8 p( u
复制代码

+ ?( {" @3 x3 q% i. [+ |: v3 W; N( p" w3 ^( R9 X

# B' e7 J# ^" A/ o' N4 y3 f' U
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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