因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
6 ]4 N) O; a" ~8 }% i
' I2 k* k& {' |* ~% k- void SystemClock_Config(void)
7 _& b) l6 u1 _6 [ C - {- s: @3 i) J. g
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
7 S. w* y2 H/ ]/ _' ] - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
6 l+ P# x' h4 ~9 M! ^ - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};0 A4 f1 R. B7 F, S! a/ d& E6 ]" u
- ) N9 u! Y( W: C# X+ D! P
- /** Supply configuration update enable ! f# |7 F; O! G+ `& k$ J
- */ 4 U7 d9 e, N5 t
- HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);- `7 `+ Z$ H8 H5 _# `' P2 `
- /** Configure the main internal regulator output voltage 9 W" l3 J# D+ R* h8 S
- */! Z b7 V+ Q* E' ^; T5 i
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
( H# X4 v. b( y& G" A - , b% r" \! T, ?% R/ g
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}' {# \! ~* t4 A$ x
- /** Macro to configure the PLL clock source
! R, b+ M" S2 ?3 f; S7 f& M1 ` - */: }; P3 Q9 G* ]; J2 K7 y) Q
- __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);# T) I" y2 @( L3 s
- /** Initializes the CPU, AHB and APB busses clocks # k. ?( X5 q% N6 j9 H; U! e g
- */
* i& Q! [0 B& [" h @ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
* j! A7 S- p; J# C, { - RCC_OscInitStruct.HSEState = RCC_HSE_ON;
) S9 K+ \, R& y" p. p' t' d5 j - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;- E, l6 k- e; S4 V) f
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- G, K( X4 N9 _2 N$ S, R: j" R - RCC_OscInitStruct.PLL.PLLM = 1;
4 p7 w7 {# C Q - RCC_OscInitStruct.PLL.PLLN = 80;
' D- f4 l. P/ w* T1 t+ v# M0 u8 k - RCC_OscInitStruct.PLL.PLLP = 2;5 \+ t0 i: ]3 X$ G
- RCC_OscInitStruct.PLL.PLLQ = 40;
1 U" ^! v0 v) C& ~& a1 u" O - RCC_OscInitStruct.PLL.PLLR = 2;
f/ U, T0 }6 n3 ] - RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
# Q* o! ~, W+ G% x( z" N: M& \. ] - RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
/ F3 [$ B* \3 V" F8 C/ v( t+ f - RCC_OscInitStruct.PLL.PLLFRACN = 0;
- l' w- w4 ]& W5 P5 }( ~ - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
9 J3 v. ~2 ^& h2 z( h6 Y& _/ L - {
4 }0 l% R2 N7 P( C& j7 H - Error_Handler();* s3 \9 R* \0 Q
- }9 H- ?; K0 z d8 v
- /** Initializes the CPU, AHB and APB busses clocks $ S/ r$ m* U# L: Y) l% t6 ]
- */, E# \. d+ }( U. U% f+ a6 ~
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK! c, S0 z$ B+ d! t" ]( Z
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK27 j* n p3 [$ O
- |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; K1 t" T4 Q; ~8 J" ]
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;6 N0 v2 c- o" `: ^" N$ z' V2 o# i2 A
- RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
* L/ z* S4 r& L - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
9 a$ L8 l0 _7 K1 R - RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
: _/ }1 ^6 R+ h5 A - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;$ |/ G# q4 ~1 _
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;/ n+ e1 M8 r) L
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;2 x+ C) X9 C5 e+ v. N
$ a# T! r* g5 z, q- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)+ P. e( t' j- v
- {
. y. K F4 _. x7 n; W+ z - Error_Handler();/ U. N% l( T0 K* ~
- }
- R# r! Y3 H f L# E" i - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1; b* h; V9 J7 Z, d4 h m
- |RCC_PERIPHCLK_FMC;
% [- S% p8 d5 U' P/ z; {8 K4 [ - PeriphClkInitStruct.PLL2.PLL2M = 4;
Q$ l9 z; c$ I' u8 O! |% C - PeriphClkInitStruct.PLL2.PLL2N = 80;
8 T3 p4 c: F, j5 k1 W8 O - PeriphClkInitStruct.PLL2.PLL2P = 20;
1 [& @( D8 N# y2 n6 ~1 s6 J - PeriphClkInitStruct.PLL2.PLL2Q = 10;* Q; y! b& D/ O7 D: R/ r; N+ q% \
- PeriphClkInitStruct.PLL2.PLL2R = 2;5 r) Y( A& t& g8 r
- PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
' _* n" C8 q6 a* I+ t - PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
; j @- P2 k m - PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
/ o9 Y7 s4 K8 E - PeriphClkInitStruct.PLL3.PLL3M = 8;
8 p0 Z5 m& f9 O/ J3 _% I. { - PeriphClkInitStruct.PLL3.PLL3N = 128;
9 [* j8 ?; _3 g - PeriphClkInitStruct.PLL3.PLL3P = 2;
) U/ m8 ?% G- }$ ]8 n - PeriphClkInitStruct.PLL3.PLL3Q = 2;* v( e" q) H% x# w
- PeriphClkInitStruct.PLL3.PLL3R = 8;
! y+ z# t6 u/ l! W, U+ H, ? - PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;2 e: R- H+ t f/ x b3 H3 D# P' T% ]
- PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
& f( k# \5 |: p - PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
) m/ M0 f8 d" ?+ j. } - PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;. n4 w; N! d. N' q1 I% z
- PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;
% C. {+ @. x3 z! {' g/ U5 U( [ - PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
- l, Z0 ~* J# _. {( \4 t - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)# D' g! a5 N7 i; n7 u! [ C" m
- {
' r3 n* ~5 q. e7 f# {) z - Error_Handler();
% Q# ^$ V$ k v% |% ~1 { - }4 \7 u+ [! ?: y* G+ o: x! H: A+ P' G
- HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);6 S; j% N% b( y
- HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
, l" L7 @5 g- z8 r -
6 x8 b. Z2 ^4 D3 Q! z+ z6 d( f k - //HAL_EnableCompensationCell();
1 z3 A! B( L9 z( | - }
复制代码
% O1 }+ I2 p& `/ y9 ~' Y j可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,' g- m2 o+ S3 K7 t6 q
5 B7 m9 }5 b1 F. {- void MX_GPIO_Init(void)
, i+ x! t( ]+ e: _+ {. V3 H% b - {. D0 k1 {8 D# D% p. i
2 `: Z, t: Q6 j0 E- GPIO_InitTypeDef GPIO_InitStruct = {0};
. v1 ?8 Y: E. `0 K: R$ ]/ A. E - " A0 `& S. y' ]9 U8 b! Q
- /* GPIO Ports Clock Enable */
5 c+ a p/ s4 D8 W8 [ - __HAL_RCC_GPIOE_CLK_ENABLE();
, W0 v2 p* J/ g a3 G! z% ^ - __HAL_RCC_GPIOF_CLK_ENABLE();
/ Y: V! E) ^8 i- [+ x: j - __HAL_RCC_GPIOH_CLK_ENABLE();
" [, v! D* d7 B- T - __HAL_RCC_GPIOC_CLK_ENABLE();
c5 G4 @" v% U. R; G6 h - __HAL_RCC_GPIOA_CLK_ENABLE();2 I0 _3 c* C% G) k$ q5 E; w% z; A
- __HAL_RCC_GPIOB_CLK_ENABLE();
2 [; V3 s" s0 ]9 M2 | - __HAL_RCC_GPIOG_CLK_ENABLE();
8 r& W5 S4 Y. b& ]. I; c3 N9 h - __HAL_RCC_GPIOD_CLK_ENABLE();
3 g3 [6 D: |+ r8 r6 m* o - . T* S. {/ Q( ~6 K5 s
- /*Configure GPIO pin : PC9 */) v2 a0 i% l- E1 d; j! H
- GPIO_InitStruct.Pin = GPIO_PIN_9;7 J) f& u X. R$ G9 a% Q3 e
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;) i: d1 e7 x1 M2 S. H
- GPIO_InitStruct.Pull = GPIO_NOPULL;
" U A! _& t; a: n4 Y3 e3 }' J - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;4 g4 J# }: ]% m7 a" p, z
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;, j# O8 C) R @6 ^( F1 Q( J
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
* b- G- F+ U2 c$ a( f+ Y
. S5 M/ Q" U m- /*Configure GPIO pin : PA8 */
- p- }4 {4 ^+ z4 I; r6 W1 @ - GPIO_InitStruct.Pin = GPIO_PIN_8;
0 Z) Z/ T+ z% T6 ~3 H, Z# G# h - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
0 ?& ]; y8 ? M2 l$ Z0 x - GPIO_InitStruct.Pull = GPIO_NOPULL;, d8 W* d% ^: o
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;& o8 ^8 l( ^' |
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
, x; i. d2 ~, ~! J9 i) v - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
1 E9 u" N, `: O' {' |- s3 Z - , n! i& I. m. n- K% k0 ~9 A$ ^3 Z
- }
复制代码 * _3 n" _3 j' E) \1 W0 T v$ d
所以,超出引脚承受范围是不可能的3 h5 u$ T: F [% w
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。
' V. c8 K: p% I4 b7 Z# l! E( O; G' p! ?! } S2 U# k
赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,7 [! y4 q: F& t: }* ? V/ T
6 E1 K5 h6 O: `& C5 U- HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)
" q1 k2 ~- c; p W; l - {
1 F2 q' R3 j3 a7 z( p* I7 Y - 。。。。。 原来的代码原封不动。。。。。) S/ p) F5 M' @) h7 f
- g1 [7 i6 \. H" ]. r- // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
7 b# y7 O9 p5 x' v' ?" p - ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
& w- {8 V N& N% E( Y5 [ -
4 k* Q1 C, ~( @: b - if (status == HAL_OK)" [4 \: n. V& X. K* O% T9 J7 P
- {6 D0 i2 b# d1 o3 s) h
- return HAL_OK;
8 |. E; \* n& z) P. C9 R - }5 |! S) |: H S8 A* q' t# }
- return HAL_ERROR;
( }' y" [! y0 ]( V+ a: M' z+ Q - }
4 ~ g4 G# e# B7 Y: w7 @0 m
复制代码
+ ^) Y: P. G& ?+ _0 m' q) l/ N( O. z' g2 u( g0 l- h# g+ I* F
/ |% e5 A; f5 r. v" m
|