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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 14:23
这两天在使用STM32WL55JC芯片,板子是ST提供的评估板,在官网的介绍中得知这是一块多核芯片,其中搭载着一块协核M0+,M4的主核和M0+的协核都可以单独的工作。$ H1 x8 U2 E8 m( C
* s- X4 {) B1 r9 X; f" \7 k3 F
我们在使用CubeMX的过程中也可以发现,CubeMX中有开启多核的选项。
; @& M0 _4 b5 t' H  y$ R  N& K- Z7 u* r
微信图片_20240525142304.png
# t- b7 y1 H6 Q% v/ F, b4 y- Z

% U& h' E. E7 r: V8 J7 u在这其中我们可以配置各个核心的功能。
. [0 |& k( |  X9 F8 Q1 S& ^$ v' \9 a5 d! y# [
微信图片_20240525142301.png
" @& Z  ?1 F7 A3 x5 T( ?
& b# E1 U+ P" E1 e% ~  P
我们正常的创建完任务之后,配置好各个功能就开始我们的踩坑之旅。
7 z6 N9 I+ D  u1 H) C- h! F3 ^4 P3 [! y, R
STlink连接和烧录问题(已解决)4 i& b) S# V% y  @4 g0 \( t

# @. c0 ^! ]3 ~* O8 i
微信图片_20240525142258.png
" `8 Y: u' I  p, B/ M0 p
. i2 W  o1 ?6 D. Q% t7 {% U- S1 }
我们进入工程之后,由于我们开启了双核,因此两个工程是分开的,二维码默认打开的是M0的工程。而我们的STlink挂载的是在M4的核上,这就是为什么我如果开启单核工程的话STlink是可以正常使用的,并且使用STM32CubeProgrammer也是可以正常连接正常烧录的。
; H/ Q: c. I' o9 M
9 D5 c: p+ W8 C; `6 X  n 微信图片_20240525142255.png , ]* H/ r$ _: d% D; R( \
& W3 r9 q8 ^: `* S1 x9 C
但是偏偏开启了双核工程之后就无法使用,我开始还以为是芯片开启了低功耗模式中的休眠模式或者芯片自锁,试了好多方法都没办法解决。
3 ]& G6 Y3 R9 L: a% A
, D0 L. e2 s! M' F& k0 b 微信图片_20240525142252.png # W' q/ k4 i$ o' ^
6 Y: u9 ^+ R: r6 r6 L9 v" }! G' n
反正这个问题困扰了我一晚上。查询了许多手册和资料也没有解决这个问题。直到看见了官网上的一句:STlink挂载在M4的主核上,因此突然想起来默认的工程是M0+(之前也没试过这种多核的工程)) @, J+ V9 k' b6 M

, p  L( l$ q, f) q1 ] 微信图片_20240525142249.png
$ k0 \* L$ V, H: X6 @

$ A. J  T, B8 W( e因此将M4工程设为主工程,之后发现就可以正常的检测到 Stlink了。* d6 C% {4 M& m  {& V- X( V$ U8 P
1 S/ }8 }% q+ S: ?3 @4 r' Y" S- U
微信图片_20240525142245.png 1 D1 o) e4 E" W* z
+ D# r% E2 o( [: U3 F$ x( f
这里注意的是,我们还需要更新一下我们的STlink固件。. d# f* H. i( M. b3 v
2 f, S% b' a7 j9 S" f
连接上我们的Stlink之后,我们就可以正常的烧录了,然后M0+的核也就连的上了,不知道是不是因为之前板载代码的问题,总而言之这里是解决了烧录问题。
$ y- T2 ]6 |4 y% e
# q( y' n4 Y( s, \  J5 e
不过后面还有更奇怪的问题。3 A, `! M4 |1 `% d
8 Y7 l( }- }  ~9 Y2 c- K/ L. H
我在While里面加了GPIO翻转的代码。
$ t0 T: W6 T: ?: c' ~
  1.   while (1)# a( B& `( D* [
  2.   {6 h( D( P* h$ X/ F
  3.     /* USER CODE END WHILE */
    % d6 \( y7 f  s; ^' p% E
  4. . x: e5 Q! J* N" C! d. n6 Q4 H% i

  5. ' y$ c, i. x$ c4 M9 X1 F, P2 y
  6.     /* USER CODE BEGIN 3 */( ~) z- Z2 Y( t* D  Q9 Q
  7.     HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);
    % \9 Y- A% m4 N! i
  8.     HAL_Delay(500);2 T7 e5 [2 D( `! g; l% D
  9.   }
复制代码

+ N8 F1 W4 k+ u; [9 l首先需要说明的是,这个IO确定是LED的IO,而且我也配置了GPIO的配置。" X, l; x5 ~- Z) n6 ^: U

0 k) M) y& v  o* I. h 微信图片_20240525142242.png * D% i* S6 e. h$ x* c
% ^3 E: f7 s4 }/ K6 c* x: f! R" W
但是LED不亮,不清楚是什么的原因,但是程序中是有关于CubeMX的GPIO初始化函数,然后我以为是程序卡住了,调用Debug之后发现程序是可以正常运行的。但是LED还是没有反应。
8 B, K6 ^  T2 K) [" q1 b$ Z" ]" |: d) [' q* a; ^. K! L
于是这时候突然怀疑是GPIO初始化的问题。4 G" @$ p- m9 X  z
! u, Z+ z4 D  f6 O' B; H1 S& l
CubeMX的GPIO初始化问题(未解决)
  1. void MX_GPIO_Init(void)/ s7 v- M1 o4 u9 w7 Y
  2. {
    9 b- q3 y1 E  y4 J+ }: U
  3. % W6 n: U, ~: @! {7 n2 K* C7 ~
  4.   /* GPIO Ports Clock Enable */
    5 }( C# {  j6 Z* @/ {
  5.   __HAL_RCC_GPIOC_CLK_ENABLE();
    ( S9 l& \6 w: [  T+ r3 v6 @) }  B  N
  6.   __HAL_RCC_GPIOB_CLK_ENABLE();
    2 f7 k9 q" r4 j& z+ b

  7. 5 r$ ~$ d7 S0 G5 z  Q% ]! N
  8. }
复制代码
6 `# h$ P# p+ J$ P8 ]! o! G
& g5 r4 V+ N% B* E9 v
这时候发现GPIO的初始化函数居然是空的,这也是我第一次遇到CubeMX生成的函数初始化失败的过程。; u4 ^& b2 U8 O6 x2 q
& l. f- o: c2 A# ]) {9 l
于是自己补全了GPIO初始化的过程。
6 q* C% @2 R. b& t
  1. void MX_GPIO_Init(void)$ }- d  a+ z% K. q& c
  2. {
    8 n( c. C/ @7 e9 b5 W# E

  3. . c" k. D8 `) |: Y
  4.   GPIO_InitTypeDef GPIO_InitStruct;; V& ]# S( }: p: ]3 \& Y
  5.   HAL_RCC_GPIOC_CLK_ENABLE();
    ! O0 N. \1 J: N3 q9 h; Y! k1 Z
  6.   HAL_RCC_GPIOB_CLK_ENABLE();
    # Y' L% z- G: ?
  7.   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9|GPIO_PIN_11, GPIO_PIN_RESET);
    $ X2 C8 a2 F; _. \. d8 t" G- W; q4 L( ]
  8.   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;
    / P- z( h* Z+ @) o/ p
  9.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;. |. B$ g  h; h- n3 X, }. o
  10.   GPIO_InitStruct.Pull = GPIO_NOPULL;+ R: w) u! j0 Q; L( B0 _# T2 {' ]$ J
  11.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    + ~8 _( i3 T; o% |' m# A
  12.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);" E5 D! M! s0 p3 Z, N( L, k

  13. $ Y- z% I* z  s$ y8 U) r$ \
  14. }
复制代码
* r4 ~' }. U9 B) y" V8 W! j6 X
这时候LED就可以正常使用了,这时候给第二个核配置LED也可以正常使用了。2 j; A! y) d0 u0 [/ S
; m" k. d1 V8 {9 j, F9 w
后面开启USART的时候,发现其配置了USART,但是GPIO的内容依旧是空的。9 r; U5 y3 b: t$ N2 [
  1. void MX_USART1_UART_Init(void)
    ! b$ a1 n4 U: C8 }' t
  2. {: N( B0 }" H8 p8 D/ S* F4 T
  3. & I+ \' o/ l- k9 G0 E
  4.   /* USER CODE BEGIN USART1_Init 0 */
    9 Q3 |+ t; a, h( V! a* ?) k9 p) W
  5. 5 t- B- P/ N7 i9 s8 V4 _
  6.   /* USER CODE END USART1_Init 0 */  S* ^7 a7 k( |; i/ Q. L4 p% K

  7. " U7 N7 _5 S1 t. r
  8.   /* USER CODE BEGIN USART1_Init 1 */* x) ~- @9 p3 G2 {* y7 S

  9. 9 G0 e1 R4 n: R* x: ]4 @1 }+ I
  10.   /* USER CODE END USART1_Init 1 */
    ' k; h( ?. i! F# e+ \
  11.   huart1.Instance = USART1;2 u: \  z* e! q4 F0 O
  12.   huart1.Init.BaudRate = 115200;
    . w0 X3 {* [0 Q8 r/ n; k) W
  13.   huart1.Init.WordLength = UART_WORDLENGTH_8B;& l4 q  r- |# H2 Q" ]) }7 k
  14.   huart1.Init.StopBits = UART_STOPBITS_1;
    & P; n4 {( t. `2 c( v
  15.   huart1.Init.Parity = UART_PARITY_NONE;
    7 v( O4 Y7 |, h0 k, A1 M2 \
  16.   huart1.Init.Mode = UART_MODE_TX_RX;! v/ ]2 G3 Y: ]
  17.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    # @' o( w! j1 j3 l6 J" e
  18.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    7 d0 Z8 m9 Q: D: b( q$ e
  19.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;6 y) j! Z; J# v/ T* q5 k2 _
  20.   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
    ! C0 O7 {0 {& u0 @6 C& H( ]& ~
  21.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;% C; V4 D& _/ R! t- O
  22.   if (HAL_UART_Init(&huart1) != HAL_OK). A+ N" b2 |  f) q9 O/ w& V' p
  23.   {4 i& v, U; W# n
  24.     Error_Handler();- c( ]& y- l9 Q: Z
  25.   }
    6 L" P* Y; h/ Q' j
  26.   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
    2 f8 s  m3 y  v! Y# g
  27.   {9 I6 Z' P6 G$ z& b9 W  K: _  B9 @. q
  28.     Error_Handler();4 u8 z: p' N6 x7 @2 u
  29.   }; _/ ]0 h! ?% n8 d' p8 a- m
  30.   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)/ v# P5 H0 J+ D5 Z) ~1 z. P" S
  31.   {
    : [9 h* F. \3 H9 E
  32.     Error_Handler();6 d; l1 `" Z" K4 e' w
  33.   }
    2 k' ^& I2 T& W9 v% `; `
  34.   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
    8 U. S) R" y: v7 v8 U
  35.   {+ V9 @2 g! I) l$ N7 e7 u
  36.     Error_Handler();7 f0 E( ~4 Z" L" ^% T: k/ X
  37.   }& N1 y7 v, ~8 b- m: j* T! j
  38.   /* USER CODE BEGIN USART1_Init 2 */
    & C4 J2 a0 N* o* y* X9 u
  39. 9 d# r3 w8 o. ^; {$ t
  40.   /* USER CODE END USART1_Init 2 */
    0 C- |1 k9 S% z7 m
  41. 8 P8 m# \, U7 L# |1 T) K' ?
  42. }
复制代码
2 H/ y: l5 o& ^
微信图片_20240525142238.png $ m+ t  n  |  v. m7 F5 Z/ w* U
7 o& z  F; _" T$ y! y
# P/ K# W$ A; h; O6 r
然后试过了,如果不分开文件的话初始化也是没有GPIO的初始化内容。& V# \& U$ y0 Z* u1 R0 F
& r1 s: d4 y$ u5 j- b' s6 z
微信图片_20240525142235.png
  W# z" b1 T6 y, v9 f! P
: d3 `9 Y; I1 W8 p/ @: p3 F 微信图片_20240525142232.png   L# o4 x. Z5 C4 X1 U' k
- @' Y/ [# h% L& n# a
转载自: 电路小白
6 _- u, o8 H7 t+ t+ t如有侵权请联系删除
% B5 j1 b" }' Q
; F* C6 H4 h- S' o' y% r. v6 A. [5 p; @: x* f
: B( Z5 W) k5 C3 p. |
收藏 评论0 发布时间:2024-5-25 14:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

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