因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下& }# @. u1 P9 M' }+ ^$ \; k. U
8 W: Q& Z; x% L) G
- void SystemClock_Config(void)4 \# k# i: h' @
- {, ?, c( o, b! v7 k- m
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
9 O7 g6 ^+ x) ~! s7 h7 a - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};* q7 I. x7 v9 ]
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};$ f% W, J7 H" G+ }% W* D2 \; `
- ( ?5 l! s8 @0 l, u p, o' m' \# M
- /** Supply configuration update enable & h7 X: P1 w; G# |; |# |; o
- */ & V# P7 f5 r: B- i1 d4 y5 s
- HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
; P& W/ Q V9 ^! v6 C( K" ? - /** Configure the main internal regulator output voltage - |8 W0 A; u$ G* q7 R- E
- */, Q$ O6 z$ u( B
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);- F- H; ~4 K+ @' m$ \4 F
7 C& w. _9 N% D9 D' P7 g( W3 i- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}3 U m! J2 ?9 K7 i
- /** Macro to configure the PLL clock source
( Z7 q" n1 [; r% s! C9 [6 l - */7 Z |+ l/ @ K+ n( Q6 ~, E+ A
- __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);, h; ]' _5 p, U( b- t) Y; ^
- /** Initializes the CPU, AHB and APB busses clocks
- q( G+ ?) o9 k) G - */
' N, n2 X3 Q- J: H - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
3 y8 S; c" `+ V" i' J x - RCC_OscInitStruct.HSEState = RCC_HSE_ON;# j4 L$ l/ |* x% }( [- j
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;( c. A1 s" c) Y0 c( X7 b( F6 x
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
$ c6 r; h2 ~. k* _/ K2 Z - RCC_OscInitStruct.PLL.PLLM = 1;% @5 ]4 A1 q# w- j
- RCC_OscInitStruct.PLL.PLLN = 80;1 s8 M5 _8 b6 L% o) h$ M
- RCC_OscInitStruct.PLL.PLLP = 2;
1 Q! R* Z# a% g0 Q; j - RCC_OscInitStruct.PLL.PLLQ = 40;
, X# d. u. Z# Y% v/ M( Q) P - RCC_OscInitStruct.PLL.PLLR = 2;0 I- Z" p3 q. D: ]6 r
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;: {4 U8 ]2 i3 g% S9 F) _
- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;, N" T% S9 y6 y" l) `, J# P' P. y
- RCC_OscInitStruct.PLL.PLLFRACN = 0;
# Z; s- B* D5 Z+ m$ A - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)0 y2 W& s5 q' ^9 ], R! e3 L7 J
- {
- D1 k3 }0 H9 b% e$ { - Error_Handler();
9 Y% ~" o/ ]0 ~0 s, z" K" @ - }! k, v$ M( I% L: @9 u/ b) D
- /** Initializes the CPU, AHB and APB busses clocks - R: w4 q1 @8 b4 X
- */+ j" |8 i% a8 n* P' D* D
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
( Y4 m: U. f) ?% `, | - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
; X7 J( R$ j' a2 w3 F' \ - |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
; T% k, Y1 y8 O) X - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;. _& I6 ]- ?, E8 b2 s
- RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
; ^$ y( X) `, R - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;+ q) J: h( A* z2 p
- RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;: K( o$ b. G. C" }" [
- RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;& u4 E5 l+ t4 H h& R
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
$ H- h: L ?; V6 b - RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
1 U# o% y' I/ m/ K - $ l' L: P) h" v) L& P
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
/ M4 i1 g+ @+ k - {) p( U1 t# _, i! n L8 M6 t
- Error_Handler();
; u: w |6 [6 K3 h - }
4 a, I N+ g9 K# I/ r7 } - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
# Q8 b X+ ~: a7 Q) Z6 m8 [ - |RCC_PERIPHCLK_FMC;: x% M" K: P% i+ I* v2 ?2 k- {' r
- PeriphClkInitStruct.PLL2.PLL2M = 4;4 s' \3 @' q. e% t8 s" b
- PeriphClkInitStruct.PLL2.PLL2N = 80;5 C* L0 G# n( t/ A9 d( q- S. w9 _1 s
- PeriphClkInitStruct.PLL2.PLL2P = 20;
' {1 D0 ^7 ~0 k0 Z. Q - PeriphClkInitStruct.PLL2.PLL2Q = 10;
% b5 T8 ]+ Y* z5 Y+ Y# v - PeriphClkInitStruct.PLL2.PLL2R = 2;* z) u% D" ^% [" [3 G; t
- PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1; Y5 I, c" V' [
- PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
9 p- P1 m+ |, A1 y" X" m9 l2 | - PeriphClkInitStruct.PLL2.PLL2FRACN = 0;( f3 T: F3 z* D0 U
- PeriphClkInitStruct.PLL3.PLL3M = 8;
% R& A/ y! r5 S8 t& o1 r - PeriphClkInitStruct.PLL3.PLL3N = 128;
2 s' v& I5 r p t1 w9 m - PeriphClkInitStruct.PLL3.PLL3P = 2;* Z S+ G; [; f! s8 i$ G, D, z( H
- PeriphClkInitStruct.PLL3.PLL3Q = 2;
# V5 ]" u$ H& \6 F l' H2 w* X - PeriphClkInitStruct.PLL3.PLL3R = 8;
! P) M* q q8 ]* G0 ` - PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
: `6 q7 R1 \6 W' r" d0 z6 B - PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
6 V4 ~* B2 ?) F - PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
# Z1 r( J' s; n9 Y8 e2 _. q - PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;, [1 e- S: O. H1 Y
- PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2; ^' Y0 u2 x+ K9 A( Z, U' p
- PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;1 v+ t! z j; n% a; r# E
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
1 Z/ _/ n$ n0 e; Q( t: s& o+ k$ g - {
: p3 A" S& h; \" {1 M" K* d. ^ - Error_Handler();$ W" W+ `: w/ X9 } Z) O: ~
- }+ [# J1 M* K' z: c8 N2 @/ f- j
- HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);
" E5 k5 [9 D8 a. S! x+ A" | t - HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);7 V' h5 C* O4 K! T
- " T( k: r: s9 E: p0 D: b4 Y, a
- //HAL_EnableCompensationCell(); [/ C1 c; j0 E, N' B6 l% r9 Z
- }
复制代码 ! 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- void MX_GPIO_Init(void)! C7 G. V7 ?4 h/ K8 H! J/ U+ j
- {+ w6 u( c) n" _: G
- 6 T/ ?6 ?9 {- O7 v- d0 H2 W3 b
- GPIO_InitTypeDef GPIO_InitStruct = {0};
$ v2 y4 I, h! D) j) V
8 R5 ]% o9 |$ i+ K- /* GPIO Ports Clock Enable */$ P* Q' a& }4 J# Y) J
- __HAL_RCC_GPIOE_CLK_ENABLE();
9 ]2 e: o, w' | - __HAL_RCC_GPIOF_CLK_ENABLE();
+ `4 O$ l9 R6 T( p% W% g& s6 q9 J+ y+ C - __HAL_RCC_GPIOH_CLK_ENABLE();
, g3 s; W2 V: r9 }7 m" ~" F - __HAL_RCC_GPIOC_CLK_ENABLE();" a5 E$ N" E5 s5 \% z* L9 n; E; t
- __HAL_RCC_GPIOA_CLK_ENABLE();, Z4 S- B" t0 U9 I1 ]/ a
- __HAL_RCC_GPIOB_CLK_ENABLE();
$ ~0 B0 J) {/ _! A8 ]1 j5 H, S - __HAL_RCC_GPIOG_CLK_ENABLE(); i" c. I: }- ?6 _3 c. N: Z( }
- __HAL_RCC_GPIOD_CLK_ENABLE();
% H3 F" U. {/ R$ p - % e/ H5 y) [7 K; S2 F7 h0 c' I. \0 G$ z
- /*Configure GPIO pin : PC9 */* M y7 P" @# {$ t
- GPIO_InitStruct.Pin = GPIO_PIN_9;
4 l# @( Q l4 B+ p* ]0 ? - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
* Y. I1 e) Z' U3 K( C/ v - GPIO_InitStruct.Pull = GPIO_NOPULL;, e9 `" M9 g' ?, @/ |7 c$ D+ c
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
% t6 o* Z, U( _ Y - GPIO_InitStruct.Alternate = GPIO_AF0_MCO;' V8 Y( W7 ~ g4 C/ P' ~4 z1 S( G
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);. P3 Z6 ?/ H& W, Z5 _
& b, u* Q4 s7 D2 ?, s% c x- /*Configure GPIO pin : PA8 */6 m5 x E7 c+ B4 a
- GPIO_InitStruct.Pin = GPIO_PIN_8;
( k( L% C5 h: N& G. Q - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
, j [0 J( I3 x U7 { - GPIO_InitStruct.Pull = GPIO_NOPULL;
2 q% K2 k) M9 Y9 R! ` - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;4 U1 W7 b8 U3 T3 F2 w6 U
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;% F* D% }3 `% J T# Y; T. ?
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);! A% j1 \. y9 i$ E
- : N4 N' m8 F$ X1 J
- }
复制代码 ; _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
- HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)' Z& B ?! e$ j
- {
# N' E6 W- n4 t* a+ ~& O; g - 。。。。。 原来的代码原封不动。。。。。$ z# V. C% ~& S1 n) k# b
7 T+ A" E& ~+ i2 J- // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到) s4 a$ t) W5 o- B* Y, s
- ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);4 F; V( ^( C- H: e0 t
- % H0 A& s! J, \2 C: b3 `& s& Y
- if (status == HAL_OK)( ^, V* G: G2 ^. q2 \: Z$ Q d+ E
- {2 K. F0 G( Z' A/ f. J7 @( {
- return HAL_OK;+ L% I, L) _# e4 z
- }% D+ h E8 B( [0 c; B" f& W/ K
- return HAL_ERROR;: J9 @% K: a' B! W, F
- }! ~* ~! 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 |