这两天在使用STM32WL55JC芯片,板子是ST提供的评估板,在官网的介绍中得知这是一块多核芯片,其中搭载着一块协核M0+,M4的主核和M0+的协核都可以单独的工作。
. G( A; X5 T3 H7 ?) N& p
2 f6 L7 Q8 \, G6 \2 s/ g我们在使用CubeMX的过程中也可以发现,CubeMX中有开启多核的选项。
1 [) Z$ b; `( @% {3 u
% h! r! E$ k3 g
9 L% t0 l+ N% w/ `4 w) I- s; C( B2 U( @5 j
在这其中我们可以配置各个核心的功能。
% R9 [1 L5 e# ~+ w$ Z' ]
2 e, g7 B0 X- o1 o2 x( F8 F- T
! G8 ]9 K' a# \! q
* W a8 a0 V0 l2 \ S
我们正常的创建完任务之后,配置好各个功能就开始我们的踩坑之旅。0 Q$ ?, s# t# Y9 p# ]5 b
) k; E$ @% V1 V$ g% }STlink连接和烧录问题(已解决)$ \; [' X6 h% Q* y# C
8 j2 C( s# ~ t
6 x/ X+ A8 l& E6 _% {& X4 A* j
5 L9 G* F% V3 ]! W6 E, L我们进入工程之后,由于我们开启了双核,因此两个工程是分开的,二维码默认打开的是M0的工程。而我们的STlink挂载的是在M4的核上,这就是为什么我如果开启单核工程的话STlink是可以正常使用的,并且使用STM32CubeProgrammer也是可以正常连接正常烧录的。4 d3 r7 P9 R5 \/ S+ P
! S7 ]6 \0 z5 Q! o
5 g9 X+ e& C% j! W# S' [% R7 f5 y/ \5 p
但是偏偏开启了双核工程之后就无法使用,我开始还以为是芯片开启了低功耗模式中的休眠模式或者芯片自锁,试了好多方法都没办法解决。3 A+ x# U/ W( {- `* Z2 W6 G# s q
$ N6 L/ J0 V7 b; s1 B3 B+ y- [
! v( ?$ K& O( b/ Y5 i- ^3 q
3 v% B8 V$ s7 k6 T8 D7 ^; G
反正这个问题困扰了我一晚上。查询了许多手册和资料也没有解决这个问题。直到看见了官网上的一句:STlink挂载在M4的主核上,因此突然想起来默认的工程是M0+(之前也没试过这种多核的工程)) T- j: W" C( c* ]8 w
B- @3 d% [) ?( w. p7 R+ C" Y
, }6 O6 W: v: r
^% x! k+ V: r; K# t# M& @
因此将M4工程设为主工程,之后发现就可以正常的检测到 Stlink了。4 P0 A7 Q& _. \
9 t5 Q* m" v5 H) l) n" S/ M( ~ N
/ n& h) _5 T- @( Z. h' ^2 @8 o5 y l O- M
这里注意的是,我们还需要更新一下我们的STlink固件。8 A( x+ Y7 J/ h$ V7 j1 D1 b
# n% i0 L) {+ J) n连接上我们的Stlink之后,我们就可以正常的烧录了,然后M0+的核也就连的上了,不知道是不是因为之前板载代码的问题,总而言之这里是解决了烧录问题。# C. F$ F8 v" D- N7 }7 T l) F# J
# E5 e4 [, \3 ~$ S不过后面还有更奇怪的问题。
) d1 l% Z1 u- B a+ Y/ r; K% F4 i W5 R$ \4 {& E7 C3 K. R/ I
我在While里面加了GPIO翻转的代码。' X/ R/ B! e7 s+ \; @ p N# O( ~
- while (1). r0 F& J% i" `# b4 P
- {4 k( m+ I* V3 f0 _. O2 {# U
- /* USER CODE END WHILE */
# e5 p" M# r. }
. H+ ~( j. p I3 p- * `2 z1 D# r, @1 ^. }2 {: E
- /* USER CODE BEGIN 3 */$ i$ G) K; ^2 p
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);2 W* f5 e5 d# K, d( N
- HAL_Delay(500);
V" d" ?( K4 t. o6 {7 e - }
复制代码
5 t* M7 l E9 _& X# R7 y* S* `4 o首先需要说明的是,这个IO确定是LED的IO,而且我也配置了GPIO的配置。4 a) }2 Z# d9 }/ G. f: G
K" ?. I1 h% G9 z! x+ ]
* u8 T& c/ q; z! W8 L4 T; O6 [
& ~9 U! E D0 ?% ~ v& Q但是LED不亮,不清楚是什么的原因,但是程序中是有关于CubeMX的GPIO初始化函数,然后我以为是程序卡住了,调用Debug之后发现程序是可以正常运行的。但是LED还是没有反应。; D* w; a! i" ]
6 C0 W/ u8 Z- o8 \7 Z+ j* U于是这时候突然怀疑是GPIO初始化的问题。2 ?, N* I$ g4 d
G5 g6 y% _2 d9 eCubeMX的GPIO初始化问题(未解决)- void MX_GPIO_Init(void)
I6 B1 Z& ~- S3 R+ a; Y - {: M7 I; T6 F& f* C
2 y" ^. k7 }' e- /* GPIO Ports Clock Enable */
) x/ x( F/ h+ x O8 ~8 F" d( H - __HAL_RCC_GPIOC_CLK_ENABLE();
- |& n/ k+ I, b/ _0 _& q - __HAL_RCC_GPIOB_CLK_ENABLE();* }. _2 _4 C3 P' w. @+ s# k
8 L. f+ |6 V. J; G- }
复制代码
9 _2 u0 E( ~. @) s7 z! |9 V* N! F# m( Y, ?6 }6 R- _
这时候发现GPIO的初始化函数居然是空的,这也是我第一次遇到CubeMX生成的函数初始化失败的过程。
& |- B h. S! Z7 F/ j' A; T. m1 c+ b9 O7 h5 M4 m
于是自己补全了GPIO初始化的过程。
' l. |$ j: e; a- void MX_GPIO_Init(void)6 P ~' m' g1 \5 D' i
- {
( c' e, `2 }" [' L1 d
z- G3 W' h" Z# j( ~# S- R- w) V- GPIO_InitTypeDef GPIO_InitStruct;. D. o8 k" |: B
- HAL_RCC_GPIOC_CLK_ENABLE();
{: }5 q/ v; B, V - HAL_RCC_GPIOB_CLK_ENABLE();
; ] y& g, m1 l: L - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9|GPIO_PIN_11, GPIO_PIN_RESET);
. r/ i7 B! j7 I G6 G* P - GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;
8 S* f; |% i* O: e - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;0 c$ o$ ?3 q# {
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- r* f6 Q+ k) X* `3 E7 d3 ?5 r+ C - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
2 ?9 P2 ~( \+ N& s5 @1 _7 h- o+ Q2 T N - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);4 x' m5 P2 w7 M# V* w( H
- ) q7 J" k: {* A1 J# C
- }
复制代码
' q( s8 E' w" O% n; M8 u0 b这时候LED就可以正常使用了,这时候给第二个核配置LED也可以正常使用了。 \0 h8 r; `" K$ k2 A# r$ S' h
# F# w1 ^/ f0 O( J( ]' I5 |* O
后面开启USART的时候,发现其配置了USART,但是GPIO的内容依旧是空的。
; a7 v4 @& q9 z6 w0 S4 y6 F- void MX_USART1_UART_Init(void)3 T$ f4 }* G/ w! }# h" r
- {4 v; [: ?) k1 N5 d* M
3 k8 i; B. V1 v* X: B- /* USER CODE BEGIN USART1_Init 0 */
2 w# L3 o( h2 _4 D0 \ - 7 t( _7 o( n" y: f; ]* R
- /* USER CODE END USART1_Init 0 */
' f' Y" ]% h0 ]9 g5 x4 d, T - ' E1 _9 n2 \3 _ m5 `2 s
- /* USER CODE BEGIN USART1_Init 1 */& f. O `+ K& K
3 U3 M/ S, U# \" N9 k/ B% A- /* USER CODE END USART1_Init 1 */- f& t1 Q }3 W: V1 w# w6 w' e
- huart1.Instance = USART1;/ p3 {. G" ~6 k5 l4 u
- huart1.Init.BaudRate = 115200;1 \# }* y8 ]% |8 a/ i7 F
- huart1.Init.WordLength = UART_WORDLENGTH_8B;9 ]5 |0 s9 M7 l! R! z- z8 u% }7 L8 J" l
- huart1.Init.StopBits = UART_STOPBITS_1;- x8 u$ s" q, z2 v. N+ ^
- huart1.Init.Parity = UART_PARITY_NONE;
0 T& T+ @+ r% q% [; o/ M" q ?/ a - huart1.Init.Mode = UART_MODE_TX_RX;4 Q" v C. Y, [; n
- huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; k7 J2 @( m: }+ d2 M# [( G7 N
- huart1.Init.OverSampling = UART_OVERSAMPLING_16;
7 D4 N7 Y+ n" Z0 J$ X2 M4 h ^ - huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;9 _* {) m9 B! b6 Q9 g
- huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;3 j! ]1 ], L: H* R: p8 t* U
- huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;- H& G8 Z, ~; r2 c* u1 e& D
- if (HAL_UART_Init(&huart1) != HAL_OK)
/ h4 K1 L, n4 C" ~5 u* [, T) n - {$ X/ j4 ?2 U9 {' J7 h6 \ ]
- Error_Handler();
: d7 z3 A/ v5 v5 r - }+ g/ e3 J8 a2 }* b
- if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)7 Y8 A8 a" M% Q# O, H
- {
! {; u* i0 P. l9 G - Error_Handler();" k" M1 l0 ~% x
- }
. [9 e+ C4 G7 s7 w3 K; T - if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
* x& Z0 l |' b! I; l% c; N2 A/ y9 X - {9 n Y1 i0 {+ r; B6 [: E* ^
- Error_Handler();; T6 ~/ e; H7 C' a5 \5 o
- }6 ^% x7 M4 Y2 \$ g& u- [
- if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
( ]( q' s: y( U# S4 E - {
- z/ k9 g2 S5 ?* n# ~& F - Error_Handler();2 b' ^; _3 z& {5 ^, z: B
- }
z$ w2 l# M+ N" p7 `3 r6 ~ - /* USER CODE BEGIN USART1_Init 2 */
+ ^/ z# b. w* Y - ' d+ o d/ d8 G9 Y8 @1 j
- /* USER CODE END USART1_Init 2 */0 {- S7 ]5 Y% m
- 3 n( } { n. o) \ A7 T: |* M8 i
- }
复制代码 $ j2 j! L2 q3 ^% j
! t- ~1 ]; E( t! Q" {! u3 ]' n2 J0 g+ Z( e$ u8 E' N+ c
, G6 Q, w$ Y8 [' z然后试过了,如果不分开文件的话初始化也是没有GPIO的初始化内容。+ ~4 D! _2 ]; F+ J/ H6 D1 ` c% C2 y9 W
N( z3 g" I0 G- Q( Q
* i7 \- K$ Q( [$ _( g2 V7 F9 z |8 w+ G/ b b! q
, I, ?: @6 H( |9 _# m9 c; g: m: f5 R* d
转载自: 电路小白
" K% }& B' s1 R: t* L如有侵权请联系删除! U: i8 J+ [' M
* u2 \# H" k/ u) v0 Y/ ^* e
" m" e; M3 y& f% L
3 W. U0 S# y( ?- V T! M$ P |