这两天在使用STM32WL55JC芯片,板子是ST提供的评估板,在官网的介绍中得知这是一块多核芯片,其中搭载着一块协核M0+,M4的主核和M0+的协核都可以单独的工作。
/ B, k. b. M: `2 f" z: I7 `: Y1 M* s3 c/ e) f
我们在使用CubeMX的过程中也可以发现,CubeMX中有开启多核的选项。6 w& v! z! G- p# f5 m
3 w4 ^$ t* `5 `7 F
5 }! H; Y0 u9 T
. a, j5 A" ]2 L5 i0 H7 r
在这其中我们可以配置各个核心的功能。
- `7 Q" G& p! s) \3 k, P+ |# C5 s% F' ~, h; d
" }- A [, u5 o
0 j, Z8 z1 w1 M$ F/ W9 c/ p2 [
我们正常的创建完任务之后,配置好各个功能就开始我们的踩坑之旅。2 Q5 W7 ?! Y$ ~
! m5 U9 _5 q. q' \9 w. ]
STlink连接和烧录问题(已解决)! N9 }% _6 q: @. j
/ N1 C1 I" p1 |3 S3 h& A
1 V$ K$ y4 c; U2 ?; ]. i( i, n H5 o( q2 d$ y. F
我们进入工程之后,由于我们开启了双核,因此两个工程是分开的,二维码默认打开的是M0的工程。而我们的STlink挂载的是在M4的核上,这就是为什么我如果开启单核工程的话STlink是可以正常使用的,并且使用STM32CubeProgrammer也是可以正常连接正常烧录的。5 E+ ]1 `3 R- T7 Z+ t. T- m( s4 A
* O2 h% C5 z. ~& Z, V* P$ \& x
1 }, Y) O. D4 |
5 u% n; w6 n' m' G+ ^但是偏偏开启了双核工程之后就无法使用,我开始还以为是芯片开启了低功耗模式中的休眠模式或者芯片自锁,试了好多方法都没办法解决。
4 o4 [9 p" [! a; h7 K! L9 a0 b: K9 c: y: y
" @* D/ S$ G) Q! N5 D: A. `$ x/ `5 X& Z( L4 \" w2 t2 q, p! R
反正这个问题困扰了我一晚上。查询了许多手册和资料也没有解决这个问题。直到看见了官网上的一句:STlink挂载在M4的主核上,因此突然想起来默认的工程是M0+(之前也没试过这种多核的工程): b( R9 p& @1 q d
7 P; p4 A: S. A) p- g! U1 G3 @7 \ h
- U6 B8 `" N( F8 K& \5 ?$ S
; ?) J2 v7 ]# X3 G因此将M4工程设为主工程,之后发现就可以正常的检测到 Stlink了。: `. ^. n- t6 A& p Y; ^! e
5 ^: \8 Y V4 N
2 c5 Y, p% G5 d2 i
) A" ^1 l0 \- n$ C- [这里注意的是,我们还需要更新一下我们的STlink固件。5 w9 q9 y/ W5 x0 I, t0 r9 ?
9 m0 L: H. w. }. d: J2 z
连接上我们的Stlink之后,我们就可以正常的烧录了,然后M0+的核也就连的上了,不知道是不是因为之前板载代码的问题,总而言之这里是解决了烧录问题。 i [) ?: o. o `7 W
s" g4 H1 W3 Q1 d/ S5 o
不过后面还有更奇怪的问题。: e6 l/ o3 _; h( @, k
' p8 J- N/ A) {1 ^
我在While里面加了GPIO翻转的代码。" ~9 ]3 _8 E9 D: y7 B+ C5 D
- while (1)
* Y' o# z0 z8 f7 `$ \0 g- i2 J$ k - {
7 a2 \2 U6 _0 S. m/ V9 G - /* USER CODE END WHILE */
+ ?5 o' a7 o$ ]$ F) ]( x" ] - ( {4 c8 o5 R+ ~# `5 L5 F7 ]
- % f% |/ x2 k- U5 v8 s
- /* USER CODE BEGIN 3 */
% ^, @" X* a' E9 N) S9 y8 i8 z2 Q8 Y0 R - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);
$ G6 L9 T3 D I - HAL_Delay(500);9 k4 t. r) q4 ]6 w7 h
- }
复制代码 9 P- `7 d7 j# x8 L1 J
首先需要说明的是,这个IO确定是LED的IO,而且我也配置了GPIO的配置。# [9 S- ?3 b. j7 a; y" e
& v% W! K# y! E' ^: u( k3 q
5 _1 f* E) @+ x: ^6 S7 W% u) Q; R
& c c. s; a1 _1 H, C但是LED不亮,不清楚是什么的原因,但是程序中是有关于CubeMX的GPIO初始化函数,然后我以为是程序卡住了,调用Debug之后发现程序是可以正常运行的。但是LED还是没有反应。
2 k# C: U C r M3 P/ F
" M2 U P s1 s于是这时候突然怀疑是GPIO初始化的问题。8 k3 Z' L2 d! w' Y+ c3 g
9 c+ ~4 _- `- Q
CubeMX的GPIO初始化问题(未解决)- void MX_GPIO_Init(void)( s' z$ D, R* [* X7 |
- {; e9 A& o' f' J5 W
$ m- ^. L, v% x) o7 F- /* GPIO Ports Clock Enable */: ~/ K; h9 J8 ^, z9 {" M$ u
- __HAL_RCC_GPIOC_CLK_ENABLE();: [5 g9 E7 g1 [8 s. d
- __HAL_RCC_GPIOB_CLK_ENABLE();* E& j8 m0 c9 H" d
% {- w2 X; O% @6 @* O; w- }
复制代码
' H# p2 W7 w7 C' K$ ]
# A) Y% R1 _7 P9 J- f6 G3 k2 q这时候发现GPIO的初始化函数居然是空的,这也是我第一次遇到CubeMX生成的函数初始化失败的过程。
8 R6 U/ M6 _6 F) L3 d8 V" C! c! G& r
于是自己补全了GPIO初始化的过程。: |4 r2 \$ I3 A2 z
- void MX_GPIO_Init(void)
9 ]' y: W0 \: S2 O - {. H- m+ U1 K+ W3 J; H
8 L+ i6 p1 S& e& S7 l$ D5 j- GPIO_InitTypeDef GPIO_InitStruct;3 f. N7 \ G- H; {
- HAL_RCC_GPIOC_CLK_ENABLE();% C8 ]! n; G( z" P' \ @& {; ^ Z) j
- HAL_RCC_GPIOB_CLK_ENABLE();+ u. _$ a6 K! r- q. ~( A
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9|GPIO_PIN_11, GPIO_PIN_RESET);
' |, y9 B* O/ M, R B* v& O7 @ - GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;
. z: \8 o% }0 U6 S0 w, k+ ~; |5 [1 ^- D+ I - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
' l% n. T. D* E1 E% A8 W- P* R - GPIO_InitStruct.Pull = GPIO_NOPULL;" e8 m$ J- W( H& N8 d
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;; \ r3 b# n& J8 j
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
. [, P) W L' D- ]8 `7 K7 u - # b5 \8 ^' \9 v( F/ P
- }
复制代码 / H- b, [& _7 K* R: P8 r2 d
这时候LED就可以正常使用了,这时候给第二个核配置LED也可以正常使用了。
# b% ]: o$ a" f; h" z/ }" \/ g6 H% P E' J( T; ^
后面开启USART的时候,发现其配置了USART,但是GPIO的内容依旧是空的。
: q; S F/ d! _2 S$ ~9 C6 v; C- void MX_USART1_UART_Init(void)
1 S+ ?% m4 Z0 P# B - {
5 j3 o" @9 {3 ?6 x - , Q1 o4 K3 ?# b% S. ~
- /* USER CODE BEGIN USART1_Init 0 */3 |2 J# c5 \% Z: A6 c
, M' V4 ~/ i8 m- /* USER CODE END USART1_Init 0 */
% K' R( A6 [, R4 p2 G+ O
% \$ k4 U' q- D' q- /* USER CODE BEGIN USART1_Init 1 */
* E" T3 n% U. P* B - . G" Y( O& c) b* E' J; {# A1 H
- /* USER CODE END USART1_Init 1 */
" v/ u4 a" U! }. j/ X" l7 h1 G - huart1.Instance = USART1;6 ^$ U6 S6 q# D$ z) s4 }
- huart1.Init.BaudRate = 115200;3 K ^# n/ a0 N" W
- huart1.Init.WordLength = UART_WORDLENGTH_8B;
& p$ D1 e% ~6 Z/ o$ q - huart1.Init.StopBits = UART_STOPBITS_1;; u3 \) T# g0 X( ?1 S* S
- huart1.Init.Parity = UART_PARITY_NONE;
4 o3 F: b$ E7 {2 w* X1 r - huart1.Init.Mode = UART_MODE_TX_RX;
" D1 ?5 S- P- `. F - huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
/ S) }* d6 O# b8 d - huart1.Init.OverSampling = UART_OVERSAMPLING_16;
4 k& _! A$ H1 n9 u - huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;% e, c5 X+ X( k4 F% M8 ~
- huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;2 _4 y2 R6 K: G& N
- huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
* i( J* }( g8 {- G" A - if (HAL_UART_Init(&huart1) != HAL_OK): l2 N, i5 D- L, l" z/ F1 z
- {
@. V% w8 y" V; i0 p - Error_Handler();- C6 Y6 h) v: d9 t( e: P6 Z
- }
3 K2 q `% i! T, o+ l! U$ h. { - if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
2 [! Q2 t6 Y3 Y+ |( T# v0 z% | - {1 ]5 D" _: y% ]$ t; m/ W' R8 P# n
- Error_Handler();3 p5 d+ c. {9 u/ M. D. l5 [' b6 A1 X
- }
/ q/ u U/ ]0 H% i - if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
% H9 Q4 e" [3 P5 L+ v - {% z; W8 p9 ^; Y: s, G0 |
- Error_Handler();
7 t g* d9 k" y- v c - }7 i; p# F, c+ ~/ g+ F* z
- if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
! T3 T/ b9 `1 R I - {
1 D! V: C a0 H ?6 O - Error_Handler();
* b* G" D/ W) k& I! W: K2 D" R" g - }
+ s n3 H" z7 e2 Z - /* USER CODE BEGIN USART1_Init 2 */
1 B# i1 B8 w' G4 t0 ~# X+ x - 8 r2 M: G5 w( S5 W+ B3 U ]
- /* USER CODE END USART1_Init 2 */
/ U4 i; ?* E: e* \5 b' h. `
s3 a2 W# a3 ^ j! Z' V0 F, O- }
复制代码
+ Z0 a2 D" J6 T$ \: J
2 o/ t' i8 G4 g) V Q8 M& G
! V2 `7 n$ i- O- d8 O
$ ~/ l7 M% J4 m; a& l! N然后试过了,如果不分开文件的话初始化也是没有GPIO的初始化内容。; b" j/ E( Z& e: R. A
$ ]: s2 P. }% U4 Z3 N% a
+ Y* H8 K; Y0 {: y2 Z) A# k
+ ~# ?9 o% o& @1 g0 Q; B0 h& h* x
1 i8 x( F7 `7 M+ L! q$ \- h
/ B: _ V6 D; U! k+ R' O转载自: 电路小白" N" C8 k3 [2 x8 E4 c, ^
如有侵权请联系删除
6 f v- J, K, U2 l8 F: \8 Z2 C, X
: A/ @/ A1 \) p& p& k9 R
- E& M" n& @# Z, ^
$ v; x" D. i. C3 l( G4 Z( N% a& M2 Z, R |