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 d2.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
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 \
+ `% 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. |
' |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 ]
. 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
- main.c
/ f0 n2 c) d1 X: ~4 I - Error[Pe020]: identifier "RCC_CLOCKTYPE_HCLK2" is undefined! g* m, R4 Z- O' P
- C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_
6 x( S- |) o* n - FUOTA\Projects\NUCLEOWL55JC\Applications\LoRaWAN_FUOTA_WLE5CC\1_Image_BFU\Core\Src\main.c937 d. W5 D e" ]/ |% i& w- i* a
- Error[Pe136]: struct "<unnamed>#87" (declared Hat line 297 of% K3 A3 ]" D9 H) H# P
- "C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_FUOT9 v9 N& I: b: U0 P5 v( U
- A\Drivers\STM32WLxx_HAL_Driver\Inc\stm32wlxx_hal_rcc.h"h) has no field
2 f* ^6 V+ k* v* L! Q+ T4 P - "AHBCLK2Divider"# a" ]; d- {9 k. B
- C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_
+ \* {. p2 @6 D - FUOTA\Projects\NUCLEOWL55JC\Applications\LoRaWAN_FUOTA_WLE5CC\1_Image_BFU\Core\Src\main.c100
复制代码 修改代码如下:
# G" H$ c0 v- F& }" N- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers*/
# U* N: K, u( \* M7 h - % w) A i3 z$ ^6 K
- #if defined(DUAL_CORE)9 R% _. D0 n' n0 w* @
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3|RCC_CLOCKTYPE_HCLK27 e/ J" _4 i+ d7 I
- |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK6 H( H# c, S8 K' B. R0 K5 W5 k
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;- w+ W6 @% |% c9 C
- #else& L; l1 R9 y! U! a
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3
: R9 |) p$ N9 i' v - |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK6 S; R4 u( \4 [# m8 Z1 t
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
" ~# v2 }: J. I& d1 | - #endif /* DUAL_CORE */
# N" W. j% }$ w( j8 l6 C, s - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
) k# J2 K5 v0 U- N! z, Q* J - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;' E% k: m; p- a
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
4 Y) J8 n" z# C3 q5 W* k2 x) @2 S - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
, K+ r+ Q3 ^' J3 P - #if defined(DUAL_CORE); i9 Y1 w t8 y6 k/ Y, L* j( Y
- RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;1 r4 r; T, `& g
- #endif /* DUAL_CORE */% @7 v4 M& F! k* l; A5 l
- RCC_ClkInitStruct.AHBCLK3Divider = RCC_SYSCLK_DIV1;: w" ]! n% ?+ a- |! K$ ~& N
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
复制代码 按 F7 编译
' U% I( C7 W2 J( `1 s& f! D6 W* 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
5 V9 y Q; e* F( Y修改代码如下
( ] |$ k1 u8 d6 ]9 m8 ]- #if defined(DMA_CCR_SECM) && defined(DMA_CCR_PRIV)
+ v* T O3 `- B2 O - if (HAL_DMA_ConfigChannelAttributes(&hdma_usart2_tx,
3 U3 V+ f! L w4 o; t" w - DMA_CHANNEL_NPRIV) != HAL_OK)
: c5 k/ _) i4 c - {- u+ o; f! k' Y" D* H% G
- Error_Handler();
v ?4 K, l. [$ J - }" h; F. W- Q. Y# O! |
- #endif /* DMA_SECURE_SWITCH */* b- n2 L& X. N7 S9 b- k4 a- {
- __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
复制代码 按 F7 编译:6 a7 {# [2 n$ r! T @4 o
/ ?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 ~
- echo IWDG: Independent watchdog counter frozen in Stop/Standby modes
0 e6 Q# Q3 ~6 f' W - call :write_ob IWGD_STDBY 0x0 IWDG_STOP 0x0 || goto :eof( ~, w* `& ~0 ~- R7 p+ f2 l/ X
- echo BOOT: CPU1 CM4 Boot lock disabled+ y- x" ^ U* t9 u
- call :write_ob BOOT_LOCK 0x0 || goto :eof( `% P) ~ C: U2 c8 W
- REM echo BOOT: CPU1+CPU2 CM0+ Boot lock disabled9 S; `5 C& c/ l
- REM call :write_ob BOOT_LOCK 0x0 C2BOOT_LOCK 0x0 || goto :eof
% F4 U: m6 y% |) g - REM echo ------ Security Configuration ------
* P$ W5 g# n# Y% O/ i - REM echo HDPAD: User Flash hide protection area access disabled
% e1 a. r [1 n6 t - REM call :write_ob HDPAD 0x1 || goto :eof' {: O/ t" c4 F9 v- [
- REM echo SPISD: SPI3 security disabled
) O# W$ G q& t; Q1 t% H- f- V - REM call :write_ob SUBGHSPISD 0x1 || goto :eof( w9 C1 }5 v6 K3 \) a
- REM echo SBRSA: Reset default value of SRAM Start address secure. f, m& e) D. c3 l( z4 @
- REM call :write_ob SNBRSA 0x1F SBRSA 0x1F || goto :eof
M% R0 n3 O. m/ a; ^ - REM echo SBRV: Reset default value of CPU2 Boot start address. g: h( U" y' E" H
- REM call :write_ob SBRV 0x8000 || goto :eof# c8 C9 f- F/ o; H. O) n5 V- u! D
- 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
还可将 rebuild 改为 0,这样再次运行 build.bat 时,不会 clean,编译时间会短;否认会 clean 完全重新编译,时间会长!; _, R9 v" s7 O
. 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) ` |