因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下! c8 C; [/ K( I) _3 q* f# u5 n
; p9 [( g: J: | G W) I
- void SystemClock_Config(void)0 J' ^8 t' P, P) N% B/ G, V4 e" w0 o- b
- {
# e8 D$ _& N7 A1 S( P! V - RCC_OscInitTypeDef RCC_OscInitStruct = {0};! N# U- Y1 Z M/ }
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
: H$ _7 j* z U, I. T3 R) _ - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
$ ^9 W3 k6 `; C" @8 I* k2 }6 J; K
- ]4 E X( L) H8 Z0 W- /** Supply configuration update enable 5 f% d1 B, c# |8 g& n7 G4 U/ o
- */
1 s9 n/ e3 B! e2 a% `* w - HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
) R* ~% L$ q9 ]' ~0 B$ V# j r/ K7 _; V8 @ - /** Configure the main internal regulator output voltage 2 v. a8 @8 Q5 S3 n {3 \6 e. K
- */- z( N* ~; y. w' o" f
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);0 J$ L# o; P- v5 D4 u& m
- ! }. c/ T6 ^. q
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
" B% T0 C8 Q7 P/ L3 ?7 _ - /** Macro to configure the PLL clock source % T5 B7 ~+ {2 b, ~1 O2 ^
- */: M3 I" z3 T8 j+ @; a, A! _' K- n
- __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);2 {; t! O" y" I( E2 ~* ?8 u" a
- /** Initializes the CPU, AHB and APB busses clocks $ g# I+ e+ r7 f$ y5 r
- */' S% A/ W' [, j; a" ?9 K
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;4 t% I; ~- z( p& N$ b. J7 o
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;5 f) v* O* c5 k. Y, b% s1 ]
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
2 }. H) O0 i. v9 {" O6 X/ ^3 o - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
( j- e# b6 B5 E: w4 G4 w - RCC_OscInitStruct.PLL.PLLM = 1;
- Y6 q( {' I9 d) C3 c; v - RCC_OscInitStruct.PLL.PLLN = 80;
& K2 w% K) E; o" I# C - RCC_OscInitStruct.PLL.PLLP = 2;
7 D X( m4 D8 k - RCC_OscInitStruct.PLL.PLLQ = 40;
( l5 k% n+ h- h# l( w - RCC_OscInitStruct.PLL.PLLR = 2;) j N3 P% p3 s6 ~) W; l6 a
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;0 g0 s+ A9 @" [1 [6 A
- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
; u/ R2 B- @' D - RCC_OscInitStruct.PLL.PLLFRACN = 0;7 V7 y% c* b/ ~1 u* f% b
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)4 U" l: ~- X6 f. K5 \, C3 g
- {, {( ~/ R/ }0 x: H# h2 s; q; G
- Error_Handler();- o/ S. d! E1 `; [# ~9 n
- }( j, J: `) C* ` f' ]5 s3 E
- /** Initializes the CPU, AHB and APB busses clocks & i! l) m. X9 N8 m6 H8 k$ o9 S
- *// K4 `' j+ R' f/ z: X" e# \% M
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
/ r5 U6 Z" R5 S9 ~( w - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
9 y) c0 X" E5 M - |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;; y- L! Y R$ y1 V8 s8 d
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
" y6 P8 ]* q5 q8 m5 K: \ - RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;; J' {% P5 q" b9 Y: g1 W- G
- RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
+ {3 Q& t C; x4 n8 T& h0 W6 _ - RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;/ m- o5 K i: p% Y+ f( p
- RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;# T4 B: e4 i+ o+ @
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;' S% R5 F/ I+ O4 `6 A' ~% x
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;* M) ]- ?( R+ @
?. l# N# f9 w* k% v4 A- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
3 j3 ^6 r% ~9 t - { F6 K. F( g H% [) G+ ^7 G4 M
- Error_Handler();
- Z0 H1 m/ [# H, c: L! j3 o; \ - }9 B% s$ J9 d) n9 T/ g W$ K1 P
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
' R9 l9 P2 L3 S, [: E - |RCC_PERIPHCLK_FMC;
% F# |( s3 F, s, l- H) S - PeriphClkInitStruct.PLL2.PLL2M = 4;
% `* Z! Q* q7 a& U$ m" w { - PeriphClkInitStruct.PLL2.PLL2N = 80;6 u& ?6 l" v+ {' v- k, S5 N7 y6 s
- PeriphClkInitStruct.PLL2.PLL2P = 20;! q1 \% k- r% i& o% k
- PeriphClkInitStruct.PLL2.PLL2Q = 10;3 C E2 _* n; s% F. X
- PeriphClkInitStruct.PLL2.PLL2R = 2;& u0 @- I2 a, X2 t6 U5 z* r
- PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
3 I1 X! n( _0 D+ F: y+ q; A& } - PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
- M" F' i8 C- | - PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
+ \/ B5 W6 [& H& L) s - PeriphClkInitStruct.PLL3.PLL3M = 8;; `% b; s) V/ t0 F" ~& Z! h
- PeriphClkInitStruct.PLL3.PLL3N = 128;
. y) d) d( T# E& ?; p2 Z& [ - PeriphClkInitStruct.PLL3.PLL3P = 2;2 ?1 S7 w; l( C
- PeriphClkInitStruct.PLL3.PLL3Q = 2;
* J N0 p9 i/ Q8 r4 J# S. N - PeriphClkInitStruct.PLL3.PLL3R = 8;
& F; ]0 K B3 R! m' H) M. b; y - PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
& E6 B- y3 L( h* v - PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
5 R7 U V- I% O, T) W - PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
# z E6 k# U; b: H& e/ y - PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK; X( t+ h" `9 d7 h1 b
- PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;* W6 H; a5 _2 R: Q
- PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
3 P/ @3 E/ @4 g ^* J* C - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
/ q6 |# X5 J) L |0 F" J( b - {; Z2 P7 \1 e- t& @4 l6 {5 h
- Error_Handler();& h% l! c* k8 J0 U1 ^" v4 E1 W
- }1 A l8 A' v' B- D8 N
- HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);
" B- J7 M' t; v) V" i& x( ~( p - HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
* S) W; Y i" T9 v+ T - & P0 U; R9 R' D7 I2 G2 Q" F' t |
- //HAL_EnableCompensationCell();
e& ~# Z2 i% q; F+ B& h - }
复制代码
9 _0 p* E! }) y3 F% z可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,$ r% D! m& m% M& W1 W" u; s5 W
2 R s6 C6 Z" h$ R9 D/ Z7 s; K0 K4 N- void MX_GPIO_Init(void)
' q* [; `& y" d! L$ y2 e - {
7 _- G0 T6 X% p/ b& P - 0 w6 k5 Y8 [0 h5 |8 I" ]
- GPIO_InitTypeDef GPIO_InitStruct = {0};7 i7 y: A/ N4 a
S5 u& c1 h% z- /* GPIO Ports Clock Enable */* i3 @9 ?" r8 K( w7 d
- __HAL_RCC_GPIOE_CLK_ENABLE();
! S" A7 g+ Z- \; l' v$ [6 m - __HAL_RCC_GPIOF_CLK_ENABLE();
* j7 m& @- z8 Y0 L" E- x - __HAL_RCC_GPIOH_CLK_ENABLE();
/ J% g% d. O; w! ]' a4 m - __HAL_RCC_GPIOC_CLK_ENABLE();
" V& k" A2 o: a1 v! E& V - __HAL_RCC_GPIOA_CLK_ENABLE();
8 @1 _0 m" L2 Y% D - __HAL_RCC_GPIOB_CLK_ENABLE();. S5 X6 X4 a: [* e$ v
- __HAL_RCC_GPIOG_CLK_ENABLE();' N& U4 a8 [, R0 k. t4 z
- __HAL_RCC_GPIOD_CLK_ENABLE();
1 n4 Y# l5 R7 O9 `3 B5 Z - - c8 ?. a! E/ P: d' n( R$ h6 \- W
- /*Configure GPIO pin : PC9 */% f: i, u ?! }2 C
- GPIO_InitStruct.Pin = GPIO_PIN_9;
2 m3 _3 N1 e% ^* o, L - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;( r. i, \) h+ R% M
- GPIO_InitStruct.Pull = GPIO_NOPULL;$ L" J7 x/ d- d# S0 D, h6 d2 N; m
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;* j4 }' C: S0 s' b; R
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
' Z+ s. F; Y& [ - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);" M% `' o1 V: g s2 V I3 s) ^
0 M% p6 I4 y) O4 s/ D. E- /*Configure GPIO pin : PA8 */
8 ^8 r+ a2 w" p8 S" U- l - GPIO_InitStruct.Pin = GPIO_PIN_8;( W' S; \1 D: c5 R# y
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;7 c( _0 L+ V7 W
- GPIO_InitStruct.Pull = GPIO_NOPULL;! G" z0 G0 \ u5 H
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;4 I2 M% b. x3 U2 [. H* l5 |# z
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;5 L. o5 T6 K/ e( |# j0 `2 V
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/ i2 ?# I8 w- A - $ i# a. B7 E" W& V8 u, E
- }
复制代码
( e( H% i- Z% H" `所以,超出引脚承受范围是不可能的/ e" F2 ]+ ]) {7 m
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。4 S4 a) g$ A# j1 P/ X- ? R
4 f9 G, d: v5 U6 o3 Q" m, p/ G赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,
L8 k8 c7 F# b) B2 [; v5 X
I+ u2 a( T3 b6 y" g+ n1 ~# x- HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)
& g8 b) e, z8 w! V% { - {
- e# ^+ Y# X: C. Q5 c6 q; ?' \! Z9 l - 。。。。。 原来的代码原封不动。。。。。
0 U' Y1 @$ Z3 V! f
# I* a) z( w0 Z, y9 x" H- // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到8 H' b8 ~ a* S6 c* d, f
- ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);; p" v+ q: @5 f5 H6 K+ b; ]( ]: H3 z- S
-
6 z9 `( T9 i2 r, S: U - if (status == HAL_OK)
2 D5 |0 d/ L4 Q' e - {
& M) z8 m2 C: u, s; \1 i j% m - return HAL_OK;; x, i7 |! _0 X( z8 B
- }
: s" P+ m# c5 t" S* O- a X - return HAL_ERROR;
. ?6 _6 k, Q+ C4 p9 T - }4 M$ C! p, S# a4 b% l/ L
复制代码 ! x8 v& V/ s/ q. D
3 N9 x1 Z2 O! b; a
3 @$ T1 y, N1 W9 r2 t' m5 l6 p |