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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 14:23
这两天在使用STM32WL55JC芯片,板子是ST提供的评估板,在官网的介绍中得知这是一块多核芯片,其中搭载着一块协核M0+,M4的主核和M0+的协核都可以单独的工作。
) _1 ?9 `# _! c" O' s' _/ W4 v( ~3 i6 a8 ?3 e& S
我们在使用CubeMX的过程中也可以发现,CubeMX中有开启多核的选项。- G6 r4 U! F$ M- Y* }

. t( u% f* J2 u1 k( ?6 j/ b" H; H 微信图片_20240525142304.png ' N+ Y- K# j; q5 D
* J1 R0 d  o, ]
在这其中我们可以配置各个核心的功能。& E7 t- b- E" y5 `/ z

) D: O; U5 b  g/ r8 w; x 微信图片_20240525142301.png
. m" D* x' U' f  F
& A: Z' X0 [9 B: O! T
我们正常的创建完任务之后,配置好各个功能就开始我们的踩坑之旅。- K: t  W/ U6 f% f- ~" t6 ~, @* u

) g5 J7 n  [! `8 N
STlink连接和烧录问题(已解决)
6 ^% w5 n( E& t" n( S) E( k$ F" G# A: u% Q0 ?. w0 b, q. m) I
微信图片_20240525142258.png
3 X  y/ E# }' Q+ P  e: T9 g; p% z
6 G) ~3 G3 Q9 B
我们进入工程之后,由于我们开启了双核,因此两个工程是分开的,二维码默认打开的是M0的工程。而我们的STlink挂载的是在M4的核上,这就是为什么我如果开启单核工程的话STlink是可以正常使用的,并且使用STM32CubeProgrammer也是可以正常连接正常烧录的。' U0 p) ~  f. P. ?' b6 j
( c' H! t- w6 D( m+ T# N
微信图片_20240525142255.png . j; K2 \# W' n" A- ], X" R- J

8 r5 L% R& _  V$ s8 Z! q5 n0 ~但是偏偏开启了双核工程之后就无法使用,我开始还以为是芯片开启了低功耗模式中的休眠模式或者芯片自锁,试了好多方法都没办法解决。
" }4 |, E2 ]9 Z. P  C) U
4 I1 M% i& z8 i 微信图片_20240525142252.png % X) j  P# [2 i, H$ S4 o! R) X
: W' p- b$ {2 A: w2 [
反正这个问题困扰了我一晚上。查询了许多手册和资料也没有解决这个问题。直到看见了官网上的一句:STlink挂载在M4的主核上,因此突然想起来默认的工程是M0+(之前也没试过这种多核的工程)
' r. T$ |# R( ~, \5 A# C' U8 @. H5 c5 D6 M  L3 j, C
微信图片_20240525142249.png
9 Q' K/ r7 w* |. r0 F  G

! L  ^8 \( G2 [: l+ @! E因此将M4工程设为主工程,之后发现就可以正常的检测到 Stlink了。
/ H; |/ X" N1 b8 P: I5 V' Z
8 \7 z8 {9 P0 l5 A' C& e 微信图片_20240525142245.png 1 o4 J' L+ Y; ?8 R- z3 q
: V" z! @6 t# `- J6 H
这里注意的是,我们还需要更新一下我们的STlink固件。; f+ {( y7 G. s, L* @, j. M' g3 e
# M4 t* O8 w# O
连接上我们的Stlink之后,我们就可以正常的烧录了,然后M0+的核也就连的上了,不知道是不是因为之前板载代码的问题,总而言之这里是解决了烧录问题。
  L; ]$ t+ |3 M. k5 p8 n' y2 N
) h  C6 Q" V# q" H
不过后面还有更奇怪的问题。  t3 K7 y7 Z/ H* B, V: x  k, H( e

( k1 m  v) c1 n9 `- M; G" D# u
我在While里面加了GPIO翻转的代码。
! {1 o" ~& y' w9 _8 J7 ?4 R6 p
  1.   while (1)
    5 g" V6 \" ]  v
  2.   {
    & a6 V6 v- D, e8 J" e
  3.     /* USER CODE END WHILE */4 \9 a4 y6 m, S7 {8 N
  4. ' T7 i6 P. j+ [7 C* u

  5. - y& N; `- W2 F/ L" I) U
  6.     /* USER CODE BEGIN 3 */5 }: c/ a6 D5 d3 D% K* ~. Y
  7.     HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);
    / |# e  h$ x4 Z
  8.     HAL_Delay(500);$ U7 J& `9 }( `+ }3 d$ A
  9.   }
复制代码
8 p) {. r1 A' E4 O0 X
首先需要说明的是,这个IO确定是LED的IO,而且我也配置了GPIO的配置。6 X' C9 ?6 z0 Z# u# d. Z% B
: J# _# t7 O# H
微信图片_20240525142242.png
& {1 B6 ^4 i2 K! a. B9 Y7 L) t

( a3 m: E( c& Z8 ]/ V( J, I; `5 O5 S但是LED不亮,不清楚是什么的原因,但是程序中是有关于CubeMX的GPIO初始化函数,然后我以为是程序卡住了,调用Debug之后发现程序是可以正常运行的。但是LED还是没有反应。
% y* f( O/ }; R1 q1 M) a% ?
0 X: r2 ]7 z% A5 m- ~1 R
于是这时候突然怀疑是GPIO初始化的问题。
6 s& Y. R% n5 ?, N' ?/ W7 d; K( o
. @$ p8 P- h* i3 [7 E- B
CubeMX的GPIO初始化问题(未解决)
  1. void MX_GPIO_Init(void)' J" g' `. o3 D1 r' }; L+ B
  2. {
    # D3 ]+ o1 w! @' o, p

  3. ( ?  G% Y5 U9 P9 u
  4.   /* GPIO Ports Clock Enable */% Y; E5 W  |" k% x) }$ E" `
  5.   __HAL_RCC_GPIOC_CLK_ENABLE();
    4 [  q6 ]* [: B0 f% M4 L+ Z
  6.   __HAL_RCC_GPIOB_CLK_ENABLE();4 [! N4 D' t9 z- s8 g0 K1 \
  7. 6 l3 F$ {. N+ y; ^% R' b+ l4 Y
  8. }
复制代码
8 k* ]* W' I3 \, p0 w

3 u* x2 W: S2 v4 ^这时候发现GPIO的初始化函数居然是空的,这也是我第一次遇到CubeMX生成的函数初始化失败的过程。
- I6 \( O- Y( o' u/ J1 `# `3 F- l* m$ j
于是自己补全了GPIO初始化的过程。$ ^* q: \" |# L, Q) ]  M( v
  1. void MX_GPIO_Init(void)
    8 }, s% g( m. J2 T  X0 J
  2. {9 r. }8 T: i+ H. }1 [! Y* \

  3. ( h! K( {! z0 g7 S% \0 R7 c
  4.   GPIO_InitTypeDef GPIO_InitStruct;! O( a+ L1 r; u# K! r' e
  5.   HAL_RCC_GPIOC_CLK_ENABLE();
    & @. F1 p. O- [5 m" q
  6.   HAL_RCC_GPIOB_CLK_ENABLE();6 F) J" m2 G) E& t
  7.   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9|GPIO_PIN_11, GPIO_PIN_RESET);
    & ?, y0 p" ~) Q3 h8 X3 r
  8.   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;" |* Q5 Y9 y" ~( R6 J! m
  9.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    5 a- ?- e' o; v) E6 p4 e- t5 G# d
  10.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    - I" w# J% _% A$ w: X
  11.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    & ~5 @  G" Z! l; z& ^) D- C" v$ D
  12.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);  c3 ~) ]9 T. i6 ~
  13. $ s- |3 a5 }& P/ X: y; }, y
  14. }
复制代码
5 R; K% s( @  p4 \
这时候LED就可以正常使用了,这时候给第二个核配置LED也可以正常使用了。
, K1 A0 V6 W. U2 L! D6 Z& {' Z# j0 k5 h8 o
后面开启USART的时候,发现其配置了USART,但是GPIO的内容依旧是空的。* {- {' \1 u0 {# U4 p
  1. void MX_USART1_UART_Init(void)% K8 Q) T9 O4 k- W; Q9 M/ {
  2. {
    ( h# k5 ~* Z3 X5 F* J+ `! J0 `) u

  3. 6 k; B( ^7 e! X6 j
  4.   /* USER CODE BEGIN USART1_Init 0 */) b1 m( G7 M( r8 f" V# W8 z
  5. 8 G% Z$ Y& F* i2 ]
  6.   /* USER CODE END USART1_Init 0 */
    / F# W  z6 w/ S4 G2 Y
  7. 2 R/ Q; \% e4 s7 l; I* y7 w& J
  8.   /* USER CODE BEGIN USART1_Init 1 */
    7 M) K' p3 j  i( s0 v' @3 T( E
  9. 1 V& l' P9 O  z$ C6 w9 `  I5 h5 j
  10.   /* USER CODE END USART1_Init 1 */& i+ Q! P5 x- `5 l5 ~3 g
  11.   huart1.Instance = USART1;
    ' U# M- ~) p; u. C' ]3 Z% N
  12.   huart1.Init.BaudRate = 115200;: M2 L7 N' {9 q' [
  13.   huart1.Init.WordLength = UART_WORDLENGTH_8B;( }8 i) ~; t% N
  14.   huart1.Init.StopBits = UART_STOPBITS_1;4 c* L9 n' o6 u  c8 B# l
  15.   huart1.Init.Parity = UART_PARITY_NONE;) t! {; B+ @1 e5 V5 P: |) |  }
  16.   huart1.Init.Mode = UART_MODE_TX_RX;
    1 B$ j! x, m! Y( M% J
  17.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;( \2 o4 n, u; i0 |+ q" D/ r5 {
  18.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;; A$ d& H( R% q# l3 g8 a3 o' a
  19.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;+ f' F5 G0 ~2 M9 b
  20.   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
    5 g% P. f+ a5 f( y. Q. x
  21.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    4 T2 z' u' N7 O( }) J9 I' b
  22.   if (HAL_UART_Init(&huart1) != HAL_OK)
    - x9 d. k3 R! o  k, w: f
  23.   {: l1 s) V6 \- p- r% \1 Y
  24.     Error_Handler();7 X. y1 f7 m5 P4 ~
  25.   }+ |1 r- I: j: j  H* [* `
  26.   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
    & s+ {9 i8 e+ ]3 l
  27.   {  L( T- F7 ]- @" g" @" J1 N
  28.     Error_Handler();6 U" L2 e$ W6 t0 S
  29.   }
    8 `/ p( ?, i4 ^3 p4 g
  30.   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK); C0 k3 Y6 L* z  ^2 Z: G, V, F# L
  31.   {9 X3 W- r- u5 x
  32.     Error_Handler();
    . ^- m( \1 k) J& E6 \( i% T
  33.   }
    " u' J. T% |/ a8 j8 Y
  34.   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)  J, y6 s/ c( t
  35.   {0 |5 X" P2 c  v- U+ M) V# H
  36.     Error_Handler();
    & \! X7 N! y& m! ^* u5 S
  37.   }5 ]+ A5 t1 c; z  r9 e  b$ D
  38.   /* USER CODE BEGIN USART1_Init 2 */3 O3 ~8 s; k2 e) U6 v

  39. 1 @! ]  |" l8 Q; L
  40.   /* USER CODE END USART1_Init 2 */! d( B# w1 l' `/ V5 k4 E! j
  41. 1 J7 K4 V" |% R9 `) q
  42. }
复制代码
! Z; L! X+ ], B2 M
微信图片_20240525142238.png
$ u) H# `) N9 j( p$ m9 }' F; U
2 p0 j" a, b1 n% e. P) l5 X7 j
然后试过了,如果不分开文件的话初始化也是没有GPIO的初始化内容。
4 @+ s  ~2 m% I, z# O8 t( \: D" e. O# D: @
微信图片_20240525142235.png 0 P. y# |% T' a) v
$ s8 `" Z& }; [
微信图片_20240525142232.png + ]8 T( v) q* \0 M8 D/ e( C

' o0 A  n* F& L" M4 K  q4 d转载自: 电路小白
, t% E+ D! O0 }3 d. G! p如有侵权请联系删除
* V& ?0 m2 a/ ^+ M" \, C% J4 o0 i* k. A' ]  H. l+ p

8 k; a1 f; m  r4 \( K+ U% A5 |1 ~7 L
收藏 评论0 发布时间:2024-5-25 14:23

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版