因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
) P* d( v6 L9 y. d' w' r& R3 U& s* O; W+ Y( R. x4 ?
- void SystemClock_Config(void)/ ?% G5 x4 Y& y
- {
) R8 W+ @# u) Z j - RCC_OscInitTypeDef RCC_OscInitStruct = {0};4 g. V) ?3 g) ?: b$ {& H" k
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
% |; z6 M% }; | - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};' ?" k. p4 s( ~ o! z
: z% C0 I ~7 S# l' b- /** Supply configuration update enable X3 X4 e9 ~# }. S
- */ ( Q; x' c$ O7 W8 b3 z6 D
- HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
; i3 t* v. f9 i/ } - /** Configure the main internal regulator output voltage
; g, q5 G# ~# \% p$ ^ - */
3 P) L+ a. f6 k - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); q* _& `, O, o% I2 g+ r; `
/ \/ G$ p; u! }, m% C* k- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}7 U! j# @- R0 \8 L6 C. L
- /** Macro to configure the PLL clock source 8 B! k' D' V9 t
- */
" g f. o5 b- j, \ - __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);1 h+ z% B, F8 J& j% W
- /** Initializes the CPU, AHB and APB busses clocks $ ?: p: @) p4 d( [5 O
- */4 [( b. X% d$ O: ~6 l) A. m5 {
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
0 i4 N1 d4 r1 E, C - RCC_OscInitStruct.HSEState = RCC_HSE_ON;
" I8 @, W, B5 E Q4 e - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;" h( C) x$ H$ m7 ~- [: i
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
/ P' Z" ?! {2 K& B6 \* o+ u - RCC_OscInitStruct.PLL.PLLM = 1;" U: X, @! f4 l T- g$ o) L
- RCC_OscInitStruct.PLL.PLLN = 80;
, x+ n8 P5 B0 ^- n - RCC_OscInitStruct.PLL.PLLP = 2;
$ r+ [4 x q( z6 K9 W# o; [/ v - RCC_OscInitStruct.PLL.PLLQ = 40;1 k# H+ k- {/ X+ V* B b4 z
- RCC_OscInitStruct.PLL.PLLR = 2;/ C8 ^, I @8 d' h1 E9 _
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
. k: F2 k5 v1 Y; P0 K# T - RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
) x. a/ D# [% H6 G - RCC_OscInitStruct.PLL.PLLFRACN = 0;
5 j- V# B! X/ t/ i$ D6 x5 Q! e7 P - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)6 K7 U' d$ w3 K a! U5 p6 R
- {( u, s3 b( M/ k( |& g* U" D
- Error_Handler();( E3 w Y" i, q3 M0 @2 m/ H
- }3 C0 f* ~% h I' R" }* q! L$ `
- /** Initializes the CPU, AHB and APB busses clocks
/ Q; k+ y( _/ M - */
! s/ S1 }1 V5 D8 b- \# p% a - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK* B0 V+ u! h5 U; }2 v
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
! }$ E; H1 Z7 L - |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
% b. A' B3 ?5 f) j) Z8 A2 B; ? - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;" a4 D' c4 g* O) b9 Y% `$ E8 ~
- RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;' J* v7 F6 q! `0 ?+ t4 D% {$ ^5 ^
- RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
V1 w6 x! k/ H2 r& W I - RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
. T1 s* U' |8 w4 u6 E7 L - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;# J+ p& r% C0 M7 M1 F
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
! G7 @/ i3 T% H* g - RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;% S3 ^1 |# X0 w5 U, H8 g
- 6 U/ G: n5 j$ F0 j U" v3 U
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)0 `0 z7 E$ J b/ C% n3 x+ o& d
- {% I. {/ B" _% t9 ~
- Error_Handler();0 t7 {# N' l Q. ?3 _! B
- }
& k# M/ T' w6 M% M. V - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
4 B. F- v/ w- Z3 A) W, I" P+ b - |RCC_PERIPHCLK_FMC;
7 c0 f. ?3 z6 j$ t - PeriphClkInitStruct.PLL2.PLL2M = 4;
6 @' S4 x1 X! Z. v! K - PeriphClkInitStruct.PLL2.PLL2N = 80;0 d+ q- ~. b. H( Y- R( p7 E
- PeriphClkInitStruct.PLL2.PLL2P = 20;/ M- t7 b. F/ g" y$ T# I( D
- PeriphClkInitStruct.PLL2.PLL2Q = 10;
- b# L, c! j/ c- O5 g" r* ^8 y4 R6 e - PeriphClkInitStruct.PLL2.PLL2R = 2;
% n4 U- x: M. K+ y$ C5 o - PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;) V/ i. R) V2 a+ Q
- PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;- f+ C& I- i( u: Z
- PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
5 p5 G" S8 E" X- ]- n1 v - PeriphClkInitStruct.PLL3.PLL3M = 8;! h' i9 d1 G: ]' A2 Q K; w
- PeriphClkInitStruct.PLL3.PLL3N = 128;
6 u8 B3 s7 Q. K7 J - PeriphClkInitStruct.PLL3.PLL3P = 2;/ `3 L; K7 h: E* r. I
- PeriphClkInitStruct.PLL3.PLL3Q = 2;* X9 q$ d6 D' b$ J7 m I
- PeriphClkInitStruct.PLL3.PLL3R = 8;0 _3 ^$ O' ` ~) {+ j& R
- PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
; b+ a h. ?$ m& H5 J& M& u' e# j - PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
; r" r: O$ `& c- H/ G( U4 k% q3 E - PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
4 Y9 J5 i/ p5 k1 p Q# Z - PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;$ G/ B, W% h1 _6 d
- PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;9 ]" p4 }, p2 V9 a
- PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
. Q" ]8 Q& D; [- {, [" g - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK), ^1 n- Z& ^1 L1 q1 O" U, y
- {, d; a' l9 _3 k3 y; f) F0 S
- Error_Handler();
- r% j2 Y# k* Q2 ^3 w W/ ?! A' f - }
4 z( N# P2 h$ V3 Q! p! B - HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);
( l0 d! F e% P( I6 v - HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2); R! n, I- X" p" ] C* |- _
- 9 k/ e- T( ~9 u$ l% l
- //HAL_EnableCompensationCell();
' f! s- W% R: Y9 W8 o2 S - }
复制代码
8 ^" c' P) `) U ~6 e可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,
# v2 q* ~4 ?/ a" t
9 e; H/ Q0 Z. G, h6 U; j- void MX_GPIO_Init(void)
1 G6 \) f+ {/ g, V' P5 \" }7 S - {
9 n0 Y z) f9 f" `% }5 q Q* l+ T - 9 Q' W: V* X c6 [& y% h" a* ?
- GPIO_InitTypeDef GPIO_InitStruct = {0};; f; I( X6 Z6 e$ E( T
+ w, _- n t- s- /* GPIO Ports Clock Enable */8 w' O }$ z7 c. S- h; I4 O- b' j
- __HAL_RCC_GPIOE_CLK_ENABLE();
) A% f) P6 t, }; C - __HAL_RCC_GPIOF_CLK_ENABLE();
$ ?5 r) ^' m3 e6 r2 T. h4 z( K! { - __HAL_RCC_GPIOH_CLK_ENABLE();/ M) v6 f# E2 n, L9 |
- __HAL_RCC_GPIOC_CLK_ENABLE();. @8 n8 ^( Z5 j& D
- __HAL_RCC_GPIOA_CLK_ENABLE();
( U) \1 F' l- }! {( B) `: g - __HAL_RCC_GPIOB_CLK_ENABLE();: v$ M' ~* q- M; `3 W7 ]- ~' V# S
- __HAL_RCC_GPIOG_CLK_ENABLE();
: S7 ^/ t# m# R) ^. _/ r# E7 ` - __HAL_RCC_GPIOD_CLK_ENABLE();
1 X/ T; A0 b* E; b' Z$ [+ Q - $ F: L, S8 O6 V( R
- /*Configure GPIO pin : PC9 */; F6 w7 T$ ~9 X& t* P
- GPIO_InitStruct.Pin = GPIO_PIN_9;
5 L! s1 g# K( O! M) f& v* i @ - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;. g* ]' Q5 S) r$ m
- GPIO_InitStruct.Pull = GPIO_NOPULL;
: K" ^( {0 d& I% f - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;# {. l' i/ {7 F
- GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
! B. @2 A4 ]( A% C% ~ - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);0 p9 p7 S1 {0 U, R8 n
- B! b1 G) E6 x) }; `
- /*Configure GPIO pin : PA8 */
/ t$ m% |4 m4 d3 b - GPIO_InitStruct.Pin = GPIO_PIN_8;
v' e$ O% k$ L/ O - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
$ y0 |% V3 }1 c5 w( `! h+ [ - GPIO_InitStruct.Pull = GPIO_NOPULL;4 Q' O! e0 B4 l6 Y7 ~ S' c: y/ Y
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
4 N" j {2 E6 v# w - GPIO_InitStruct.Alternate = GPIO_AF0_MCO;# \) s$ ?5 b" q* W$ w1 o
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 Z, }/ S8 n2 c$ a) H0 ?
9 h8 C+ P: E9 A% I- ^- }
复制代码 5 |+ v, O- i# w0 o
所以,超出引脚承受范围是不可能的
8 a) O4 f6 W4 G- p! S里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。
- r/ z3 m a9 [. }9 F. q+ Z
, ^, ]! G1 c1 A" v5 z赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,9 ^1 x% z: i# w7 @ N
9 C4 V/ F$ }& g' T, y1 ?0 l
- HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)
. | K+ Q( P& h' W9 Q7 {# x( b2 l. h - {. }- b% V4 Y G& v: N3 u" `+ I' V
- 。。。。。 原来的代码原封不动。。。。。7 i8 S1 R8 U$ Y7 H) Y
- ! A+ I0 \$ s5 i% \
- // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
8 r% i* {! V/ f0 @- \3 M9 { - ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);0 j5 i" V5 ?# i( T4 R% W$ D7 o
- 2 T( N+ A( K, u/ y. d
- if (status == HAL_OK)4 n \& c- X4 I$ ^& u
- {* A4 h- ]3 ?& f. D' v
- return HAL_OK;
4 a' g% C2 B* }* }& W* U( o7 ? - }+ h C7 Y& ^0 ^* f" Q8 E
- return HAL_ERROR;+ d" U$ c/ e9 F8 {% ^ V
- }
% y2 b! u2 l u- a& V3 A
复制代码
m& m* i! ~0 h: U1 {1 |# m
9 w- S6 j- D/ F6 Z5 K2 Z6 M! n5 v- T7 d
|