请选择 进入手机版 | 继续访问电脑版

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

实战经验 | 从STM32WL55JC到STM32WLE5CC的LoRaWAN_FUOTA移植

[复制链接]
STMCU-管管 发布时间:2024-9-25 16:24
01需求分析  3 r9 Z. W2 Q6 _/ p( v4 G
最近有些客户需要在 STM32WL55 实现 LoRaWAN FUOTA 功能,LoRaWAN_FUOTA 默认是基于双核 STM32WL55JC,由于成本考虑客户需要用 STM32WLE5CC,客户咨询如何移植?
2 P9 E, X8 ~/ X" O& H7 v$ D. d5 u3 x8 N
02问题描述 1 L( k7 }! W/ K5 W5 r8 }
以下移植是基于 IAR IDE 和 STM32Cube_FW_WL_V1.3.0,复制 STM32Cube_FW_WL_V1.3.0\Projects\NUCLEO-WL55JC\Applications 下的 LoRaWAN_FUOTA 为 LoRaWAN_FUOTA_WLE5CC。
# t' O$ ~8 }7 r% {

' ]) p2 a6 y2 ~2 \先分析基于 STM32WL55JC 的 LoRaWAN_FUOTA 。% I5 a/ L9 C/ i7 Y2 M( ~
7 y3 \1 l  V- Q
LoRaWAN_FUOTA 下的 1_Image_KMS_Blob 和 1_Image_SECoreBin 仅有 icf 文件,没有.s 文件。LoRaWAN_FUOTA 下的 1_Image_BFU 和 LoRaWAN_End_Node 都有.icf 和.s 文件。
: }3 O9 y, U  X' Y' W0 f1 e3 c; J2 k
/ q7 r4 m3 u: s- V# L; K" C! E2.1. 对比.s 文件(两个都一样)
" N9 w+ p1 E6 U- N  b- b0 a' Y- @9 ]  i0 ~/ w/ O& a
LoRaWAN_FUOTA\LoRaWAN_End_Node\EWARM\startup_stm32wl55xx_cm4.s 和LoRaWAN_FUOTA\1_Image_BFU\EWARM\startup_stm32wl55xx_cm4.s 是一样的!
$ E7 P% U# E) D  R' S

  o2 L1 s3 x5 G3 _9 S6 eLoRaWAN_FUOTA\LoRaWAN_End_Node 和LoRaWAN\LoRaWAN_End_Node 的startup_stm32wl55xx_cm4.s 是相同的!6 P* a8 ^) o3 h2 }: M

( g/ [0 P/ Q1 M0 E' s# CEWARM\startup_stm32wl55xx_cm4.s 和 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wl55xx_c m4.s 是一样的!. u, ^9 v$ W3 ~* o! g" R+ j) i
- v' U1 w4 j# Y8 e+ a
所以 STM32WLE5 的.s 可使用 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wle5xx.s  c3 X- F$ h+ P- w% k, j% x
# N* d4 J. l; t+ Z- \
所以,可复制 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wle5xx.s到 LoRaWAN_FUOTA_WLE5CC\LoRaWAN_End_Node\EWARM 目录下
( j: z. r, ^: O* y$ i

+ [3 o1 l2 H  G; r7 x  W$ s& \6 [' ?2 l注意:startup_stm32wle5xx.s 和 startup_stm32wl55xx_cm4.s 不一样, startup_stm32wle5xx.s 中没有 C2SEV_PWR_C2H_IRQHandler, IPCC_C1_RX_IRQHandler,IPCC_C1_TX_IRQHandler 相关的配置。
+ Q( F' Q) m3 e; V- B8 d
12.png
2.2. 对比.icf 文件(四个都不一样)
* s2 N, s: z( {) f  I! l5 X  wLoRaWAN_FUOTA\1_Image_BFU\EWARM\stm32wl55xx_flash_cm4.icf LoRaWAN_FUOTA\1_Image_KMS_Blob\EWARM\stm32wl55xx_flash_cm4.icf LoRaWAN_FUOTA\1_Image_SECoreBin\EWARM\stm32wl55xx_flash_cm4.icf LoRaWAN_FUOTA\LoRaWAN_End_Node\EWARM\stm32wl55xx_flash_cm4.icf 这四个.icf 文件都不一样!9 W$ q) s1 x: g
13.png
14.png
15.png
16.png
3 c8 w5 W8 u% T5 w
LoRaWAN_FUOTA\LoRaWAN_End_Node\EWARM\stm32wl55xx_flash_cm4.icf 和 LoRaWAN\LoRaWAN_End_Node\EWARM\stm32wl55xx_flash_cm4.icf 也不一样!- m1 ]# z. t# [3 |3 \
17.png
+ `% b( J/ ?8 q# q' z6 O9 v
因此保留原有的.icf 文件。
5 ^4 c) F9 V8 Q( h% _# t' M3 F/ H" ~5 _4 V' |4 n8 h
03移植
5 S/ v' D. Z) N. G3 p以下移植是基于 IAR IDE 和 STM32Cube_FW_WL_V1.3.0,复制 STM32Cube_FW_WL_V1.3.0\Projects\NUCLEO-WL55JC\Applications 下的 LoRaWAN_FUOTA 为 LoRaWAN_FUOTA_WLE5CC。
; ~# P- |- j' M( d: @6 Y! R4 F! [& \  u8 W
根据编译顺序依次移植 LoRaWAN_FUOTA_WLE5CC 下的 1_Image_KMS_Blob, 1_Image_SECoreBin, 1_Image_BFU, LoRaWAN_End_Node. \1 C' o0 o% D$ K; \2 j
1 p; i2 _+ ~) u$ i" @5 c+ N$ k% R
3.1. 移植 1_Image_KMS_Blob
' t  S3 }+ }* x( Y% t% l& ^+ L打开,选中 Project-STM32WL55JC_Nucleo_1_Image_KMS_Blob, 按 ALT+F7 打开 Options 配置。6 A# @5 |) I$ U# D. |
18.png
19.png
' |4 y% v* c1 T7 ?; P, y4 ]* [
3.2. 移植 1_Image_SECoreBin 5 S& N; E% p; B! w5 H1 ^
打开,选中 Project-STM32WL55JC_Nucleo_1_Image_SECoreBin, 按 ALT+F7 打开 Options 配置。5 l+ u; m1 y5 q6 ]
20.png
21.png

. W' D3 ], S; [8 F3.3. 移植 1_Image_BFU
) w& p! l" s- a3 S$ R复制 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wle5x x.s 到 LoRaWAN_FUOTA_WLE5CC\1_Image_BFU\EWARM 目录下 。
3 I- p# }" ]4 r& a
; q7 |& N& j# R" N打开,选中 Project-STM32WL55JC_Nucleo_1_Image_SECoreBin,按 ALT+F7 打开 Options 配置。9 ?% P# @. E3 T
22.png
23.png
24.png
  1. main.c
    / f0 n2 c) d1 X: ~4 I
  2. Error[Pe020]: identifier "RCC_CLOCKTYPE_HCLK2" is undefined! g* m, R4 Z- O' P
  3. C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_
    6 x( S- |) o* n
  4. FUOTA\Projects\NUCLEOWL55JC\Applications\LoRaWAN_FUOTA_WLE5CC\1_Image_BFU\Core\Src\main.c937 d. W5 D  e" ]/ |% i& w- i* a
  5. Error[Pe136]: struct "<unnamed>#87" (declared Hat line 297 of% K3 A3 ]" D9 H) H# P
  6. "C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_FUOT9 v9 N& I: b: U0 P5 v( U
  7. A\Drivers\STM32WLxx_HAL_Driver\Inc\stm32wlxx_hal_rcc.h"h) has no field
    2 f* ^6 V+ k* v* L! Q+ T4 P
  8. "AHBCLK2Divider"# a" ]; d- {9 k. B
  9. C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_
    + \* {. p2 @6 D
  10. FUOTA\Projects\NUCLEOWL55JC\Applications\LoRaWAN_FUOTA_WLE5CC\1_Image_BFU\Core\Src\main.c100
复制代码
修改代码如下:
# G" H$ c0 v- F& }" N
  1. /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers*/
    # U* N: K, u( \* M7 h
  2. % w) A  i3 z$ ^6 K
  3. #if defined(DUAL_CORE)9 R% _. D0 n' n0 w* @
  4. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3|RCC_CLOCKTYPE_HCLK27 e/ J" _4 i+ d7 I
  5. |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK6 H( H# c, S8 K' B. R0 K5 W5 k
  6. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;- w+ W6 @% |% c9 C
  7. #else& L; l1 R9 y! U! a
  8. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3
    : R9 |) p$ N9 i' v
  9. |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK6 S; R4 u( \4 [# m8 Z1 t
  10. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    " ~# v2 }: J. I& d1 |
  11. #endif /* DUAL_CORE */
    # N" W. j% }$ w( j8 l6 C, s
  12. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    ) k# J2 K5 v0 U- N! z, Q* J
  13. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;' E% k: m; p- a
  14. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    4 Y) J8 n" z# C3 q5 W* k2 x) @2 S
  15. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    , K+ r+ Q3 ^' J3 P
  16. #if defined(DUAL_CORE); i9 Y1 w  t8 y6 k/ Y, L* j( Y
  17. RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;1 r4 r; T, `& g
  18. #endif /* DUAL_CORE */% @7 v4 M& F! k* l; A5 l
  19. RCC_ClkInitStruct.AHBCLK3Divider = RCC_SYSCLK_DIV1;: w" ]! n% ?+ a- |! K$ ~& N
  20. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
复制代码
按 F7 编译
' U% I( C7 W2 J( `1 s& f! D6 W
25.png
* c. t2 f+ D0 p, ?9 f
3.4. 移植 LoRaWAN_End_Node& f* G- w' t% F# i/ ~/ q
复制 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wle5x x.s 到 LoRaWAN_FUOTA_WLE5CC\LoRaWAN_End_Node\EWARM 目录下。
/ f) W  h1 V5 Y# Y' z+ P& ?
* c" v# d( C& d3 s# X* v打开,选中 Project-STM32WL55JC_Nucleo_1_Image_SECoreBin,按 ALT+F7 打开 Options 配置。
, Q$ l& k6 Z. Y' E
26.png
27.png
28.png

5 V9 y  Q; e* F( Y修改代码如下
( ]  |$ k1 u8 d6 ]9 m8 ]
  1. #if defined(DMA_CCR_SECM) && defined(DMA_CCR_PRIV)
    + v* T  O3 `- B2 O
  2. if (HAL_DMA_ConfigChannelAttributes(&hdma_usart2_tx,
    3 U3 V+ f! L  w4 o; t" w
  3. DMA_CHANNEL_NPRIV) != HAL_OK)
    : c5 k/ _) i4 c
  4. {- u+ o; f! k' Y" D* H% G
  5. Error_Handler();
      v  ?4 K, l. [$ J
  6. }" h; F. W- Q. Y# O! |
  7. #endif /* DMA_SECURE_SWITCH */* b- n2 L& X. N7 S9 b- k4 a- {
  8. __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
复制代码
按 F7 编译:6 a7 {# [2 n$ r! T  @4 o
29.png

/ ?3 h- n8 s( B6 A# H9 {3.5. 移植 disable_security.bat
$ E0 n. w" P& @1 ^STM32WLE5CC 的 OptionBytes 中没 C2BOOT_LOCK,HDPAD,SUBGHSPISD, SNBRSA,SBRSA,SBRV,因此注释掉 LoRaWAN_FUOTA_WLE5CC\Scripts\disable_security.bat 这些 Option 的设置。+ ~) D1 [: X( c4 p0 ~
  1. echo IWDG: Independent watchdog counter frozen in Stop/Standby modes
    0 e6 Q# Q3 ~6 f' W
  2. call :write_ob IWGD_STDBY 0x0 IWDG_STOP 0x0 || goto :eof( ~, w* `& ~0 ~- R7 p+ f2 l/ X
  3. echo BOOT: CPU1 CM4 Boot lock disabled+ y- x" ^  U* t9 u
  4. call :write_ob BOOT_LOCK 0x0 || goto :eof( `% P) ~  C: U2 c8 W
  5. REM echo BOOT: CPU1+CPU2 CM0+ Boot lock disabled9 S; `5 C& c/ l
  6. REM call :write_ob BOOT_LOCK 0x0 C2BOOT_LOCK 0x0 || goto :eof
    % F4 U: m6 y% |) g
  7. REM echo ------ Security Configuration ------
    * P$ W5 g# n# Y% O/ i
  8. REM echo HDPAD: User Flash hide protection area access disabled
    % e1 a. r  [1 n6 t
  9. REM call :write_ob HDPAD 0x1 || goto :eof' {: O/ t" c4 F9 v- [
  10. REM echo SPISD: SPI3 security disabled
    ) O# W$ G  q& t; Q1 t% H- f- V
  11. REM call :write_ob SUBGHSPISD 0x1 || goto :eof( w9 C1 }5 v6 K3 \) a
  12. REM echo SBRSA: Reset default value of SRAM Start address secure. f, m& e) D. c3 l( z4 @
  13. REM call :write_ob SNBRSA 0x1F SBRSA 0x1F || goto :eof
      M% R0 n3 O. m/ a; ^
  14. REM echo SBRV: Reset default value of CPU2 Boot start address. g: h( U" y' E" H
  15. REM call :write_ob SBRV 0x8000 || goto :eof# c8 C9 f- F/ o; H. O) n5 V- u! D
  16. exit /B 0
    ; i/ g% |% \6 R& W9 W
复制代码
* ], w  }6 r1 j, A
3.6. 配置 setenv.bat
' v- W' y. t) W
+ h& l) W& {' I' M% r& A在 LoRaWAN_FUOTA_WLE5CC\Scripts\setenv.bat 中配置 CUBEPROG_EXE, EWARM_EXE,MDK_EXE,CUBEIDE_EXE 的正确路径。 * _) J/ @! B4 B7 ~6 l
5 J7 u) n/ r! Q
04编译5 @) U- F6 \8 }7 D; T
可在 LoRaWAN_FUOTA_WLE5CC\Scripts\EWARM\build.bat 编译 LoRaWAN_End_Node 之后加个 “pause”命令,查看编译 log。6 }. {1 m8 G( }: C8 z3 e* f* y1 X6 O
30.png
31.png
还可将 rebuild 改为 0,这样再次运行 build.bat 时,不会 clean,编译时间会短;否认会 clean 完全重新编译,时间会长!; _, R9 v" s7 O
32.png
33.png
. R1 _( m9 R9 E2 R' Z  V3 i; R5 k/ u
05下载' `! D6 f- w8 M2 S$ K) n
通过 STLink 连接 STM32WLE5CC 的板子到 PC 上,运行 program.bat 即可下载LoRaWAN_End_Node\EWARM\Binary\BFU_LoRaWAN_End_Node.bin 到 flash 的 0x08000000 处。
' F8 j+ D* b% E
/ c: T% d: m% j1 N: c. w06运行+ p6 d! K) G! s+ G) p
下载完 BFU_LoRaWAN_End_Node.bin 之后,将 STM32WLE5CC 的板子重新断电再上电!至此 STM32WLE5CC 上可运行 LoRaWAN_FUOTA 了。
% Q5 Y# a: R% N$ L: b9 I0 n

6 J/ [; T( J7 @4 J0 E- H! N) _07小结
6 Q0 d2 W5 p" _移植要点:
- m$ E2 j& v' b# s# Q* q3 y1. 使用 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wl55xx_ cm4
! q# ^4 B# w. G* J/ R! h6 Z& g( J2. 保持原有的.icf 文件
- `' c% \/ E6 e) e8 ^" V3. 通过 IDE 修改 Device 由 ST STM32WL55JC 改为 ST STM32WLE5CC,将宏定义 9 ^1 m0 {/ R2 Y1 W0 Q
4. STM32WL55XX 改为 STM32WLE5XX
# D' z1 ^$ T0 F5. 注释掉或删除 Scripts\disable_security.bat 中的 C2BOOT_LOCK,HDPAD, SUBGHSPISD,SNBRSA,SBRSA,SBRV 的 OtionBytes 配置。; B! s) x) d3 Z4 w6 w9 |

4 E2 U! x5 h2 D& Y5 O9 e) `
收藏 评论0 发布时间:2024-9-25 16:24

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版