因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下
Q: u, `1 \* g. q% b* H# G2 f# s) C9 u/ z5 H/ U1 C" @
- void SystemClock_Config(void)
2 @ R5 P0 F$ M0 }6 M9 J% p - {
2 m% k. ?; y( @% ^7 w - RCC_OscInitTypeDef RCC_OscInitStruct = {0};# l. ]3 D. E( M- @ B9 n1 r) d* L
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/ s8 ^) D z0 j S1 T! ~ - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};+ g l3 G9 Y& b- I2 w- B6 K8 f
( P+ y! R5 W! B6 H/ v- /** Supply configuration update enable * F4 `3 i; P, R* Y; x
- */
1 L4 X" e9 q \- i5 [2 [& S; \ - HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);1 \1 |: p+ a" _7 u" H
- /** Configure the main internal regulator output voltage 0 j) m1 ^% Y$ Z1 w6 ^8 u& _
- */' o/ \/ r: p- v: P8 b
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);+ O& a' }3 z6 J M
1 H: j; W' @+ \" c1 V- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
( u' N! t6 B) X- m% l - /** Macro to configure the PLL clock source
" E: k! A! f h" ]# ]: ` - */) d T! C4 M1 x) C
- __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
: O3 w, m8 D8 x; G) E6 e$ H - /** Initializes the CPU, AHB and APB busses clocks 9 t" T9 X0 ^# P8 t& W/ F N
- */
" Z2 ?% o) Y3 P, p! r' S$ Q - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;! r. @. u, V5 i0 d8 Q( Z
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;2 r/ y" s+ ?9 Y0 Q& G9 P
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;0 ] R8 e+ q( N* x1 b- K; z
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;* b" E. ]$ J# X. u5 d! E& }! g
- RCC_OscInitStruct.PLL.PLLM = 1;$ H" @. p7 L6 y6 U' a
- RCC_OscInitStruct.PLL.PLLN = 80;
/ {. A1 Z6 q6 Z \6 f/ r. X - RCC_OscInitStruct.PLL.PLLP = 2;
4 T* _, `+ \! I7 K$ L- G, ^ - RCC_OscInitStruct.PLL.PLLQ = 40;
! P" E ]; y. Y+ Z f - RCC_OscInitStruct.PLL.PLLR = 2;/ |# A) v* [, E/ V: m7 P1 `
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
6 R) U9 J* o2 U- D( L - RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
1 Z# n, j* j' v: p - RCC_OscInitStruct.PLL.PLLFRACN = 0;& P6 }: F u" {0 i) C5 u
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK); \& E. @1 S2 L- j0 l9 J
- {
% E$ ~6 G3 t5 b' l! Q# O) b: B - Error_Handler();
' B; i! p: x9 |! t/ `2 W - }& o9 v6 y* Y; y1 v4 R; W0 U
- /** Initializes the CPU, AHB and APB busses clocks
9 t+ e& z6 h/ S/ F& } p7 Y3 q9 ]4 g' A# H - */% s4 z/ U+ l% h5 p; _/ ]* t
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK* f5 E/ s3 B+ k! o8 |
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
1 D$ v% p: b4 ]+ V$ ~9 M1 W - |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
$ n2 E' s: M2 v+ }9 t& [# { - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- [6 F- Y& s7 ?4 N5 M* T/ q - RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
; `5 ]7 E+ f6 ^) ~' y% Q4 M - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;! [5 t# e3 q+ }4 n. y" N5 H
- RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
% I3 h' h7 R$ X8 y+ d9 Y. h! w - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;7 ~6 K+ D8 _/ ~" ]
- RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;( @: K# N* A; R+ F& n6 t6 z
- RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
" ^. k; J& \# z3 k T) l - " L& C% _0 M, l7 V6 z) }' W4 V
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) S6 N. c! W5 L/ J D% ?) B9 f
- {
& f, V6 n! Z- D( o: e/ \ - Error_Handler();
2 m( @5 x2 r+ i0 Y$ @ - }; i: [: A G5 ^
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
7 i! x# ?7 u8 U4 O. D$ T( p - |RCC_PERIPHCLK_FMC;
. a* ^2 n( x3 I) b/ y% i - PeriphClkInitStruct.PLL2.PLL2M = 4;; p0 I' h% L/ t5 I8 w" i8 @! P
- PeriphClkInitStruct.PLL2.PLL2N = 80;- ]8 i9 h# y0 y4 p/ m3 \
- PeriphClkInitStruct.PLL2.PLL2P = 20;0 v1 ~. ~. Y' C; J+ [* P% L, }
- PeriphClkInitStruct.PLL2.PLL2Q = 10;9 D1 L5 h* {$ }- V _; X. N
- PeriphClkInitStruct.PLL2.PLL2R = 2;! `+ n" d$ T) }3 y% m) }
- PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
, a. N% D! z$ v - PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;# v) `% O. O O- C+ H# C
- PeriphClkInitStruct.PLL2.PLL2FRACN = 0;- {( f; i W5 X% x7 A* h/ i5 M, B$ X
- PeriphClkInitStruct.PLL3.PLL3M = 8;
' C m- ]- O! J& I# a8 y* [, M - PeriphClkInitStruct.PLL3.PLL3N = 128;
- p/ p/ A- m/ u) E; K! m- b - PeriphClkInitStruct.PLL3.PLL3P = 2;- B3 h, Y) e2 ^. I& S
- PeriphClkInitStruct.PLL3.PLL3Q = 2;& m4 [$ r. |2 v
- PeriphClkInitStruct.PLL3.PLL3R = 8;
9 ^) _: A: q' U+ b- `" L/ c - PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;! I' p' h# |$ S
- PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
( A* Z* i& d6 l - PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
1 u& f0 z1 P$ e% _( v - PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;
/ ~2 A/ `; \; p - PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;6 U- I3 a3 |& y7 A
- PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;2 L$ \6 q" Z! M( W/ E2 L
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
! {, C6 ~3 Z7 q( c3 } - {* M* X6 N0 C! b2 a
- Error_Handler();
& d/ c3 G0 g$ u6 n+ l! c1 d$ f - }
4 B- x/ P9 L4 h) U - HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);4 s! [- _( u! H+ J
- HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
8 T' f2 x/ o, y/ n3 Y; d. E# J& b" A - 8 F, f9 N* Y! u7 S, Z
- //HAL_EnableCompensationCell();
8 p1 D2 C6 L9 K3 @% K - }
复制代码 " Y% q. n* F& a6 c( a H
可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,
% T% {3 C8 q* ^! k0 Z
9 J% D6 D9 f4 z- void MX_GPIO_Init(void)
3 Q R3 S6 c+ W - {
3 |; P, N: L8 U4 }
, s! H0 {# u8 v' {- GPIO_InitTypeDef GPIO_InitStruct = {0};
2 Y+ `* F# m' s! b) ^; ^; @ - : O; V+ D! ~( _. S C
- /* GPIO Ports Clock Enable */5 d7 a* \- i* |# g6 I8 m* ^0 N
- __HAL_RCC_GPIOE_CLK_ENABLE();
0 m) b$ t$ B) b) @/ Z - __HAL_RCC_GPIOF_CLK_ENABLE();0 ?7 u- H& [6 o9 R4 I, {3 O
- __HAL_RCC_GPIOH_CLK_ENABLE();: W4 F! K+ C1 D7 J
- __HAL_RCC_GPIOC_CLK_ENABLE();% I% N- m# S' r0 Z6 U# w
- __HAL_RCC_GPIOA_CLK_ENABLE();: V* S3 z/ `" N- K9 B; Z$ L
- __HAL_RCC_GPIOB_CLK_ENABLE();# {/ Z; r1 C% _- |8 ^- _$ z+ Y
- __HAL_RCC_GPIOG_CLK_ENABLE();
/ w. @7 z7 s7 D( ^ - __HAL_RCC_GPIOD_CLK_ENABLE();$ Q! V1 Q) m p, ^: ]$ p
- 5 ~6 ^( t, L! Y( H8 R' y
- /*Configure GPIO pin : PC9 */
/ f' D! s: c1 X1 o - GPIO_InitStruct.Pin = GPIO_PIN_9;$ L* R0 p# B! Q, k
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
9 @6 a: S+ ^" i. N m - GPIO_InitStruct.Pull = GPIO_NOPULL;
/ G$ ?; b- p) ?: E5 P$ x - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
6 N4 |; E9 b# J8 e* a s - GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
+ \1 X$ H( q6 a, ` a, k( c - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);( F! ^' b/ A5 M: b- j9 F5 q7 z5 `4 T
0 Z6 h7 Y/ ?* `( z3 G- /*Configure GPIO pin : PA8 */$ x2 L y, Y" B# W4 r6 Q. v6 b
- GPIO_InitStruct.Pin = GPIO_PIN_8;5 u" P- b7 m+ U- C
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
: y6 I7 ^: i7 Y7 H% `8 s7 r - GPIO_InitStruct.Pull = GPIO_NOPULL;
) M( j W1 A5 `3 F4 |4 w9 E - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
* @3 @' Y3 \$ H- o" R - GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
) q' l" B' i3 h, f - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
$ z' j9 T6 t2 M% J. @4 f6 ?5 L
- e8 g! ?, M' j8 @& Z$ y" ~- }
复制代码 : L' w# E0 K- }, A: K: ?
所以,超出引脚承受范围是不可能的6 K6 P6 V# a( ~9 k0 {
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。2 S; \2 N3 L; G% s4 S
5 I( {* K) x/ n6 D4 w5 G1 V) r赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,
; b) b4 F0 i2 H; X y0 n
: }* ^' M" d8 d' T! I- { @9 Q- HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)
' N* S' |- b) c- R - {
* E- f* K& K8 S1 V$ s+ G0 s - 。。。。。 原来的代码原封不动。。。。。
4 p" x2 i; w1 [+ J5 v8 e- y0 J
9 O) D4 w6 \! @9 y& H( B7 s7 {- // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
- O$ X/ M/ |& k5 R( ~$ T* ^: M - ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
% i/ X3 |+ `) T( @ - " S& z+ P! N) I1 {
- if (status == HAL_OK)
2 R( t+ c: |4 G9 e - {
) K$ X: ?, F" h1 r& { - return HAL_OK;
! g2 e; P# j6 p P - }
: `$ \8 \: c" T: L# T - return HAL_ERROR;
% D! V) q8 }* F9 r - }* I: G' ?$ {2 Y! K6 Z( v
复制代码 % k4 B7 Q! e" H
, k5 S* \ U9 X: J& Z. g3 x: J. j
1 \9 B1 V% \( B6 R c4 h
|