因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
4 \/ Z5 S$ F/ a6 J. M' m! i$ L9 A4 i3 C: u0 ~
- void SystemClock_Config(void)" C' e' e$ h* g9 q4 b% c' U
- {. P; ^7 @! ^' o$ | V5 x
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
2 h* i" x: p% b6 P' l& U - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
1 H9 O1 @% q2 j. w - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};% p; u8 {/ n0 F( ^5 u+ J& J- m% d
, Q% F) x9 O3 a5 ?& P* N' @6 N, Z" w- /** Supply configuration update enable
* J' B* M) k7 @9 S- l$ P/ T6 E - */ : q9 u# `4 q! L- _5 R" M! b+ t8 ~
- HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
& }5 [& h g5 t+ [" e3 Q$ Q( ^ - /** Configure the main internal regulator output voltage , s2 e2 E& K* }2 i, M8 c X
- */
# {6 S# ~; p4 L: |4 j - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);3 x7 G( e! \4 X f
- ! o" M% C+ I: U& t3 F
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
% [8 V; y7 z$ d, S, ~4 {! Q' i - /** Macro to configure the PLL clock source
6 |0 |/ K' M1 F/ c3 H( P `4 T7 r - */
0 }) T8 b0 p9 ~9 [; P; n' W' T - __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);( J( q9 N# h* ~0 d3 N( e8 j0 }/ j
- /** Initializes the CPU, AHB and APB busses clocks 2 R2 j& u' t- Q" M$ Q8 m
- */
7 x4 K6 D- X9 S2 n* E8 @8 X - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
$ @ Z6 d! W: m( A( c2 ^6 f5 ^ - RCC_OscInitStruct.HSEState = RCC_HSE_ON;- |0 c- U: q; c7 s( e/ |. y+ q
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;6 U7 c0 v/ ^# J/ K
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- N7 Q: S, C3 S$ U - RCC_OscInitStruct.PLL.PLLM = 1;5 Y/ A5 ]& [& Q
- RCC_OscInitStruct.PLL.PLLN = 80;; [6 p6 U8 p' |3 |2 N
- RCC_OscInitStruct.PLL.PLLP = 2;
& }: m2 b1 G" j0 f9 k0 P! C- y$ i - RCC_OscInitStruct.PLL.PLLQ = 40;
# e# r& {9 ~3 n* P - RCC_OscInitStruct.PLL.PLLR = 2;
2 M+ w! b- U. g5 g - RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;, M+ I& z* n. E6 c/ y, S
- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;4 o9 ^* _* K; s# h
- RCC_OscInitStruct.PLL.PLLFRACN = 0;
* D- h& g7 L6 h" y: I - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)* O8 `# K# A! _# q# v+ I: y1 G
- {& S+ W7 ?/ d+ d
- Error_Handler();: q) [" V" M2 S
- }
: M9 ` d8 l; G ]( a9 ?. v6 h: u9 W - /** Initializes the CPU, AHB and APB busses clocks ; O! @6 p3 B0 I1 a3 |
- */1 P) c6 I- Y5 @. {# ~
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK3 _, T0 O2 {: l0 q
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2# q s {6 e' l' x3 Y
- |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;% x& V4 d, n1 c8 ]. Z+ z& F0 x( Y6 {
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;0 R, o+ Q9 s# \" U A
- RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
! S" x" A2 h4 C6 r% T! P - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
. `9 D4 c! S, P; o. S8 O - RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;+ [& a2 J" u6 ~) ^6 O- u
- RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
( g6 x( E) I7 }& s4 P s8 c - RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;. E0 L% q: q( `3 G" d. e8 G$ K; `
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;* c, F' d0 E2 ]4 ~; _6 E
- . |: i) P- P0 {% S1 V2 s
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
A$ H6 l- a9 t( q - {- k; r% ~8 z. g- p5 P& D
- Error_Handler();
( s9 g( N8 U7 F1 ]% ~1 X6 A - }: ~$ L u' O& [% {8 @, g4 O
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
! }. G, v6 t5 N4 I4 F) v+ | - |RCC_PERIPHCLK_FMC;
: C) i" Y E: g - PeriphClkInitStruct.PLL2.PLL2M = 4;: j! H2 C2 t# O
- PeriphClkInitStruct.PLL2.PLL2N = 80;+ h8 d# T: m6 T' {+ J
- PeriphClkInitStruct.PLL2.PLL2P = 20;
+ G- L" X; H; ] - PeriphClkInitStruct.PLL2.PLL2Q = 10;
. s9 K+ A, C( L5 P6 \ - PeriphClkInitStruct.PLL2.PLL2R = 2;
+ h# j3 A: G+ z$ [: V - PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
2 `$ E1 b4 o& | - PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;) e; Y) X( C* E, ?1 u
- PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
+ i- D1 j9 W0 S! P- I7 I - PeriphClkInitStruct.PLL3.PLL3M = 8;8 j# F* B5 S6 Y4 L, E
- PeriphClkInitStruct.PLL3.PLL3N = 128;. m, K6 L- x7 `6 ?
- PeriphClkInitStruct.PLL3.PLL3P = 2;
" a* b2 t( W; Q8 {0 z4 P - PeriphClkInitStruct.PLL3.PLL3Q = 2;
# K J: @1 e/ i - PeriphClkInitStruct.PLL3.PLL3R = 8;
- I9 H9 x- N) x7 ?% A - PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;9 D) u& b5 \, L3 L
- PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
' t1 E9 r# r G0 b* O1 \) z - PeriphClkInitStruct.PLL3.PLL3FRACN = 0;4 d7 Q' W6 ^5 t8 w
- PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;( R u' Q5 x- n) U
- PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;( `; m0 d! \+ @; U
- PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;. X0 N$ \5 Y* i+ v( D
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
0 t/ R6 G( V/ v6 P" F- K1 k - {# X" k! b; }9 N9 A! p* Z
- Error_Handler();
n$ S/ k+ ^( g. M1 e# e& u. |2 ~; c. G W - }, T, z$ Q6 L* l: L9 U
- HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);2 v( a& m7 J, L
- HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);1 H* B! z' c5 ]. ^; P+ C7 f- G% \( K
- 5 Y! t' ]3 \' i# \ V8 |9 H
- //HAL_EnableCompensationCell();
& |8 o: `9 L8 z- w( w. J& S - }
复制代码
: r3 m6 b; h0 P$ {" \& }& W可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,
1 b) e# p) s/ W! w4 C3 h
; j: Y4 H9 a+ g2 c# j/ N- void MX_GPIO_Init(void)
% [3 p6 Y! U% X' y5 P f! G7 \( P - {
- \$ l' P W. G3 o - ! T# J# R& W" y' K p
- GPIO_InitTypeDef GPIO_InitStruct = {0};, }" _6 E! Y+ O- Y$ G* k
6 `2 V* [& H0 J; n8 y$ R- /* GPIO Ports Clock Enable */
! ~1 ^3 }+ {3 g# e7 W$ b7 W - __HAL_RCC_GPIOE_CLK_ENABLE();
% g2 k% m* [8 S: G# e3 ~. H K - __HAL_RCC_GPIOF_CLK_ENABLE();, p6 \' L( L- j# t- _/ S' P
- __HAL_RCC_GPIOH_CLK_ENABLE();
" i: R+ U k a2 `7 a2 I0 u/ w: Q - __HAL_RCC_GPIOC_CLK_ENABLE();% M/ _+ f" l, [3 O
- __HAL_RCC_GPIOA_CLK_ENABLE();
' j6 \. f, a% G% \* k& I" j1 ~ - __HAL_RCC_GPIOB_CLK_ENABLE();6 g2 z! o' J' U4 z1 ^
- __HAL_RCC_GPIOG_CLK_ENABLE();! W% |9 G+ _, ~6 X
- __HAL_RCC_GPIOD_CLK_ENABLE();1 {9 s5 S) c8 X* ?
0 J+ a( m/ l& E2 s' m3 P- /*Configure GPIO pin : PC9 */% O& N; N5 `0 }1 R3 k- f6 |
- GPIO_InitStruct.Pin = GPIO_PIN_9;
2 F4 K% j4 x) b6 W* J" e - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
( w- x& x# m( t- n - GPIO_InitStruct.Pull = GPIO_NOPULL;3 T' S7 ]$ b( P0 Z- ?! B
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
* N2 \) M. ]/ f - GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
- @- y/ b$ A% Z9 }* |+ t - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); P/ h# D4 C/ r
& |3 C* L1 X1 e8 m- /*Configure GPIO pin : PA8 */6 @ a7 S! @6 s' \6 i
- GPIO_InitStruct.Pin = GPIO_PIN_8;' w% H0 Z7 q! `
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
: F" q+ N: h- I5 E# a' p - GPIO_InitStruct.Pull = GPIO_NOPULL;6 N1 K* O( z) V$ x2 @- U! Q, R
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
; M4 W1 f- b H2 c - GPIO_InitStruct.Alternate = GPIO_AF0_MCO;& O5 J, b, Y- v) ]6 x1 ~
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);% p" J1 h, ]5 [+ t6 V9 S! t
- % D# j: B" v! Q) I8 L l, ?! B5 N' D
- }
复制代码
0 o) O6 F2 T0 B, f所以,超出引脚承受范围是不可能的. p& ?# l" s) ^* N K) o
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。5 x0 ^6 e+ c# Q4 y. K( x
8 C$ g+ }0 ~* g* [赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,* A8 t& d! f) ^# \6 K! D
* }' Z- k4 M! T5 X4 g
- HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)2 k: B, H5 P% F$ h" |
- { g6 x9 }3 h' t* q6 U# V
- 。。。。。 原来的代码原封不动。。。。。
}" ]6 [- R- E% m, j3 V+ s - & H. x, g8 ]+ U% y3 K
- // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
# l) u7 z) q9 m# i" S% a - ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);* N7 F; g) m4 b) s X, d5 G
- * w2 y! g6 ?/ M5 u
- if (status == HAL_OK)! V; i, f# R4 r5 d/ o
- {
7 n8 l) Z! i* H* W. u+ C0 x1 P& s - return HAL_OK;
: d5 C( Q; O6 W8 k - }+ `1 [. Y: p/ z) g( A
- return HAL_ERROR;
+ ~+ X: n% Y' R' t, M - }
# X* f) E. e' z$ S7 |( I: \; }
复制代码 7 T3 G# b3 N& m
9 k( m& ?" E1 Z, P. M2 \
3 {# f! `8 r: t9 L3 x$ S; B% u
|