因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
% a" o% R" r3 B# |5 `7 a
2 g/ L( [. P) l9 _! A- void SystemClock_Config(void)& @7 o5 H" }' m2 Y! w8 }( C
- {
. x! X, F% u- e- _7 J: B: U5 \ - RCC_OscInitTypeDef RCC_OscInitStruct = {0};
& q+ `5 O; X8 ]+ b: [6 u7 ]* _6 B+ b - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
, L7 i% ^& t) G/ v4 {$ @+ Z. c0 ^ - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
" H8 D! S( q& W b# d - 0 I0 E4 V- i- F1 ^ S$ L* I
- /** Supply configuration update enable X7 b. i' B! W. _5 c w f
- */
! u7 K# O5 h8 Z0 {# E0 p - HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
. ^% t* [+ J6 T C( D; A" W# |! Q - /** Configure the main internal regulator output voltage - C0 {; Q6 I: e
- */
6 K0 t9 u8 J6 M+ r) N: t* Q - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
, D- Q8 B! H( s% R4 Z
, ?) Y- k- w( C7 b3 _6 _+ ?- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}1 s( B& L5 s2 j* d. U" v5 z: Q
- /** Macro to configure the PLL clock source / a8 Q( h9 T2 X5 }4 i) ]
- */
% K8 E, H' ?! f P9 ~ - __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);. K p, ?6 @# I; E) e0 z4 r7 A9 C
- /** Initializes the CPU, AHB and APB busses clocks
- S( l' A. ^1 [9 F* b$ z4 a7 F - */8 N* _9 f2 {, F+ G1 P: |) v9 J
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;. m" k0 `# Q+ t
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;# {+ ~$ L8 [( Y' s4 I- Z9 m9 D
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
4 I( b+ j2 y6 t0 w9 u - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;3 A, K+ b6 ]* g
- RCC_OscInitStruct.PLL.PLLM = 1;
6 @+ w3 n$ V+ U: L9 |7 ^! U/ O - RCC_OscInitStruct.PLL.PLLN = 80;
; o$ I% F6 Q7 P - RCC_OscInitStruct.PLL.PLLP = 2;5 s% W+ w. i- @4 [9 C! ?* d( K7 O
- RCC_OscInitStruct.PLL.PLLQ = 40;
% e& b6 l# B, a5 i* k - RCC_OscInitStruct.PLL.PLLR = 2;! c9 }* { a+ M& p7 p" g, R* U
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;5 d/ A) m# O u8 \
- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
2 g* w7 k& n; y& _' O) h - RCC_OscInitStruct.PLL.PLLFRACN = 0;
3 z8 M! O. C# h4 {: z( t; N - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
1 p2 V* n) D9 k - {3 k5 X2 e- T' d7 s0 p* l; p
- Error_Handler();
4 H7 M" }( x8 u7 f3 ] - }* g3 f; c8 v- {' h ^# W p
- /** Initializes the CPU, AHB and APB busses clocks : s9 \$ H& \8 g+ Z, g1 D/ d3 Y) n+ R
- */
% z/ _7 M& b7 e/ q8 y - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK( a( Z, o/ J5 M+ e5 c; Z J0 u( z
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
4 Z" L z& c* I! `! ? - |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;& ^8 b4 L! p3 M2 B' {, m; z8 d
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
8 A8 t# ^- x% x - RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
1 f# R& D! D7 d* b; V3 B/ u! ~ - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;( m; s+ d" X, k) P3 L% M8 S. `
- RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;# B/ j: V* ]! C6 q8 C6 X: y
- RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; Q$ V. V9 a. f4 e8 G, }$ _" _
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
; i; x5 Q& X( b3 p - RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;/ j/ W* @: m% \! p$ k9 U; }. D7 Z
5 L/ }5 Z: A& m8 w% ^- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
) }: E8 ^" }( l# ^! k T" Y0 i% T# z - {
9 D0 n3 m3 g8 O3 T - Error_Handler();
9 U0 @& s* s& s - }' w) I3 p" I! Z2 y5 ~1 O2 Q
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C19 o# }( H: |/ l& D1 w; s: B! L
- |RCC_PERIPHCLK_FMC;
) n# U5 z8 D. n0 D/ c - PeriphClkInitStruct.PLL2.PLL2M = 4;
) c+ U1 E i0 q0 A* F6 V$ c/ c - PeriphClkInitStruct.PLL2.PLL2N = 80;
; O5 w' T8 j' |+ ` - PeriphClkInitStruct.PLL2.PLL2P = 20;/ K, u& I! k) g9 x7 d/ s
- PeriphClkInitStruct.PLL2.PLL2Q = 10;
3 v+ p3 Q- h+ S. l - PeriphClkInitStruct.PLL2.PLL2R = 2;$ r5 n3 V: D. }6 \8 q
- PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
. ?. T a4 e; g5 ?6 K# F$ ^ - PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;+ O$ T- r' w- c: o$ p0 }6 M
- PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
# ~+ n) ~4 T% h8 m* P$ K; c - PeriphClkInitStruct.PLL3.PLL3M = 8;
: {/ T9 M& w6 c+ C- T4 W. j - PeriphClkInitStruct.PLL3.PLL3N = 128;, q& ]# Z/ l- A4 A$ M5 L
- PeriphClkInitStruct.PLL3.PLL3P = 2;
7 Y5 n9 f2 r( ^* Z$ _2 k6 ~4 g - PeriphClkInitStruct.PLL3.PLL3Q = 2;3 {6 s9 v/ T L4 a0 S9 i
- PeriphClkInitStruct.PLL3.PLL3R = 8;& l( b: x6 B# W' J( c
- PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;, E+ v" z3 x: l6 d
- PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;5 s: C/ ~% s- n1 b" \
- PeriphClkInitStruct.PLL3.PLL3FRACN = 0; s1 u S& v( T: ^* I+ `
- PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;
[' o! O, F5 d - PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;
3 f/ A, }7 v6 ~3 V- ]2 {. s - PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
4 W8 r9 S6 j$ X, V - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
; i! J2 O" w x6 ?# W - {+ S* c4 M# c# u" s5 t6 G
- Error_Handler();
& D% \% f+ H0 R$ R2 W8 W - }
& E4 Z" v1 u: Q4 _7 S% p% u* m+ _$ D: E - HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);0 W# D' h3 f& \0 z
- HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
, r9 y2 |& F3 z) f. l1 n7 x+ X' ^ O -
5 ^$ Y% B: m2 J! } - //HAL_EnableCompensationCell();! ^4 L, ?) s s* w; Z
- }
复制代码
9 I, ]/ R) y y, E2 Q可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,3 g- z5 w2 q, z& {" A. _2 y
I% v; n( y5 I- g9 f
- void MX_GPIO_Init(void)9 p8 l5 C3 d! {
- {
$ n: l5 Q2 @+ p$ u2 R* J% d - 6 q' s8 s4 z" t' v8 R2 w& w
- GPIO_InitTypeDef GPIO_InitStruct = {0};
# {( R5 x; W# z9 T
$ r/ a- c8 s1 j8 |9 t5 g- /* GPIO Ports Clock Enable */
3 Y. Z( J( t+ ~ - __HAL_RCC_GPIOE_CLK_ENABLE();* { s6 ?8 f0 R& D5 A
- __HAL_RCC_GPIOF_CLK_ENABLE();% |% y( n6 a, g9 p2 K
- __HAL_RCC_GPIOH_CLK_ENABLE();# W' I+ o' T) f6 G, s
- __HAL_RCC_GPIOC_CLK_ENABLE();1 f1 Z. M9 b M9 ^0 X
- __HAL_RCC_GPIOA_CLK_ENABLE();
" f- Q2 j. L7 @; m' U - __HAL_RCC_GPIOB_CLK_ENABLE();3 F7 @" z; D+ l' p$ [" q! ?
- __HAL_RCC_GPIOG_CLK_ENABLE();* H2 k# z) A1 b3 P- [0 ^# Q
- __HAL_RCC_GPIOD_CLK_ENABLE();
5 q. A; @; j1 H5 V
7 K" L$ o: @4 Y P- x$ q1 `- /*Configure GPIO pin : PC9 */" H! N5 p% ~0 a0 s
- GPIO_InitStruct.Pin = GPIO_PIN_9;, n2 P" U1 h7 ^8 Y5 Y
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;3 G8 W$ k- R: i1 r) X! n! j
- GPIO_InitStruct.Pull = GPIO_NOPULL;3 H( Z$ X! ~5 O0 s& Z8 |1 ~
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
6 u, x& R6 B8 p3 _ - GPIO_InitStruct.Alternate = GPIO_AF0_MCO;8 u, S& y5 Q4 v& e
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);0 F: Z( @0 w6 V6 c/ m
+ j9 I; ?; d& h# k- /*Configure GPIO pin : PA8 */
" M* d, j& s3 t( G. J, n - GPIO_InitStruct.Pin = GPIO_PIN_8;& G; p9 T5 c8 D3 F5 r
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;! ]7 r" |8 m) r! R! q3 q" t- U
- GPIO_InitStruct.Pull = GPIO_NOPULL;
# `3 x% _& {* R5 y8 c; f! M Z - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;- j5 @; A% Q* q0 [ \" ~% o2 T o
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
7 t, g/ k4 z" ]' d: i7 [7 u' E! V+ A - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 Z3 s8 C, n8 n2 W6 l
- 6 b+ I3 C6 `: B1 W: E' K
- }
复制代码
6 Q- c# @) J/ s8 Q" A所以,超出引脚承受范围是不可能的8 A7 X! G$ m. x! b- M0 O( C7 F; O6 ^
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。* }. }( t, \) b% O- g
! C% K. \, r6 |6 a8 S4 [- O
赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,% ]4 x9 t: ^# p# d
2 n" B$ G, G! E; W" @9 ^/ D k1 n0 s* O- HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit). a& o k3 P0 f, q$ u4 r
- {
) e$ p: V3 j4 B7 q0 V) B2 [& J/ K - 。。。。。 原来的代码原封不动。。。。。
( F( x. U9 l' h# f" F
; p. H( @3 u# T1 a u- // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到& T2 l4 T$ O( ^+ D, s8 Q* u
- ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
: m2 v- Y0 ?# q$ l$ E+ _ -
( [. m* R1 q9 _' p - if (status == HAL_OK)
* N& |) m6 i+ l4 L" G* F' N - {
+ c8 j/ j) I. v# D1 ]. i# Q7 h - return HAL_OK;
" j/ {/ \& L3 r/ J* a - }
7 K H3 J |0 w- S - return HAL_ERROR;
1 r4 D1 G5 l1 r: d5 e A( h/ ] - }" k. d8 O" g9 q/ {4 n
复制代码 ( m7 o, R: ^1 z+ N+ A/ ], j2 Q' n
! I: G! O& q; x S3 {) H2 w
, F/ Y! h' O- ~- Q |