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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 14:23
这两天在使用STM32WL55JC芯片,板子是ST提供的评估板,在官网的介绍中得知这是一块多核芯片,其中搭载着一块协核M0+,M4的主核和M0+的协核都可以单独的工作。
4 g/ M. f, Y- H& X, v. Y
3 Z& L# }( W, O- }$ i' ^
我们在使用CubeMX的过程中也可以发现,CubeMX中有开启多核的选项。
5 S: P3 }2 a) F5 H6 E" ~, x) p' y& I/ @4 c, _0 }& I
微信图片_20240525142304.png , @  I# e8 I% T( c$ M9 Z. @9 S

' ?/ \2 k0 N3 M在这其中我们可以配置各个核心的功能。
! s. b1 v4 ]% d+ @, F8 c+ g4 J5 y: n$ x. \0 b" M0 ]) a
微信图片_20240525142301.png * x- B$ P% f! H- J# M- P
) }$ H+ G5 P8 u7 L+ M4 e: s! w
我们正常的创建完任务之后,配置好各个功能就开始我们的踩坑之旅。7 h2 A$ t7 E* E7 O
6 T2 \  h/ S6 D& [( Z" Y0 p1 H
STlink连接和烧录问题(已解决)8 v  z5 r* E+ a

0 {/ I$ z9 ?( q" m) Q
微信图片_20240525142258.png
* V& g# Q8 W# N( ?1 W$ C* Y

0 v) X; m+ M: J( M. c. g9 S我们进入工程之后,由于我们开启了双核,因此两个工程是分开的,二维码默认打开的是M0的工程。而我们的STlink挂载的是在M4的核上,这就是为什么我如果开启单核工程的话STlink是可以正常使用的,并且使用STM32CubeProgrammer也是可以正常连接正常烧录的。, N" W0 q8 M) C3 v. b
; A( z3 ]8 |' d, a, [, k! Y
微信图片_20240525142255.png
# K0 @  l' T+ K: h8 x

) ^  B" ]+ d( P: E3 P但是偏偏开启了双核工程之后就无法使用,我开始还以为是芯片开启了低功耗模式中的休眠模式或者芯片自锁,试了好多方法都没办法解决。8 S6 o8 u. \# n( h) `
' ^. p% @: a4 b6 L2 {/ ~
微信图片_20240525142252.png
4 l" U5 Q9 n' }" F% i

# ?% \$ W% ~* r. s/ `  |0 r. ~1 W反正这个问题困扰了我一晚上。查询了许多手册和资料也没有解决这个问题。直到看见了官网上的一句:STlink挂载在M4的主核上,因此突然想起来默认的工程是M0+(之前也没试过这种多核的工程)
; g, E) ]4 B# A3 O7 \2 v" k# r1 Z' U+ r0 L3 f7 I
微信图片_20240525142249.png # l' z* L& K7 [6 k9 o& u4 J1 K% I# K
0 {7 ~: o1 S' F1 R6 `2 [+ b+ B
因此将M4工程设为主工程,之后发现就可以正常的检测到 Stlink了。2 a0 g! j) d4 x

. E, A" D' i1 V# [5 | 微信图片_20240525142245.png 1 o, F' T3 G( @' j$ N" n- O2 T' Z
( u" ^3 L& S+ Z  J; A3 ]( C3 l- R0 ~
这里注意的是,我们还需要更新一下我们的STlink固件。
( g: z" v# z$ S- e* e' m. z8 P' v/ E8 Y) p* j! |* Y6 b
连接上我们的Stlink之后,我们就可以正常的烧录了,然后M0+的核也就连的上了,不知道是不是因为之前板载代码的问题,总而言之这里是解决了烧录问题。
/ k' w6 D9 y  f6 o  q" B$ R) c; |" j7 M% d, P/ X- z8 e- t
不过后面还有更奇怪的问题。8 V3 S! S$ n  B( P) Z# {
3 L# f9 k; ^# |! e0 t
我在While里面加了GPIO翻转的代码。- w: D) T) X* H6 v4 j+ S
  1.   while (1)
    , E8 [+ J  \7 j7 z- Z, q& W
  2.   {5 y& t) M4 n! y& V" k1 g
  3.     /* USER CODE END WHILE */
    $ W+ Q) J: v* I2 W! c; Z
  4. 1 @  I6 H! w3 h# |: P
  5. 4 U$ U! V  Z; m3 m1 d, Z6 a$ n
  6.     /* USER CODE BEGIN 3 */
    ) J6 d- d7 {1 v7 ~6 m! a
  7.     HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);0 L) X3 D+ q$ x/ P; x" q6 k
  8.     HAL_Delay(500);
    ' T. n  o) ^6 u2 r, O& k
  9.   }
复制代码
7 E) [7 I' O0 H5 [9 l  A2 C
首先需要说明的是,这个IO确定是LED的IO,而且我也配置了GPIO的配置。: G# L- i8 \9 m$ ~7 ?3 a9 W* Q0 ^( K
9 z' u9 K7 ~7 b/ c* R, q) l
微信图片_20240525142242.png 2 e' {! [5 [3 U( W/ r+ Y2 q

0 K0 U' K# @7 C8 L但是LED不亮,不清楚是什么的原因,但是程序中是有关于CubeMX的GPIO初始化函数,然后我以为是程序卡住了,调用Debug之后发现程序是可以正常运行的。但是LED还是没有反应。
$ I( U2 g; k! G8 ]7 k. F* [2 Z
5 ^  {+ k/ ?0 L% a3 H6 P
于是这时候突然怀疑是GPIO初始化的问题。9 }9 H9 A# @' [: Y5 W
, Q3 y. M5 \# x+ b
CubeMX的GPIO初始化问题(未解决)
  1. void MX_GPIO_Init(void)
    . t- h* s  n( }- H+ v
  2. {: E$ U$ e: R% E5 a

  3. ' o0 `* F4 g1 }  D+ ^6 Y+ I
  4.   /* GPIO Ports Clock Enable */
    ) ?1 e, A6 n8 W0 A
  5.   __HAL_RCC_GPIOC_CLK_ENABLE();
    2 O  W6 G' i! T' L; ~( D
  6.   __HAL_RCC_GPIOB_CLK_ENABLE();1 P! J( S9 h$ L6 t0 v  P, ]
  7. $ [9 {5 F$ z& v9 h5 M) E
  8. }
复制代码
) ^+ Z5 T7 ?+ I( [2 \& V" H, e

2 c* ]" a% o7 f9 K4 P这时候发现GPIO的初始化函数居然是空的,这也是我第一次遇到CubeMX生成的函数初始化失败的过程。
8 G6 R' S+ v1 O3 O) o! |$ e* q5 c! F$ v3 {
于是自己补全了GPIO初始化的过程。; C8 E7 |$ Z% f) D
  1. void MX_GPIO_Init(void)3 M6 h( n! G1 Z
  2. {
    ) O# b) d" Y& h8 V8 X% F- E% K

  3. 5 E* Y0 k; {" ?" o3 J
  4.   GPIO_InitTypeDef GPIO_InitStruct;
    1 n1 K7 p' M6 f! t5 y2 F: d' x
  5.   HAL_RCC_GPIOC_CLK_ENABLE();4 ~: H0 S/ S6 J; o1 t. N
  6.   HAL_RCC_GPIOB_CLK_ENABLE();5 \: K( U8 B4 t2 M
  7.   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9|GPIO_PIN_11, GPIO_PIN_RESET);3 K, f, z. w9 P9 o( \( L
  8.   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;
    8 X9 E, U) h# j7 G- a
  9.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;3 a# Q, A) N8 d" Q0 H
  10.   GPIO_InitStruct.Pull = GPIO_NOPULL;  Z+ Y  a0 [: v& Q7 U
  11.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;) ?2 W, T9 T, w- O5 r& V' C
  12.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    . W5 j4 p) \) B% s, \
  13. + y& q8 C: k/ \0 ~6 y  l* k
  14. }
复制代码

0 ^/ {, s' o  j4 e! v  |这时候LED就可以正常使用了,这时候给第二个核配置LED也可以正常使用了。- @# L" w, ^% ?/ |6 l/ a
% g; Z+ J: A1 E4 d; m
后面开启USART的时候,发现其配置了USART,但是GPIO的内容依旧是空的。
+ A  G& `( R' [* x/ _: g- Z: t; O
  1. void MX_USART1_UART_Init(void)1 D* v# _2 f; I1 o0 Y; Q
  2. {" W3 S! v4 |4 Q

  3. ' d$ b( t1 x6 z+ G
  4.   /* USER CODE BEGIN USART1_Init 0 */
    ! J! q5 ^2 j% S! J" [
  5. + `! c2 K% r( x( E" g( K! _
  6.   /* USER CODE END USART1_Init 0 */& O. c2 D2 B+ |. a" w& z
  7. + w0 g0 [! \' G" W; B5 [$ X9 T
  8.   /* USER CODE BEGIN USART1_Init 1 */
    / @( K9 t0 K& l5 }3 b, Z* F7 X
  9. 7 m3 R( P2 I, F8 \' u, u- B% |
  10.   /* USER CODE END USART1_Init 1 */
    3 f" b- f6 T7 F; Z3 \  ?$ @
  11.   huart1.Instance = USART1;( J4 @. b0 B0 U8 x3 U; K6 n0 @
  12.   huart1.Init.BaudRate = 115200;9 g8 c6 \" U/ }# P5 c8 G
  13.   huart1.Init.WordLength = UART_WORDLENGTH_8B;1 D5 q# q! X! ]9 m7 w
  14.   huart1.Init.StopBits = UART_STOPBITS_1;
    6 T  _3 F8 b$ U) w- u3 u1 H* i
  15.   huart1.Init.Parity = UART_PARITY_NONE;+ c' j  S& k+ S! [; w) {$ W
  16.   huart1.Init.Mode = UART_MODE_TX_RX;
    3 f' q  H9 S9 E
  17.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    % ~' z3 Y# B( x3 F( C3 y0 V
  18.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    ' E5 |0 c# M+ M2 R
  19.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;6 I2 K5 G* x4 U; `# d
  20.   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;: Q! C" Z5 H2 G9 F7 K: a. j0 Z# }
  21.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    , w6 Y5 B5 ^! \  [
  22.   if (HAL_UART_Init(&huart1) != HAL_OK)+ [) c5 A+ Z3 L
  23.   {
    3 X; O* I  i# T4 z' U" C4 l
  24.     Error_Handler();
    ! X5 v1 u# t1 A7 p1 R. E
  25.   }
    6 ^9 g6 T! S4 B1 z; t3 `5 Z
  26.   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
    $ u" b  E  U) S: M
  27.   {3 [; ], r8 T, ?4 ^# K- E$ ]
  28.     Error_Handler();* j) p4 h% n% ?
  29.   }
    . J# r' ?, u& W/ t. }) a( s2 {& O# l
  30.   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
    / O- [, _$ M( I: \  q/ b% A4 R
  31.   {4 L! k& `* ?( C! D# V7 ?- ~
  32.     Error_Handler();
    % a" X, F- T6 V- n( _, ]( F) v
  33.   }
    0 W: }/ M: s3 p  @1 Q# T" k
  34.   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
    % n2 c. F/ s# ]3 i/ n3 W
  35.   {6 C9 F- m  W- H
  36.     Error_Handler();% y  I9 s- V+ n% y
  37.   }
    3 o. h! k5 a* j. d6 L
  38.   /* USER CODE BEGIN USART1_Init 2 */% T5 `5 e) {, H( k0 \

  39. $ u: ^. O$ Y% n/ H
  40.   /* USER CODE END USART1_Init 2 */
    . |0 w7 n. a: V) q
  41. / Z: k8 q) [9 A% ^: M) O) ^
  42. }
复制代码

3 k# J* {6 R, _. U: s" [/ N 微信图片_20240525142238.png 4 ?0 D* ^6 f$ l
: s: [, D: ?/ ?! v5 n8 J7 Y

3 O6 W2 d& k* B% D% v( W5 Z7 V; t然后试过了,如果不分开文件的话初始化也是没有GPIO的初始化内容。
6 o: `; b6 a0 e- P/ G* s
3 u7 U  K: _( I2 L! v: W 微信图片_20240525142235.png
3 o, G& h5 ~1 g$ t: |# N. D- s3 h4 t3 @, P0 h
微信图片_20240525142232.png
5 j: J) W- ^9 M/ {6 d* J6 @% Q

% @5 e3 ]$ O! U, ]: o; L2 X转载自: 电路小白/ N. Z( z; ~  b5 z( o3 R
如有侵权请联系删除
$ m, e  J% o$ z& X" T
9 v, G1 {; E! d, d6 x) p; n! S; k& M+ C

8 q/ V- x+ v4 d5 a+ |
收藏 评论0 发布时间:2024-5-25 14:23

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版