你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32WL55双核烧录过程的问题及解决办法

[复制链接]
攻城狮Melo 发布时间:2024-5-25 14:23
这两天在使用STM32WL55JC芯片,板子是ST提供的评估板,在官网的介绍中得知这是一块多核芯片,其中搭载着一块协核M0+,M4的主核和M0+的协核都可以单独的工作。
) a! v/ _; j5 b) x& ~. `% v
+ Y* N; o" L& h
我们在使用CubeMX的过程中也可以发现,CubeMX中有开启多核的选项。. E) [, E$ G8 j: ?3 M
* i, j4 I2 S- r1 B" Q
微信图片_20240525142304.png
$ k+ ^! \: V+ Y$ K3 {
% a8 ?' u+ S8 T: F% B. A9 B
在这其中我们可以配置各个核心的功能。2 [! ]" c) O. o* |/ a! m7 o& p

4 O' i: r) t3 Z$ R5 W 微信图片_20240525142301.png 9 f: e, f: v( Z1 u- c3 F2 l

5 C7 S0 G3 a7 _4 R  M! P' i我们正常的创建完任务之后,配置好各个功能就开始我们的踩坑之旅。/ T7 _/ R5 `9 v8 S* |4 e$ t
: a& m. ?  v2 y3 |) {5 \! z
STlink连接和烧录问题(已解决)! Z; _" R5 p7 Z6 M5 o* ~9 K
. ^7 T, s# K1 \- f7 j
微信图片_20240525142258.png 2 o$ `: I8 t5 A5 z3 ^9 f) |
  L; P/ _4 k3 w* Z4 ?3 ^
我们进入工程之后,由于我们开启了双核,因此两个工程是分开的,二维码默认打开的是M0的工程。而我们的STlink挂载的是在M4的核上,这就是为什么我如果开启单核工程的话STlink是可以正常使用的,并且使用STM32CubeProgrammer也是可以正常连接正常烧录的。7 H/ L4 J$ W0 h% S* f; t
% \2 `' q' j3 j" C; n
微信图片_20240525142255.png
. Q$ Q' S$ e+ F8 `$ B  I; M

, @  L8 R( f4 o% M$ y% A  n1 j但是偏偏开启了双核工程之后就无法使用,我开始还以为是芯片开启了低功耗模式中的休眠模式或者芯片自锁,试了好多方法都没办法解决。) \( I7 d8 o( N

* r1 f  f& R$ S0 n' A6 } 微信图片_20240525142252.png . F# M* c2 u% s+ U+ ?$ m, p
% h5 g$ K: I% R7 K
反正这个问题困扰了我一晚上。查询了许多手册和资料也没有解决这个问题。直到看见了官网上的一句:STlink挂载在M4的主核上,因此突然想起来默认的工程是M0+(之前也没试过这种多核的工程)
% n& E% _5 J% p# s; |2 S3 w+ u: u4 }0 r' H' t# g9 k5 z
微信图片_20240525142249.png
( ^; ]4 e, i5 j0 j/ S1 W) Q
2 P( E. _# |: {$ K% h' f0 i5 t
因此将M4工程设为主工程,之后发现就可以正常的检测到 Stlink了。
3 g. Q6 Y. {1 z7 E- k* F2 e6 e" u
微信图片_20240525142245.png
- p# a- \  b& S$ n9 B) v4 w

' t. O. ~2 k# ^8 H/ r+ ~4 ?这里注意的是,我们还需要更新一下我们的STlink固件。) n) S1 q# r6 i5 `* B6 {3 h; @0 C
. i7 Z  a4 S5 G
连接上我们的Stlink之后,我们就可以正常的烧录了,然后M0+的核也就连的上了,不知道是不是因为之前板载代码的问题,总而言之这里是解决了烧录问题。
  r6 T( j. i& S- J/ w% G( d& s# M" O% P. n  t" }  m# X2 f
不过后面还有更奇怪的问题。3 q- `; f# g- M- z: ?$ R& j/ v& D

2 n3 m6 m4 h- Z7 d, }7 T) C! g4 }  v5 y
我在While里面加了GPIO翻转的代码。4 P1 s$ W2 x& U2 w/ m. R( i( K  X( C
  1.   while (1)
    * V- B* Y( L6 W$ y8 ~3 G
  2.   {
    6 `) h2 }; a8 }1 p. `+ i" K( K$ o
  3.     /* USER CODE END WHILE */, e$ }0 i; C. ]; t

  4. & h2 |) W/ b% d" X. b: B$ a
  5. 1 ^2 k% z9 [& W- B  l. I* G
  6.     /* USER CODE BEGIN 3 */# j. G& Z& G/ e# P% G$ l
  7.     HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);! `5 w9 r+ s  i' s2 X$ V6 E6 }+ R
  8.     HAL_Delay(500);
    $ s: N; S  Z2 \( w' R- v& ~
  9.   }
复制代码
+ ?' K0 q2 U2 r* J( W8 g& t! ?
首先需要说明的是,这个IO确定是LED的IO,而且我也配置了GPIO的配置。
: ]9 n* V- d  o% o/ t
0 Z- M" M. o$ N/ [# N1 G4 S2 | 微信图片_20240525142242.png
. W9 Q+ W4 a, t4 t" w
6 r% w0 M' q) L& W
但是LED不亮,不清楚是什么的原因,但是程序中是有关于CubeMX的GPIO初始化函数,然后我以为是程序卡住了,调用Debug之后发现程序是可以正常运行的。但是LED还是没有反应。1 O5 `8 o0 |% ?
# t3 G% o) O) ^5 L
于是这时候突然怀疑是GPIO初始化的问题。) d# G' ^5 u$ t' H" u: D

3 i% J* j: s# d; O1 y! p
CubeMX的GPIO初始化问题(未解决)
  1. void MX_GPIO_Init(void)
    & O9 D8 v7 ^  }5 C
  2. {, j( c3 D* S& \& O, x; D& C
  3. 7 B, ^% T: q. O. J
  4.   /* GPIO Ports Clock Enable */- y6 C, t0 |* z" j
  5.   __HAL_RCC_GPIOC_CLK_ENABLE();
    . l" H) s! Q! B- ~) N2 v
  6.   __HAL_RCC_GPIOB_CLK_ENABLE();% n: |. ~: k* x" U  `" B

  7. . C+ J' ^% D7 l5 m3 k/ S
  8. }
复制代码

  O  b# Z, s% S4 Z& D
0 @" k2 x$ u( N8 e! ?3 Y这时候发现GPIO的初始化函数居然是空的,这也是我第一次遇到CubeMX生成的函数初始化失败的过程。& }: A( B/ w) S- R

# L4 R  C0 r& S
于是自己补全了GPIO初始化的过程。2 ]; F) J# m. L- A
  1. void MX_GPIO_Init(void)
    / }4 F: D7 |& g) ?
  2. {5 C! o5 e. q& p8 E( D9 G- x4 I4 V; B
  3. + r8 ?' T: f4 }- v) x
  4.   GPIO_InitTypeDef GPIO_InitStruct;
    . |$ w# X1 X# ~* {
  5.   HAL_RCC_GPIOC_CLK_ENABLE();  R( ?# L: m* [! J! k" c2 G# n
  6.   HAL_RCC_GPIOB_CLK_ENABLE();
    $ M( D9 h1 g. V, K# N& [
  7.   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9|GPIO_PIN_11, GPIO_PIN_RESET);
    * d' r# X0 n" U. l" I9 N0 A
  8.   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;
    3 A8 V8 |0 q2 M
  9.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;" x, d1 b: T& [4 e
  10.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    ( U" Q# T( t5 [' a9 k* @
  11.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    ( S, `. x5 G& ]0 c4 E" _9 J( G
  12.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    ' U' `1 ?5 [; i. t

  13. 7 f4 S" w% b# p2 j; c. O! o( v
  14. }
复制代码
7 {) [- W; I0 W6 B* n; ]0 b5 O/ |& K* G
这时候LED就可以正常使用了,这时候给第二个核配置LED也可以正常使用了。. {5 c" Y2 e# {: N- \
8 r7 C1 T2 r7 D3 D+ h6 b+ ~0 H; r
后面开启USART的时候,发现其配置了USART,但是GPIO的内容依旧是空的。  a9 T6 l) I$ C7 p
  1. void MX_USART1_UART_Init(void)4 y; B: i+ h( ~# d  ]
  2. {, O" ^7 Z/ e* O# P

  3. , O( |/ S9 F7 K$ `; U" l! _
  4.   /* USER CODE BEGIN USART1_Init 0 */
    : h% y  x7 Y4 R/ n( }9 r4 Q
  5. 7 [5 L: ?' I9 S$ e/ Y" J/ \3 b
  6.   /* USER CODE END USART1_Init 0 */
    3 I$ i) I$ J4 t( i" b7 T6 T" E
  7. 8 E0 _0 n3 J: v& I! W) o
  8.   /* USER CODE BEGIN USART1_Init 1 */
      A6 \: |/ B+ N
  9. ( k  U: O8 |5 C* g7 i
  10.   /* USER CODE END USART1_Init 1 */9 q+ T' [7 \1 s" z, n1 \7 l* c
  11.   huart1.Instance = USART1;
    ( T/ p* s$ C- j+ K5 _- Y! j3 D
  12.   huart1.Init.BaudRate = 115200;
    5 m: \; _6 S0 v0 i. ]$ }
  13.   huart1.Init.WordLength = UART_WORDLENGTH_8B;. X0 r+ C: e9 T. r4 v8 f7 J8 M* U- L" a
  14.   huart1.Init.StopBits = UART_STOPBITS_1;6 D' S, w% B+ F* F8 }& r
  15.   huart1.Init.Parity = UART_PARITY_NONE;
    + ~% D1 ]7 T0 h# }& \: ^; ~
  16.   huart1.Init.Mode = UART_MODE_TX_RX;
    ' k+ t! @* L$ w8 t0 x# X
  17.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    1 v: q% ]0 R% z
  18.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;: |' M" [1 l! J$ M6 |
  19.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;2 r% C, d/ ^" o5 D- {
  20.   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;  j( b6 q! s  k; f3 w
  21.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;$ d9 I. ?, g% w% v" s5 P
  22.   if (HAL_UART_Init(&huart1) != HAL_OK)
    ; l7 y! o$ U2 q
  23.   {
    6 n9 ~6 I" Y2 [. P, M8 {9 S3 D
  24.     Error_Handler();/ ~; P; Q& M2 w
  25.   }
    ) Z2 a' ~' P6 v; G' }4 n& U: @0 \
  26.   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)6 R1 ?; @# `$ `- b+ L
  27.   {
    6 k- _2 |0 G( }
  28.     Error_Handler();
    + }, Y6 V0 U" y% O
  29.   }
    2 w% Q" d, k4 ^7 E, n2 l4 p1 I
  30.   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
    " Q/ G! t3 s4 y0 |( W: L
  31.   {" c; `& I# I+ K4 h4 l' V
  32.     Error_Handler();& I6 o% @; h( T8 z
  33.   }
    6 N  Y- e6 v3 w& `/ O
  34.   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
    . ]/ h4 }! B5 T. @5 E' _8 C
  35.   {
      s; e" |' l; |
  36.     Error_Handler();  L9 P9 S7 x- U$ t3 O8 h
  37.   }& u5 G$ r( a2 }& f) o
  38.   /* USER CODE BEGIN USART1_Init 2 */
    : }! f1 ^. f; V3 c" X
  39. 3 k+ Q* f) Q3 \9 D! Z" {9 @
  40.   /* USER CODE END USART1_Init 2 */
    2 D2 F1 e  H. x; L, t" g3 t1 x+ x3 H
  41. ( c! |5 c" v; g+ m$ r5 A
  42. }
复制代码

; }9 ~$ V% Q9 P" F" u7 ] 微信图片_20240525142238.png
# X( H2 b0 o8 v! D9 E% s# d1 ~* N& f; Q, V; l
0 l( i/ W# [) F* M! |) M* B5 {4 j
然后试过了,如果不分开文件的话初始化也是没有GPIO的初始化内容。
2 ?, ?" j2 \# i$ q5 X2 }3 i. H
: R  `" e( q' ~1 @& f 微信图片_20240525142235.png
) k9 V9 q7 ~4 m/ s5 F, h, _6 ^- q% `& w6 R! i9 Q. P6 `" M& c
微信图片_20240525142232.png
6 J% E/ c) y/ l9 m5 T9 d# _

3 k, V% S! F1 x) ^+ f) i转载自: 电路小白4 @$ ~. n/ V* V8 f
如有侵权请联系删除
: ~7 r- ^: j& E+ n- t, b" B8 O# T- s* v6 _" J: n4 m
$ |! p6 R8 n4 o9 c' w% y

# t' p- S: K8 ]" q9 C+ T
赞 收藏 评论0 发布时间:2024-5-25 14:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版