因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
& k+ k! d! T" g, O) I% l- O; b8 e. C. r. ?
- void SystemClock_Config(void)
' H7 _/ S8 ]4 ^: | - {
, x# O8 `% b' j - RCC_OscInitTypeDef RCC_OscInitStruct = {0};
0 C( a* d1 k. d7 e! M - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};$ r+ g1 G1 X- i. I$ @
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
4 A* ^: r8 {0 s - 3 Z, Y$ R$ w$ f8 j) s3 F# H7 Y
- /** Supply configuration update enable : `" y- G# N; @# `( `2 x5 U' z
- */
9 i8 n0 G8 T3 Z9 `; d - HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
8 w) e7 ?7 ], B1 i7 x, I; r0 f% b) I - /** Configure the main internal regulator output voltage & K E3 X) [4 e- q7 ?
- */
9 T F. T- c7 ?% _ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);" K! M, \4 i) E3 \; c# C6 ]6 X' \
- ! h7 Q2 u* e! `/ M
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
1 N, M) \( a: r5 P - /** Macro to configure the PLL clock source
0 B4 G! P# j. _) k - */
0 Y. @9 Q" S/ m+ q - __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
4 t. Y7 v& K1 z5 B3 ]+ b2 m! ?6 G5 J - /** Initializes the CPU, AHB and APB busses clocks
4 i0 |& G0 j% I4 a - */
; | o( h6 R# J" e. B8 c - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
1 o2 i* _2 h9 @9 S - RCC_OscInitStruct.HSEState = RCC_HSE_ON;
' _7 ?9 B; _1 J* ^/ g! h" O# \% j - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
d% t3 ^8 y2 O% M' {# V - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
2 p4 I2 i, l3 J8 q# S* S" o - RCC_OscInitStruct.PLL.PLLM = 1;
) @( {$ c! H) V7 n) v/ J - RCC_OscInitStruct.PLL.PLLN = 80;, Z# f( b' I4 k7 F) Y
- RCC_OscInitStruct.PLL.PLLP = 2;/ d! V0 @ u2 c& ^8 e3 ~, C8 H
- RCC_OscInitStruct.PLL.PLLQ = 40;( T+ N) l! a: b
- RCC_OscInitStruct.PLL.PLLR = 2;
" s M% E4 a L6 G! e, o - RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
# y |" d, g3 `- N - RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;1 T$ B3 w6 `5 \7 Y
- RCC_OscInitStruct.PLL.PLLFRACN = 0;
- ]/ I9 r U$ K0 T5 m - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
, Z* r) b0 h6 L0 q! r# c - {
% x, n6 X* U8 M% z6 o0 O, c - Error_Handler();
( z8 Z& \1 G( \5 m - }* k3 n5 f* ^1 u
- /** Initializes the CPU, AHB and APB busses clocks , D; m8 D, C( n: X9 M' ]& m1 R" W& `1 f
- */
5 R3 |9 F+ K0 p6 V - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
d N/ B u6 c& C( ^/ F+ R4 c: p - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
1 ~/ x) I/ t# I8 ~7 r+ l( P% m - |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
& p# y3 b7 h. p* o1 ?7 a - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
j, c# ~" {6 }, f! Y - RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
+ `8 }% L* R6 i3 E - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;7 V9 p, B. s/ w9 F1 }. l8 C
- RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;+ Y* ~, D& v/ |- \6 c' j9 i
- RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
* s& l' [! A! U9 R5 G' u - RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;) Y; W' z4 c6 A6 a- N2 e
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;5 J9 p: k- b7 z7 I/ `) X
' Q" ?, C% Q9 U* A/ l l- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
2 k% Y' C# R8 N& ]1 b2 @ - {
9 S; Q4 {1 c/ R" y* t* R. ?; ~ - Error_Handler();- Y9 a( U- ~# O9 {' s3 l2 e
- }
6 h: d8 n0 c0 H; N4 ]* J6 w - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
- H& t0 K/ p* L0 e( f- ~) A - |RCC_PERIPHCLK_FMC;
" T* n% U0 B# z( w! I1 r% o; T, ] - PeriphClkInitStruct.PLL2.PLL2M = 4;7 U5 d6 ~% O: Y( a3 U- e$ c8 k2 n
- PeriphClkInitStruct.PLL2.PLL2N = 80;
2 o R# ^% y/ t, L - PeriphClkInitStruct.PLL2.PLL2P = 20;5 _2 g2 ?# @: [( l: p1 b0 x" p; u
- PeriphClkInitStruct.PLL2.PLL2Q = 10;1 v/ x& ]/ ?' _0 e
- PeriphClkInitStruct.PLL2.PLL2R = 2;7 }3 F6 z' Q) A2 p, c
- PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
: s5 p% @+ u! T# I8 P% T( y- C - PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
% F+ d" t p* x; g; y& y - PeriphClkInitStruct.PLL2.PLL2FRACN = 0;1 |0 o9 r9 k5 w
- PeriphClkInitStruct.PLL3.PLL3M = 8;9 p8 R1 x6 R; `0 k. G6 x
- PeriphClkInitStruct.PLL3.PLL3N = 128;+ k0 I+ i0 v! q1 k, X, L
- PeriphClkInitStruct.PLL3.PLL3P = 2;
# r( E- \4 [1 N8 L9 i - PeriphClkInitStruct.PLL3.PLL3Q = 2;
! @% z! t/ s4 Y! R- P2 ` - PeriphClkInitStruct.PLL3.PLL3R = 8;
; G# l8 A; [. B8 J! k6 S' j. p - PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
2 ]' i2 f$ T+ H: M- `/ f - PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;4 M4 u; X+ Z& R* F {- |' o; @
- PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
9 E, Y# U8 D) }' x' t( x! X/ R. W1 c - PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;
7 K: W& Q& n: U - PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;
# F6 L1 X5 ?0 v# U# p - PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
3 a3 p/ }+ U0 X) F* N - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)% F. n1 x& y4 f$ W. L( E$ n
- {6 Q. e( O. a) j3 y ]6 H8 a, u' H5 k
- Error_Handler();
, V% J2 p) v% K# f d - }
1 n, N1 |. q( V9 Z! F - HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);2 `/ g& m# @4 T! h
- HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);5 ^( N% O% I0 H( l! K0 Q+ @9 l
- 2 Z; ^; F, M W3 @' A$ K+ x' E
- //HAL_EnableCompensationCell();
( H5 C; d# J0 {" U1 Y8 J; I. l) O - }
复制代码 # J% p( Q4 f1 Z& B
可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,, J' v, M% ?9 w- Z. |+ g8 ~. W
. _0 b4 h3 \% {0 C- void MX_GPIO_Init(void)
# h6 o0 G) T) |9 h3 _% l( M( a4 L - {
, {* F3 N' g8 J* R8 o: k# q
1 H" W* C# `' _! w3 m# t- GPIO_InitTypeDef GPIO_InitStruct = {0};
- E# [. x; g3 R5 d0 R5 [
~* Z2 D% v8 v: f- /* GPIO Ports Clock Enable */
1 d) k" X) V$ G - __HAL_RCC_GPIOE_CLK_ENABLE();
! B0 |% r& a Q2 i/ Y! B$ L% S - __HAL_RCC_GPIOF_CLK_ENABLE();
W# C- }$ t g0 S; E! g - __HAL_RCC_GPIOH_CLK_ENABLE();
# P* W' |. b2 A+ p1 R - __HAL_RCC_GPIOC_CLK_ENABLE();
! O* |7 G# i6 @ - __HAL_RCC_GPIOA_CLK_ENABLE();: g: E8 `$ x1 S j/ w- C. `
- __HAL_RCC_GPIOB_CLK_ENABLE();
' j( e" G: @3 p# N" @7 o9 Z% Z - __HAL_RCC_GPIOG_CLK_ENABLE();
$ ]/ ~& q2 A1 ?+ B& K - __HAL_RCC_GPIOD_CLK_ENABLE(); h: g4 I4 W+ k: N; h" H
- : |3 O4 I' H0 s& N; v) Q7 Z, G
- /*Configure GPIO pin : PC9 */. l8 i7 D: Q8 {0 r9 P2 K
- GPIO_InitStruct.Pin = GPIO_PIN_9;
9 z6 ~/ w" {* v, m0 M - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
$ V s# g/ w9 T - GPIO_InitStruct.Pull = GPIO_NOPULL;, J1 I6 v, [$ A% j9 M3 t+ h9 |
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;$ P( _& G5 z w5 i5 s) @
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;, w' Z8 }' U0 s0 p* }* e; d
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);! R* Y5 ] G: W) u
- z9 J- p) G3 V# i/ d1 r- /*Configure GPIO pin : PA8 */
9 x4 @( {/ h. v" c8 [/ J, P4 k4 d - GPIO_InitStruct.Pin = GPIO_PIN_8;
# S! A8 N9 A* b5 W3 Q; \ - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;! G% ~4 f+ E( C3 p) u+ k( n2 C
- GPIO_InitStruct.Pull = GPIO_NOPULL;% f6 o4 W" E7 }/ s4 ~
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;0 g6 o$ T' {! I/ q
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;7 G# S& `% P* p! K4 |
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); d5 x3 ^$ c. w; e% E2 o( d
. C5 z' T2 l! e, e2 C- }
复制代码
# M3 m/ s0 j. ~5 m" T所以,超出引脚承受范围是不可能的
7 A7 Q; f+ z3 m" u3 |6 q! T里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。/ {; u% g3 J4 i, F% g9 P
! `5 Z7 R4 n" R2 }3 W8 D
赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,
1 d3 j) h. e* F$ F0 ^/ k3 V [( V) o0 V. A, l
- HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)
+ ~) }* M. q1 y; V4 H - {
. E# [! Q7 T- a# k/ L - 。。。。。 原来的代码原封不动。。。。。
9 ]' M1 U( V1 @( q6 u* m - $ [7 z" E$ K% E, q3 \6 z. l
- // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到( c, e: f% m7 T+ S0 V
- ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
3 x7 ?* ?: C: g5 ]5 H -
3 W! H" @0 l2 \6 O4 B - if (status == HAL_OK)
( z6 M% b$ {" E1 M4 Q! U0 s - {* q4 C9 k: Y+ H9 f- b+ I
- return HAL_OK;% B) E0 z" N& N0 {, e Z @' E
- }; z# S! O8 _/ m* n/ e
- return HAL_ERROR;
2 q1 ?( i, L: u! t7 H - }
! b7 v; M0 J( T) d) R
复制代码
2 V: m) K3 D% q/ e# w' E
( f# n+ n; k6 @' [4 Y V8 P& |4 H# U$ t$ B! U+ G
|