01需求分析
1 E+ a* E* Z+ U' B最近有些客户需要在 STM32WL55 实现 LoRaWAN FUOTA 功能,LoRaWAN_FUOTA 默认是基于双核 STM32WL55JC,由于成本考虑客户需要用 STM32WLE5CC,客户咨询如何移植?
7 K$ Q2 H n4 Q) [+ D
; a# u3 ~. d! K! ~7 q- V! I4 X N02问题描述
& g+ m/ a! P( R4 f$ {以下移植是基于 IAR IDE 和 STM32Cube_FW_WL_V1.3.0,复制 STM32Cube_FW_WL_V1.3.0\Projects\NUCLEO-WL55JC\Applications 下的 LoRaWAN_FUOTA 为 LoRaWAN_FUOTA_WLE5CC。
2 q# u# E/ f# O0 w" n
" K1 c* h( ^ G( _/ w* U先分析基于 STM32WL55JC 的 LoRaWAN_FUOTA 。# V" N- K9 l4 M1 Q
* t. g. l& r% N; v3 j! lLoRaWAN_FUOTA 下的 1_Image_KMS_Blob 和 1_Image_SECoreBin 仅有 icf 文件,没有.s 文件。LoRaWAN_FUOTA 下的 1_Image_BFU 和 LoRaWAN_End_Node 都有.icf 和.s 文件。0 h- ?# J2 D0 O' x
% w- |# S6 L$ {3 G2.1. 对比.s 文件(两个都一样)( L/ M% P; l5 U3 V9 J7 S, T
8 c* r/ m2 ] I2 [; dLoRaWAN_FUOTA\LoRaWAN_End_Node\EWARM\startup_stm32wl55xx_cm4.s 和LoRaWAN_FUOTA\1_Image_BFU\EWARM\startup_stm32wl55xx_cm4.s 是一样的!
1 f# [: j" @$ M2 v' ` K+ ~! G9 Q, ~. i5 O: h9 o
LoRaWAN_FUOTA\LoRaWAN_End_Node 和LoRaWAN\LoRaWAN_End_Node 的startup_stm32wl55xx_cm4.s 是相同的!
8 `6 T8 \0 E8 a$ [/ Y7 |$ K5 d4 I" R, O* ?. _4 u
EWARM\startup_stm32wl55xx_cm4.s 和 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wl55xx_c m4.s 是一样的!
9 m0 o+ p+ h. _ k
t4 R% t* S0 G所以 STM32WLE5 的.s 可使用 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wle5xx.s
, s+ p1 L6 H w; u$ g4 v
c; Q$ f6 n/ \. O& r所以,可复制 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wle5xx.s到 LoRaWAN_FUOTA_WLE5CC\LoRaWAN_End_Node\EWARM 目录下
( @6 m" m( a7 k& b" {2 o0 R
5 F# i) B( `& J, e, Z4 j c注意:startup_stm32wle5xx.s 和 startup_stm32wl55xx_cm4.s 不一样, startup_stm32wle5xx.s 中没有 C2SEV_PWR_C2H_IRQHandler, IPCC_C1_RX_IRQHandler,IPCC_C1_TX_IRQHandler 相关的配置。
H' g# G2 y8 O/ F2.2. 对比.icf 文件(四个都不一样)) ~% P! l$ \/ u7 E/ [) ]1 i
LoRaWAN_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 p: A" L$ ]0 r h r
: a1 h" \5 j* V& |5 s& \LoRaWAN_FUOTA\LoRaWAN_End_Node\EWARM\stm32wl55xx_flash_cm4.icf 和 LoRaWAN\LoRaWAN_End_Node\EWARM\stm32wl55xx_flash_cm4.icf 也不一样! H% H- i1 I3 I" f+ g* L
$ h' B+ g5 d6 {( T4 N因此保留原有的.icf 文件。1 m4 n* k! k- e" O( S% M* r
+ `) Q: v8 q$ W7 A2 r+ A5 A0 Y
03移植: L- G4 \4 J3 J4 ^3 V+ t1 k
以下移植是基于 IAR IDE 和 STM32Cube_FW_WL_V1.3.0,复制 STM32Cube_FW_WL_V1.3.0\Projects\NUCLEO-WL55JC\Applications 下的 LoRaWAN_FUOTA 为 LoRaWAN_FUOTA_WLE5CC。
) L8 t; j: }. | x5 N8 k$ H @ V
7 z% u- _4 }* c5 z0 s0 [ N, v根据编译顺序依次移植 LoRaWAN_FUOTA_WLE5CC 下的 1_Image_KMS_Blob, 1_Image_SECoreBin, 1_Image_BFU, LoRaWAN_End_Node
. P! m% u/ U7 c7 T8 v) Z* i/ w% R% ~$ d) x
3.1. 移植 1_Image_KMS_Blob
* ^. A6 m6 y! M+ y/ r$ `打开,选中 Project-STM32WL55JC_Nucleo_1_Image_KMS_Blob, 按 ALT+F7 打开 Options 配置。7 G. @# f: s- o$ u; t& j! ]
- n0 Z' V7 W8 N; T& y- h; F
3.2. 移植 1_Image_SECoreBin
; l6 Q/ b" l' G/ C( i& m* Z0 H: }打开,选中 Project-STM32WL55JC_Nucleo_1_Image_SECoreBin, 按 ALT+F7 打开 Options 配置。% J. Z7 ^+ W' b, @4 t
( a+ S* d& X/ o8 I; p7 j3.3. 移植 1_Image_BFU
) v4 j7 J& v, Z/ N4 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 目录下 。
$ ^# A! c; h$ Q' r! R, @; G3 O5 {) I( S$ O. i
打开,选中 Project-STM32WL55JC_Nucleo_1_Image_SECoreBin,按 ALT+F7 打开 Options 配置。
& R" W) ]* k2 k, x- main.c
. T0 D, X- l1 Q# { ^ - Error[Pe020]: identifier "RCC_CLOCKTYPE_HCLK2" is undefined
X) ~3 |' \+ `$ ]& i - C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_3 b+ a' T0 ~: K- {
- FUOTA\Projects\NUCLEOWL55JC\Applications\LoRaWAN_FUOTA_WLE5CC\1_Image_BFU\Core\Src\main.c933 |: G6 T7 i) Q! U1 K
- Error[Pe136]: struct "<unnamed>#87" (declared Hat line 297 of
7 I& J/ K! q: `. { - "C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_FUOT3 u$ ^8 M# V9 @. P" \
- A\Drivers\STM32WLxx_HAL_Driver\Inc\stm32wlxx_hal_rcc.h"h) has no field
7 Q/ W. A# m k1 k2 v B y. j - "AHBCLK2Divider"
0 ?9 _$ z! ]0 ]1 O( W - C:\Users\gongw\STM32Cube\Repository\CubeWL\STM32Cube_FW_WL_V1.3.0_3 R/ ^1 D* o, H# K7 n
- FUOTA\Projects\NUCLEOWL55JC\Applications\LoRaWAN_FUOTA_WLE5CC\1_Image_BFU\Core\Src\main.c100
复制代码 修改代码如下:
/ b( X8 A! p, y+ N3 B0 ^# P: O/ L- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers*/
' J$ k3 J% q$ R$ ]+ }
: U! w% p, \ k# M- #if defined(DUAL_CORE)& e8 f3 P3 ^' O% |/ E3 I
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3|RCC_CLOCKTYPE_HCLK2
# [" n- r$ P3 K+ D/ U. g7 u9 r0 c - |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK' l. ^0 m+ i' Y$ v1 p# _
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
, L1 I8 q/ A& P6 x% V - #else; H- c' }- B h/ i& n% @5 t
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3' C$ L3 k1 ^' Y3 I7 Z. ^8 }
- |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
5 A. N7 J j. L2 d+ s - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;' e* s# {; o5 p* A2 e' c! R( E
- #endif /* DUAL_CORE */3 B3 N/ x+ {6 ^2 o. s1 n9 v
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
/ Y5 Q& w. s4 T) N' d - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
$ m, [# e* a- W1 k8 y l; v - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
' D7 p, [6 u0 R, H - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
# b/ j9 B. k, V- |0 C! T: l3 B3 V - #if defined(DUAL_CORE)
* c7 H W% W ~ ?% E - RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ x( g( _1 P+ f7 B6 J: ]6 ^) l, | - #endif /* DUAL_CORE */
: J' t* I, u$ m: I - RCC_ClkInitStruct.AHBCLK3Divider = RCC_SYSCLK_DIV1;% p! Q8 N9 c1 n! u. S M
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
复制代码 按 F7 编译3 q+ |, i9 I6 E( l# G' r, U; O" i
% M! d, Q$ d! z8 I$ y9 d3.4. 移植 LoRaWAN_End_Node
* r# t. u4 d, j( r. u7 W- ?, t9 l Y复制 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 目录下。+ J' g9 Q1 v5 X
* j: u/ ~5 y4 J: I$ u打开,选中 Project-STM32WL55JC_Nucleo_1_Image_SECoreBin,按 ALT+F7 打开 Options 配置。
4 C; O/ a% Y- P8 U( F- L, E6 z1 t$ v/ E) Y9 r1 [
修改代码如下; X2 K; Q1 N; ]; j* d
- #if defined(DMA_CCR_SECM) && defined(DMA_CCR_PRIV)& D: @5 h1 a: e
- if (HAL_DMA_ConfigChannelAttributes(&hdma_usart2_tx," U2 @8 r8 K+ a" T1 R. I7 l0 b8 j
- DMA_CHANNEL_NPRIV) != HAL_OK)
+ r+ Y! @1 s$ Z) t2 L! U( p - {
& J& r/ x5 N% S# W; Z4 H0 J) F- G - Error_Handler();
2 G) k2 ]+ k; C J4 e - }. i& `/ D" X& H9 }
- #endif /* DMA_SECURE_SWITCH */7 M5 O0 D' k" R# `
- __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
复制代码 按 F7 编译:1 D: n G5 d: b1 n) N% g: B* {/ j
: v6 J% ]7 E, D# ^% F3.5. 移植 disable_security.bat ) m4 b1 u0 Y4 w' Y
STM32WLE5CC 的 OptionBytes 中没 C2BOOT_LOCK,HDPAD,SUBGHSPISD, SNBRSA,SBRSA,SBRV,因此注释掉 LoRaWAN_FUOTA_WLE5CC\Scripts\disable_security.bat 这些 Option 的设置。
; C/ E7 c: X/ E k0 K- echo IWDG: Independent watchdog counter frozen in Stop/Standby modes
( r9 v" R3 `( s8 ]7 N+ T - call :write_ob IWGD_STDBY 0x0 IWDG_STOP 0x0 || goto :eof
4 f/ J6 o% Y1 c, `( m - echo BOOT: CPU1 CM4 Boot lock disabled
5 o( ^ v1 R! R5 Z( a/ k1 n" g - call :write_ob BOOT_LOCK 0x0 || goto :eof
. S" M! }& Y& w v5 w2 g9 F$ A - REM echo BOOT: CPU1+CPU2 CM0+ Boot lock disabled3 X7 I3 O6 ]: @
- REM call :write_ob BOOT_LOCK 0x0 C2BOOT_LOCK 0x0 || goto :eof
1 Q# M$ X6 j7 e+ H6 F6 p" N% P5 d - REM echo ------ Security Configuration ------' V4 K# ~1 ?' d3 }2 F1 K8 R
- REM echo HDPAD: User Flash hide protection area access disabled
3 W" |; P- b) B4 G$ ~6 L - REM call :write_ob HDPAD 0x1 || goto :eof
. E$ f2 @% z$ q2 V& h5 | - REM echo SPISD: SPI3 security disabled
7 O- r" x7 h. c' Z+ Y - REM call :write_ob SUBGHSPISD 0x1 || goto :eof
' o$ B, z! a) B - REM echo SBRSA: Reset default value of SRAM Start address secure
6 R) G( D; N; x; j. L- @ a Q7 m - REM call :write_ob SNBRSA 0x1F SBRSA 0x1F || goto :eof
& D. p9 X0 R: r' j8 c - REM echo SBRV: Reset default value of CPU2 Boot start address0 D. G% x. a- z% v9 J/ r
- REM call :write_ob SBRV 0x8000 || goto :eof
1 ~7 D+ K: b+ [; ~ - exit /B 0
! u* A5 J+ n& K2 |3 M( S f1 ?- o& A
复制代码
" _+ J6 w- l0 p& n3.6. 配置 setenv.bat # I: q Z2 T \! P
7 O5 K5 q; s) U+ D1 x9 D
在 LoRaWAN_FUOTA_WLE5CC\Scripts\setenv.bat 中配置 CUBEPROG_EXE, EWARM_EXE,MDK_EXE,CUBEIDE_EXE 的正确路径。 0 e* A+ h& E6 N3 m! m
6 K5 `- v1 T5 u" X6 s3 u# g
04编译
7 H5 A7 u8 m- O8 B6 A5 q# G可在 LoRaWAN_FUOTA_WLE5CC\Scripts\EWARM\build.bat 编译 LoRaWAN_End_Node 之后加个 “pause”命令,查看编译 log。
( ]# U1 E- L2 e还可将 rebuild 改为 0,这样再次运行 build.bat 时,不会 clean,编译时间会短;否认会 clean 完全重新编译,时间会长!
& c# h0 f6 V2 e7 o# t% X. h! [/ ?5 n2 ~& d h b$ e* [; m1 o0 I( ? Z
05下载
P2 {' n8 w& u) j, w; _通过 STLink 连接 STM32WLE5CC 的板子到 PC 上,运行 program.bat 即可下载LoRaWAN_End_Node\EWARM\Binary\BFU_LoRaWAN_End_Node.bin 到 flash 的 0x08000000 处。
! e: d- \+ Q8 O% f4 B5 Y) L2 _
- y1 r3 A/ x8 Q8 d% ^( W. h) o06运行
! x4 u' g9 }, Q4 e下载完 BFU_LoRaWAN_End_Node.bin 之后,将 STM32WLE5CC 的板子重新断电再上电!至此 STM32WLE5CC 上可运行 LoRaWAN_FUOTA 了。3 y7 k6 y" o; ^# m( K- \/ l6 e
' W1 ^% s' H" _. b07小结
/ l4 I4 L2 E5 C! @9 b移植要点: ! P. L% v; Q' r; q. m' _+ @
1. 使用 STM32Cube_FW_WL_V1.3.0 \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\iar\startup_stm32wl55xx_ cm4
; Y# @+ L. q6 i2 z$ K" Y2. 保持原有的.icf 文件
: t$ V- \5 p# @3 P& b# O7 p4 k3. 通过 IDE 修改 Device 由 ST STM32WL55JC 改为 ST STM32WLE5CC,将宏定义 9 y2 |; P: k* C' V, z. O( n+ u! }
4. STM32WL55XX 改为 STM32WLE5XX
9 z& l) @1 e _1 Q" s! @5 Q' p1 `5. 注释掉或删除 Scripts\disable_security.bat 中的 C2BOOT_LOCK,HDPAD, SUBGHSPISD,SNBRSA,SBRSA,SBRV 的 OtionBytes 配置。. `2 Z6 j: I9 L/ Q. [9 r3 l
7 b2 N- K U# q, h) h4 O2 } |