Boot改为跳转时不校验镜像CRC(校验移到OTA升级过程),修复Keil下载后无法调试;新增debug_app.ini调试旁路;补充开发日志(第19节)与mcm-ddc-ble工程日志

This commit is contained in:
evan.liu 2026-09-02 08:22:53 +08:00
parent 5e9de32eee
commit 5d5c1d827c
29 changed files with 2716 additions and 2617 deletions

View File

@ -7,11 +7,13 @@
当前活跃工程:
- **`mcm-ddc-04/`** — 主工程(APP,链接在 APP1 bank `0x01008000`/224KB):UART(printf 重定向 + DMA 发送 + RX 中断)、CLI 命令框架(UART + BLE 双通道)、FreeRTOS 多任务、GPIO 点灯、BLE 协议栈(自定义 GATT 透传服务 CLS)、BLE OTA 双 bank 直写升级(见开发日志第 15/16 节、`docs/ble_protocol.md`)。
- **`Boot/`** — 自写精简 bootloader(链接在 `0x01000000`/16KB):bootsetting 裁决 + 镜像 CRC32 校验 + VTOR 重映射跳转;首次无 bootsetting 时向量检查后直跳 APP1。
- **`Boot/`** — 自写精简 bootloader(链接在 `0x01000000`/16KB):只做 bootsetting 裁决(magic + 自身 CRC32)选 bank + 向量表 sanity 检查后直跳;**镜像 CRC 在 OTA 升级过程中校验(app_ota.c OTA_END),Boot 跳转时不校验**(开发日志第 19 节)。
- **`mcm-ddc-ble/`** — 独立 BLE 工程(基于 SDK rdtss 例程,链接在 `0x01000000`,无 bootloader/OTA):BLE↔USART1 透传 + FreeRTOS(BLE 调度任务 + LED1 点灯任务),睡眠已锁保 SWD。日志在 `mcm-ddc-ble/docs/开发日志.md`。
仓库顶层目录:
- `mcm-ddc-04/` — 主工程(应用代码、MDK 工程文件、开发日志)
- `mcm-ddc-ble/` — 独立 BLE 工程(rdtss 蓝本 + FreeRTOS,0x01000000 直跑)
- `Boot/` — bootloader 工程(`src/main.c`、`dfu_layout.h`、`boot_crc32.c`;后两个被 APP 工程以相对路径 `..\..\Boot\src` 共用)
- `tools/` — 烧录包工具:`merge_image.py`(合并 boot+APP 为整片 hex/bin)、`make_package.bat`(一键构建+合并)、`flash_package.bat`(NSpyocd 整片烧录),产物在 `tools/out/`
- `nations-tec/` — 厂商资源:SDK V2.0.0、DFP 器件包、STB 开发板资料、官方 PDF 文档。**这些内容为只读参考资料,不要修改。**
@ -73,11 +75,10 @@ SDK 源码(固件库、CMSIS、FreeRTOS V9.0.0、BLE 协议栈/profile/ns_libr
烧录与运行:
1. Keil 打开 `MDK-ARM/embeddedSrc.uvprojx`,F7 编译
2. NS-LINK 接 SWD(PA4/PA5),F8 下载
3. 串口助手接 PB6(TX)/PB7(RX),115200 8N1,复位后应看到启动 banner 与 `caiic->` CLI 提示符(输入 `help` 查看命令;LED 滚动日志默认关闭,用 `log on` 打开)
4. BLE:手机 nRF Connect 应能搜到并连接 `CAIIC-MCM`,可见自定义服务(写特征 + notify 特征)
注意:本工程当前尚未在真实硬件上实测(见开发日志第 8、9、10、15 节)。
2. NS-LINK 接 SWD(PA4/PA5),F8 下载——Boot 跳转不校验镜像 CRC 后,Keil 直接下载 APP 即可正常启动调试;工程调试配置挂了 `MDK-ARM/debug_app.ini`(强制 SP/PC 从 APP1 向量表取,跳过 Boot 旁路,可选)
3. 独立运行(脱调试器)需烧整片包:`tools\flash_package.bat tools\out\caiic_full.bin`(改代码后先 `make_package.bat` 重新出包)。**板子上烧过其他 0x01000000 起步的程序会覆盖 Boot/bootsetting,恢复靠重烧整片包**
4. 串口助手接 PB6(TX)/PB7(RX),115200 8N1,复位后应看到启动 banner 与 `caiic->` CLI 提示符(输入 `help` 查看命令;LED 滚动日志默认关闭,用 `log on` 打开)
5. BLE:手机 nRF Connect 应能搜到并连接 `CAIIC-MCM`,可见自定义服务(写特征 + notify 特征)
## 硬件引脚约束(重要)

View File

@ -31,9 +31,7 @@ Section Cross References
system_n32wb03x.o(i.read_flash_ID) refers to system_n32wb03x.o(i.__set_PRIMASK) for __set_PRIMASK
system_n32wb03x.o(i.read_flash_ID) refers to system_n32wb03x.o(.constdata) for CMD_RDID
system_n32wb03x.o(i.system_delay_n_10us) refers to system_n32wb03x.o(.emb_text) for system_delay_cycles
main.o(i.bank_crc_ok) refers to boot_crc32.o(i.caiic_crc32) for caiic_crc32
main.o(i.main) refers to boot_crc32.o(i.caiic_crc32) for caiic_crc32
main.o(i.main) refers to main.o(i.bank_crc_ok) for bank_crc_ok
main.o(i.main) refers to main.o(i.bank_vector_ok) for bank_vector_ok
main.o(i.main) refers to main.o(i.jump_to_app) for jump_to_app
entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry10a.o(.ARM.Collect$$$$0000000D) for __rt_final_cpp
@ -77,8 +75,9 @@ Image Symbol Table
Symbol Name Value Ov Type Size Object(Section)
../clib/microlib/division.c 0x00000000 Number 0 uidiv.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry10a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry10b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry10a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry9b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry11a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry9a.o ABSOLUTE
@ -88,10 +87,9 @@ Image Symbol Table
../clib/microlib/init/entry.s 0x00000000 Number 0 entry7b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry7a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry5.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry10b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry11b.o ABSOLUTE
../clib/microlib/string/memcpy.c 0x00000000 Number 0 memcpya.o ABSOLUTE
../clib/microlib/string/memcpy.c 0x00000000 Number 0 memcpyb.o ABSOLUTE
../clib/microlib/string/memcpy.c 0x00000000 Number 0 memcpya.o ABSOLUTE
../clib/microlib/string/memset.c 0x00000000 Number 0 memseta.o ABSOLUTE
..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\device\startup\startup_n32wb03x.s 0x00000000 Number 0 startup_n32wb03x.o ABSOLUTE
..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\device\system_n32wb03x.c 0x00000000 Number 0 system_n32wb03x.o ABSOLUTE
@ -129,17 +127,15 @@ Image Symbol Table
i.__scatterload_zeroinit 0x010004d4 Section 14 handlers.o(i.__scatterload_zeroinit)
i.__set_PRIMASK 0x010004e2 Section 0 system_n32wb03x.o(i.__set_PRIMASK)
__set_PRIMASK 0x010004e3 Thumb Code 6 system_n32wb03x.o(i.__set_PRIMASK)
i.bank_crc_ok 0x010004e8 Section 0 main.o(i.bank_crc_ok)
bank_crc_ok 0x010004e9 Thumb Code 48 main.o(i.bank_crc_ok)
i.bank_vector_ok 0x01000518 Section 0 main.o(i.bank_vector_ok)
bank_vector_ok 0x01000519 Thumb Code 46 main.o(i.bank_vector_ok)
i.caiic_crc32 0x01000548 Section 0 boot_crc32.o(i.caiic_crc32)
i.jump_to_app 0x0100058c Section 0 main.o(i.jump_to_app)
jump_to_app 0x0100058d Thumb Code 30 main.o(i.jump_to_app)
i.main 0x010005b0 Section 0 main.o(i.main)
i.read_flash_ID 0x01000660 Section 0 system_n32wb03x.o(i.read_flash_ID)
read_flash_ID 0x01000661 Thumb Code 62 system_n32wb03x.o(i.read_flash_ID)
.constdata 0x010006a4 Section 472 system_n32wb03x.o(.constdata)
i.bank_vector_ok 0x010004e8 Section 0 main.o(i.bank_vector_ok)
bank_vector_ok 0x010004e9 Thumb Code 46 main.o(i.bank_vector_ok)
i.caiic_crc32 0x01000518 Section 0 boot_crc32.o(i.caiic_crc32)
i.jump_to_app 0x0100055c Section 0 main.o(i.jump_to_app)
jump_to_app 0x0100055d Thumb Code 30 main.o(i.jump_to_app)
i.main 0x01000580 Section 0 main.o(i.main)
i.read_flash_ID 0x010005c4 Section 0 system_n32wb03x.o(i.read_flash_ID)
read_flash_ID 0x010005c5 Thumb Code 62 system_n32wb03x.o(i.read_flash_ID)
.constdata 0x01000608 Section 472 system_n32wb03x.o(.constdata)
.bss 0x20000000 Section 52 system_n32wb03x.o(.bss)
STACK 0x20000038 Section 2048 startup_n32wb03x.o(STACK)
@ -227,12 +223,12 @@ Image Symbol Table
__scatterload_copy 0x010004c5 Thumb Code 14 handlers.o(i.__scatterload_copy)
__scatterload_null 0x010004d3 Thumb Code 2 handlers.o(i.__scatterload_null)
__scatterload_zeroinit 0x010004d5 Thumb Code 14 handlers.o(i.__scatterload_zeroinit)
caiic_crc32 0x01000549 Thumb Code 62 boot_crc32.o(i.caiic_crc32)
main 0x010005b1 Thumb Code 162 main.o(i.main)
TRIM_READ_CMD_CODE 0x010006a4 Data 320 system_n32wb03x.o(.constdata)
CMD_RDID 0x010007e4 Data 152 system_n32wb03x.o(.constdata)
Region$$Table$$Base 0x0100087c Number 0 anon$$obj.o(Region$$Table)
Region$$Table$$Limit 0x0100088c Number 0 anon$$obj.o(Region$$Table)
caiic_crc32 0x01000519 Thumb Code 62 boot_crc32.o(i.caiic_crc32)
main 0x01000581 Thumb Code 56 main.o(i.main)
TRIM_READ_CMD_CODE 0x01000608 Data 320 system_n32wb03x.o(.constdata)
CMD_RDID 0x01000748 Data 152 system_n32wb03x.o(.constdata)
Region$$Table$$Base 0x010007e0 Number 0 anon$$obj.o(Region$$Table)
Region$$Table$$Limit 0x010007f0 Number 0 anon$$obj.o(Region$$Table)
trim_stored 0x20000000 Data 52 system_n32wb03x.o(.bss)
__initial_sp 0x20000838 Data 0 startup_n32wb03x.o(STACK)
@ -244,54 +240,53 @@ Memory Map of the image
Image Entry point : 0x010000c1
Load Region LR_IROM1 (Base: 0x01000000, Size: 0x0000088c, Max: 0x00004000, ABSOLUTE)
Load Region LR_IROM1 (Base: 0x01000000, Size: 0x000007f0, Max: 0x00004000, ABSOLUTE)
Execution Region ER_IROM1 (Exec base: 0x01000000, Load base: 0x01000000, Size: 0x0000088c, Max: 0x00004000, ABSOLUTE)
Execution Region ER_IROM1 (Exec base: 0x01000000, Load base: 0x01000000, Size: 0x000007f0, Max: 0x00004000, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x01000000 0x01000000 0x000000c0 Data RO 3 RESET startup_n32wb03x.o
0x010000c0 0x010000c0 0x00000000 Code RO 232 * .ARM.Collect$$$$00000000 mc_p.l(entry.o)
0x010000c0 0x010000c0 0x00000004 Code RO 243 .ARM.Collect$$$$00000001 mc_p.l(entry2.o)
0x010000c4 0x010000c4 0x00000004 Code RO 246 .ARM.Collect$$$$00000004 mc_p.l(entry5.o)
0x010000c8 0x010000c8 0x00000000 Code RO 248 .ARM.Collect$$$$00000008 mc_p.l(entry7b.o)
0x010000c8 0x010000c8 0x00000000 Code RO 250 .ARM.Collect$$$$0000000A mc_p.l(entry8b.o)
0x010000c8 0x010000c8 0x00000008 Code RO 251 .ARM.Collect$$$$0000000B mc_p.l(entry9a.o)
0x010000d0 0x010000d0 0x00000000 Code RO 253 .ARM.Collect$$$$0000000D mc_p.l(entry10a.o)
0x010000d0 0x010000d0 0x00000000 Code RO 255 .ARM.Collect$$$$0000000F mc_p.l(entry11a.o)
0x010000d0 0x010000d0 0x00000004 Code RO 244 .ARM.Collect$$$$00002712 mc_p.l(entry2.o)
0x010000c0 0x010000c0 0x00000000 Code RO 227 * .ARM.Collect$$$$00000000 mc_p.l(entry.o)
0x010000c0 0x010000c0 0x00000004 Code RO 238 .ARM.Collect$$$$00000001 mc_p.l(entry2.o)
0x010000c4 0x010000c4 0x00000004 Code RO 241 .ARM.Collect$$$$00000004 mc_p.l(entry5.o)
0x010000c8 0x010000c8 0x00000000 Code RO 243 .ARM.Collect$$$$00000008 mc_p.l(entry7b.o)
0x010000c8 0x010000c8 0x00000000 Code RO 245 .ARM.Collect$$$$0000000A mc_p.l(entry8b.o)
0x010000c8 0x010000c8 0x00000008 Code RO 246 .ARM.Collect$$$$0000000B mc_p.l(entry9a.o)
0x010000d0 0x010000d0 0x00000000 Code RO 248 .ARM.Collect$$$$0000000D mc_p.l(entry10a.o)
0x010000d0 0x010000d0 0x00000000 Code RO 250 .ARM.Collect$$$$0000000F mc_p.l(entry11a.o)
0x010000d0 0x010000d0 0x00000004 Code RO 239 .ARM.Collect$$$$00002712 mc_p.l(entry2.o)
0x010000d4 0x010000d4 0x0000000e Code RO 10 .emb_text system_n32wb03x.o
0x010000e2 0x010000e2 0x00000002 PAD
0x010000e4 0x010000e4 0x0000001c Code RO 4 .text startup_n32wb03x.o
0x01000100 0x01000100 0x0000002c Code RO 235 .text mc_p.l(uidiv.o)
0x0100012c 0x0100012c 0x00000024 Code RO 237 .text mc_p.l(memcpya.o)
0x01000150 0x01000150 0x00000024 Code RO 239 .text mc_p.l(memseta.o)
0x01000174 0x01000174 0x00000024 Code RO 257 .text mc_p.l(init.o)
0x01000100 0x01000100 0x0000002c Code RO 230 .text mc_p.l(uidiv.o)
0x0100012c 0x0100012c 0x00000024 Code RO 232 .text mc_p.l(memcpya.o)
0x01000150 0x01000150 0x00000024 Code RO 234 .text mc_p.l(memseta.o)
0x01000174 0x01000174 0x00000024 Code RO 252 .text mc_p.l(init.o)
0x01000198 0x01000198 0x000000cc Code RO 11 i.OTPTrim_Read system_n32wb03x.o
0x01000264 0x01000264 0x00000130 Code RO 12 i.RCC_HsiCalib system_n32wb03x.o
0x01000394 0x01000394 0x0000011c Code RO 16 i.SystemInit system_n32wb03x.o
0x010004b0 0x010004b0 0x00000014 Code RO 18 i.SystemTrimValueRead system_n32wb03x.o
0x010004c4 0x010004c4 0x0000000e Code RO 261 i.__scatterload_copy mc_p.l(handlers.o)
0x010004d2 0x010004d2 0x00000002 Code RO 262 i.__scatterload_null mc_p.l(handlers.o)
0x010004d4 0x010004d4 0x0000000e Code RO 263 i.__scatterload_zeroinit mc_p.l(handlers.o)
0x010004c4 0x010004c4 0x0000000e Code RO 256 i.__scatterload_copy mc_p.l(handlers.o)
0x010004d2 0x010004d2 0x00000002 Code RO 257 i.__scatterload_null mc_p.l(handlers.o)
0x010004d4 0x010004d4 0x0000000e Code RO 258 i.__scatterload_zeroinit mc_p.l(handlers.o)
0x010004e2 0x010004e2 0x00000006 Code RO 19 i.__set_PRIMASK system_n32wb03x.o
0x010004e8 0x010004e8 0x00000030 Code RO 174 i.bank_crc_ok main.o
0x01000518 0x01000518 0x0000002e Code RO 175 i.bank_vector_ok main.o
0x01000546 0x01000546 0x00000002 PAD
0x01000548 0x01000548 0x00000044 Code RO 220 i.caiic_crc32 boot_crc32.o
0x0100058c 0x0100058c 0x00000024 Code RO 176 i.jump_to_app main.o
0x010005b0 0x010005b0 0x000000b0 Code RO 177 i.main main.o
0x01000660 0x01000660 0x00000044 Code RO 20 i.read_flash_ID system_n32wb03x.o
0x010006a4 0x010006a4 0x000001d8 Data RO 23 .constdata system_n32wb03x.o
0x0100087c 0x0100087c 0x00000010 Data RO 259 Region$$Table anon$$obj.o
0x010004e8 0x010004e8 0x0000002e Code RO 174 i.bank_vector_ok main.o
0x01000516 0x01000516 0x00000002 PAD
0x01000518 0x01000518 0x00000044 Code RO 215 i.caiic_crc32 boot_crc32.o
0x0100055c 0x0100055c 0x00000024 Code RO 175 i.jump_to_app main.o
0x01000580 0x01000580 0x00000044 Code RO 176 i.main main.o
0x010005c4 0x010005c4 0x00000044 Code RO 20 i.read_flash_ID system_n32wb03x.o
0x01000608 0x01000608 0x000001d8 Data RO 23 .constdata system_n32wb03x.o
0x010007e0 0x010007e0 0x00000010 Data RO 254 Region$$Table anon$$obj.o
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x0100088c, Size: 0x00000838, Max: 0x0000c000, ABSOLUTE)
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x010007f0, Size: 0x00000838, Max: 0x0000c000, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x20000000 - 0x00000034 Zero RW 22 .bss system_n32wb03x.o
0x20000034 0x0100088c 0x00000004 PAD
0x20000034 0x010007f0 0x00000004 PAD
0x20000038 - 0x00000800 Zero RW 1 STACK startup_n32wb03x.o
@ -303,12 +298,12 @@ Image component sizes
Code (inc. data) RO Data RW Data ZI Data Debug Object Name
68 6 0 0 0 874 boot_crc32.o
306 20 0 0 0 4735 main.o
150 18 0 0 0 4115 main.o
28 8 192 0 2048 744 startup_n32wb03x.o
900 60 472 0 52 95112 system_n32wb03x.o
----------------------------------------------------------------------
1306 94 680 0 2104 101465 Object Totals
1150 92 680 0 2104 100845 Object Totals
0 0 16 0 0 0 (incl. Generated)
4 0 0 0 4 0 (incl. Padding)
@ -350,15 +345,15 @@ Image component sizes
Code (inc. data) RO Data RW Data ZI Data Debug
1508 110 680 0 2104 101337 Grand Totals
1508 110 680 0 2104 101337 ELF Image Totals
1508 110 680 0 0 0 ROM Totals
1352 108 680 0 2104 100761 Grand Totals
1352 108 680 0 2104 100761 ELF Image Totals
1352 108 680 0 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 2188 ( 2.14kB)
Total RO Size (Code + RO Data) 2032 ( 1.98kB)
Total RW Size (RW Data + ZI Data) 2104 ( 2.05kB)
Total ROM Size (Code + RO Data + RW Data) 2188 ( 2.14kB)
Total ROM Size (Code + RO Data + RW Data) 2032 ( 1.98kB)
==============================================================================

Binary file not shown.

View File

@ -17,7 +17,7 @@ Library Manager: ArmAr.exe V5.06 update 6 (build 750)
Hex Converter: FromElf.exe V5.06 update 6 (build 750)
CPU DLL: SARMCM3.DLL V5.31.0.0
Dialog DLL: DARMCM1.DLL V1.19.3.0
Target DLL: UL2CM3.DLL V1.163.4.0
Target DLL: CMSIS_AGDI.dll V1.32.6.0
Dialog DLL: TARMCM1.DLL V1.14.2.0
<h2>Project:</h2>
@ -27,6 +27,10 @@ Project File Date: 09/02/2026
<h2>Output:</h2>
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Keil_v5\ARM\ARMCC\Bin'
Build target 'caiic_boot'
compiling main.c...
linking...
Program Size: Code=1352 RO-data=680 RW-data=0 ZI-data=2104
FromELF: creating hex file...
After Build - User command #1: fromelf --bin --output=.\bin\caiic_boot.bin .\Objects\caiic_boot.axf
".\Objects\caiic_boot.axf" - 0 Error(s), 0 Warning(s).
@ -41,7 +45,7 @@ Package Vendor: Nationstech
D:\Keil_v5\Arm\Packs\Nationstech\N32WB03X_DFP\1.4.0\firmware\CMSIS\device
<h2>Collection of Component Files used:</h2>
Build Time Elapsed: 00:00:01
Build Time Elapsed: 00:00:00
</pre>
</body>
</html>

View File

@ -11,7 +11,7 @@
:10009000F7000001F7000001F7000001F700000180
:1000A000F7000001F7000001F7000001F700000170
:1000B000F7000001F7000001F7000001F700000160
:1000C0000348854600F056F800480047B105000196
:1000C0000348854600F056F80048004781050001C6
:1000D0003808002040BA7047C0BA70470138FDD1D7
:1000E000704700000448804704480047FEE7FEE7E9
:1000F000FEE7FEE7FEE7FEE795030001C100000111
@ -24,10 +24,10 @@
:10016000F6E710B513460A4604461946FFF7F0FFB6
:10017000204610BD064C0125064E05E0E36807CC7D
:100180002B430C3C98471034B442F7D3FFF79CFF45
:100190007C0800018C080001F7B5D4B004460E4677
:10019000E0070001F0070001F7B5D4B004460E46B1
:1001A00000205390052052900025002700BFEFF358
:1001B00010800090FF21453101A8FFF7D0FF00F02B
:1001C0004FFA05462448854218D101200003844295
:1001C00001FA05462448854218D1012000038442E3
:1001D00002D1002053902AE001204003844202D142
:1001E0004011539023E003200003844203D10120F7
:1001F000400253901BE0529857B0F0BD174885421B
@ -37,7 +37,7 @@
:100230000137FF2241320A4901A8FFF777FF012069
:1002400000F04FF93146569A5398B84752900098AB
:1002500000F047F95298CFE7C440130085601300BF
:10026000A4060001F1B58AB0002009907D20C000ED
:1002600008060001F1B58AB0002009907D20C00089
:1002700008900125AD020027002007907F200690FE
:1002800040240026002005900390200102900020C9
:1002900001903E490A98884206D83D4800686102AC
@ -77,64 +77,54 @@
:1004B00070B504460D462A46214601200003FFF789
:1004C0006BFE70BD02E008C8121F08C1002AFAD1F5
:1004D00070477047002001E001C1121F002AFBD1C4
:1004E000704780F31088704770B504460D46206849
:1004F000002804D00721C9032068884201D90020C0
:1005000070BD2846216800F01FF86168884201D15B
:100510000120F5E70020F3E710B501460B684868B5
:1005200042085200180C000401246407A04208D1BC
:100530008A4206D30720C0030818824201D2012054
:1005400010BD0020FCE7000030B502460B4600213C
:10055000C94312E01078521C414000240BE04808C7
:10056000CD07ED0F002D01D0074D00E000256840BC
:100570000146601CC4B2082CF1DB18465B1E002843
:10058000E8D1C84330BD00002083B8ED044672B600
:100590000120C007204305490863206880F30888CC
:1005A00000BF6068804700BFFEE7000000700040A9
:1005B000284C002528492068884234D12021204633
:1005C000FFF7C2FF216A88422DD16068012808D157
:1005D000224920460830FFF787FF002801D01F4D31
:1005E00030E0606802280AD1412189042046143095
:1005F000FFF77AFF002802D04125AD0422E0174919
:1006000020460830FFF770FF002801D0134D19E095
:100610004121890420461430FFF766FF002811D0DD
:100620004125AD040EE00D48FFF776FF002801D00C
:100630000A4D07E041208004FFF76EFF002801D03B
:100640004125AD04002D02D02846FFF79FFF00BFD3
:10065000FEE700000040000111C011CA0080000147
:1006600070B5D2B00024002500BFEFF3108006461D
:10067000FF21453101A8FFF772FD01AC013498223A
:10068000074901A8FFF752FD0120FFF72AFFA04705
:1006900005463046FFF725FF284652B070BD0000E2
:1006A000E407000140BA7047C0BA70470138FDD175
:1006B00070470000F7B50325AD06286A82B01646DC
:1006C0000C46400840002862286A0221084328623C
:1006D000286A8007FCD46620686001272F61A86A19
:1006E000C005FCD5992068602F61A86AC005FCD5BB
:1006F000FF209130FFF7DAFFFF230133AB6268463A
:10070000EF60352169602F61A96AC905FCD5AB622C
:10071000A969EF60C9B205226A602F61AA6AD20591
:10072000FCD5AB62AA690902D2B211430180C807A5
:1007300002D0032005B0F0BDAB626869FF2108312B
:10074000884368616869C91E0843686102980002AD
:10075000483068600820A860EE602F61A86AC00574
:10076000FCD5FF200130A8620023F61CB0080ED093
:10077000B2081148006899006054060A09194E70C1
:10078000060C000E8E705B1CC8709A42F1D8FF20D8
:100790000130A8626869FF2108318843686168698F
:1007A00038436861286A800880002862286A3843D4
:1007B0002862002005B0F0BD8000000C03208006F8
:1007C0004169FF22083291434161426901210A4394
:1007D0004261026A920892000262026A0A4302625D
:1007E00070470000002003218906096A4908490072
:1007F0000322920611621146096A02221143032262
:100800009206116200BF03218906096A0222114083
:100810000229F8D0D1010322920691620321D1600E
:100820009F2151600121116100BF03218906896A5E
:10083000FF22013211409142F7D1032292069162C8
:10084000114688694969FF220832914303229206C2
:1008500051611146496901221143032292065161F7
:100860001146096A8908890011621146096A012244
:100870001143032292061162704700008C080001A8
:0C0880000000002038080000D404000133
:1004E000704780F31088704710B501460B68486864
:1004F00042085200180C000401246407A04208D1ED
:100500008A4206D30720C0030818824201D2012084
:1005100010BD0020FCE7000030B502460B4600216C
:10052000C94312E01078521C414000240BE04808F7
:10053000CD07ED0F002D01D0074D00E000256840EC
:100540000146601CC4B2082CF1DB18465B1E002873
:10055000E8D1C84330BD00002083B8ED044672B630
:100560000120C007204305490863206880F30888FC
:1005700000BF6068804700BFFEE7000000700040D9
:100580000D4C0E4D0E49206888420BD1202120468B
:10059000FFF7C2FF216A884204D16068022801D1B6
:1005A0004125AD042846FFF79FFF002802D02846CA
:1005B000FFF7D4FF00BFFEE700400001008000010C
:1005C00011C011CA70B5D2B00024002500BFEFF3EE
:1005D00010800646FF21453101A8FFF7C0FD01ACA0
:1005E00001349822074901A8FFF7A0FD0120FFF779
:1005F00078FFA04705463046FFF773FF284652B004
:1006000070BD00004807000140BA7047C0BA70478B
:100610000138FDD170470000F7B50325AD06286A03
:1006200082B016460C46400840002862286A022123
:1006300008432862286A8007FCD466206860012786
:100640002F61A86AC005FCD5992068602F61A86A4F
:10065000C005FCD5FF209130FFF7DAFFFF230133FF
:10066000AB626846EF60352169602F61A96AC905F0
:10067000FCD5AB62A969EF60C9B205226A602F613F
:10068000AA6AD205FCD5AB62AA690902D2B21143AB
:100690000180C80702D0032005B0F0BDAB626869D5
:1006A000FF210831884368616869C91E0843686191
:1006B00002980002483068600820A860EE602F6150
:1006C000A86AC005FCD5FF200130A8620023F61CF3
:1006D000B0080ED0B2081148006899006054060AAC
:1006E00009194E70060C000E8E705B1CC8709A4281
:1006F000F1D8FF200130A8626869FF2108318843E2
:100700006861686938436861286A800880002862E7
:10071000286A38432862002005B0F0BD8000000C34
:10072000032080064169FF220832914341614269FA
:1007300001210A434261026A920892000262026A3F
:100740000A43026270470000002003218906096AFB
:10075000490849000322920611621146096A0222E1
:10076000114303229206116200BF03218906096A20
:10077000022211400229F8D0D1010322920691628F
:100780000321D1609F2151600121116100BF03212C
:100790008906896AFF22013211409142F7D1032272
:1007A00092069162114688694969FF220832914395
:1007B0000322920651611146496901221143032225
:1007C000920651611146096A890889001162114631
:1007D000096A012211430322920611627047000048
:1007E000F00700010000002038080000D4040001D8
:04000005010000C135
:00000001FF

View File

@ -3,7 +3,7 @@
<title>Static Call Graph - [.\Objects\caiic_boot.axf]</title></head>
<body><HR>
<H1>Static Call Graph for image .\Objects\caiic_boot.axf</H1><HR>
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Wed Sep 02 05:36:40 2026
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Wed Sep 02 08:07:05 2026
<BR><P>
<H3>Maximum Stack Usage = 736 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>
@ -72,7 +72,7 @@ Global Symbols
<P><STRONG><a name="[28]"></a>__main</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry.o(.ARM.Collect$$$$00000000))
<BR>[Address Reference Count : 1]<UL><LI> startup_n32wb03x.o(.text)
</UL>
<P><STRONG><a name="[3c]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
<P><STRONG><a name="[3b]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
<P><STRONG><a name="[29]"></a>_main_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
<BR><BR>[Calls]<UL><LI><a href="#[2a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
@ -82,19 +82,19 @@ Global Symbols
<BR><BR>[Called By]<UL><LI><a href="#[2a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
</UL>
<P><STRONG><a name="[3d]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
<P><STRONG><a name="[3c]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
<P><STRONG><a name="[3e]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
<P><STRONG><a name="[3d]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
<P><STRONG><a name="[3f]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
<P><STRONG><a name="[3e]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
<P><STRONG><a name="[40]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
<P><STRONG><a name="[3f]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
<P><STRONG><a name="[41]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
<P><STRONG><a name="[40]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
<P><STRONG><a name="[42]"></a>__asm___17_system_n32wb03x_c_f233b82c____REV16</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text), UNUSED)
<P><STRONG><a name="[41]"></a>__asm___17_system_n32wb03x_c_f233b82c____REV16</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text), UNUSED)
<P><STRONG><a name="[43]"></a>__asm___17_system_n32wb03x_c_f233b82c____REVSH</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text), UNUSED)
<P><STRONG><a name="[42]"></a>__asm___17_system_n32wb03x_c_f233b82c____REVSH</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text), UNUSED)
<P><STRONG><a name="[2b]"></a>system_delay_cycles</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text))
<BR><BR>[Calls]<UL><LI><a href="#[2b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;system_delay_cycles
@ -241,7 +241,7 @@ Global Symbols
<P><STRONG><a name="[6]"></a>WWDG_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_n32wb03x.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_n32wb03x.o(RESET)
</UL>
<P><STRONG><a name="[44]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
<P><STRONG><a name="[43]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
<P><STRONG><a name="[36]"></a>__aeabi_uidivmod</STRONG> (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = __aeabi_uidivmod
@ -254,18 +254,18 @@ Global Symbols
<LI><a href="#[32]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;read_flash_ID
</UL>
<P><STRONG><a name="[45]"></a>__aeabi_memcpy4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED)
<P><STRONG><a name="[44]"></a>__aeabi_memcpy4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED)
<P><STRONG><a name="[46]"></a>__aeabi_memcpy8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED)
<P><STRONG><a name="[45]"></a>__aeabi_memcpy8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED)
<P><STRONG><a name="[2d]"></a>__aeabi_memset</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[2e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_memset$wrapper
<LI><a href="#[2c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
</UL>
<P><STRONG><a name="[47]"></a>__aeabi_memset4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
<P><STRONG><a name="[46]"></a>__aeabi_memset4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
<P><STRONG><a name="[48]"></a>__aeabi_memset8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
<P><STRONG><a name="[47]"></a>__aeabi_memset8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
<P><STRONG><a name="[2c]"></a>__aeabi_memclr</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[2d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
@ -276,7 +276,7 @@ Global Symbols
<LI><a href="#[32]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;read_flash_ID
</UL>
<P><STRONG><a name="[49]"></a>__aeabi_memclr8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
<P><STRONG><a name="[48]"></a>__aeabi_memclr8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
<P><STRONG><a name="[2e]"></a>_memset$wrapper</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[2d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
@ -288,7 +288,7 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[29]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_main_scatterload
</UL>
<P><STRONG><a name="[4a]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
<P><STRONG><a name="[49]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
<P><STRONG><a name="[30]"></a>OTPTrim_Read</STRONG> (Thumb, 192 bytes, Stack size 368 bytes, system_n32wb03x.o(i.OTPTrim_Read))
<BR><BR>[Stack]<UL><LI>Max Depth = 712<LI>Call Chain = OTPTrim_Read &rArr; read_flash_ID
@ -317,26 +317,24 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[27]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemInit
</UL>
<P><STRONG><a name="[4b]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
<P><STRONG><a name="[4a]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
<P><STRONG><a name="[4c]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
<P><STRONG><a name="[4b]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
<P><STRONG><a name="[4d]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
<P><STRONG><a name="[4c]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
<P><STRONG><a name="[39]"></a>caiic_crc32</STRONG> (Thumb, 62 bytes, Stack size 12 bytes, boot_crc32.o(i.caiic_crc32))
<P><STRONG><a name="[38]"></a>caiic_crc32</STRONG> (Thumb, 62 bytes, Stack size 12 bytes, boot_crc32.o(i.caiic_crc32))
<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = caiic_crc32
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;bank_crc_ok
</UL>
<P><STRONG><a name="[26]"></a>main</STRONG> (Thumb, 162 bytes, Stack size 0 bytes, main.o(i.main))
<BR><BR>[Stack]<UL><LI>Max Depth = 28<LI>Call Chain = main &rArr; bank_crc_ok &rArr; caiic_crc32
<P><STRONG><a name="[26]"></a>main</STRONG> (Thumb, 56 bytes, Stack size 0 bytes, main.o(i.main))
<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = main &rArr; caiic_crc32
</UL>
<BR>[Calls]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;caiic_crc32
<LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;jump_to_app
<LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;bank_vector_ok
<LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;bank_crc_ok
<BR>[Calls]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;caiic_crc32
<LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;jump_to_app
<LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;bank_vector_ok
</UL>
<BR>[Address Reference Count : 1]<UL><LI> entry9a.o(.ARM.Collect$$$$0000000B)
</UL><P>
@ -367,21 +365,13 @@ Local Symbols
<BR>[Called By]<UL><LI><a href="#[30]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;OTPTrim_Read
</UL>
<P><STRONG><a name="[38]"></a>bank_crc_ok</STRONG> (Thumb, 48 bytes, Stack size 16 bytes, main.o(i.bank_crc_ok))
<BR><BR>[Stack]<UL><LI>Max Depth = 28<LI>Call Chain = bank_crc_ok &rArr; caiic_crc32
</UL>
<BR>[Calls]<UL><LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;caiic_crc32
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[3a]"></a>bank_vector_ok</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, main.o(i.bank_vector_ok))
<P><STRONG><a name="[39]"></a>bank_vector_ok</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, main.o(i.bank_vector_ok))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = bank_vector_ok
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[3b]"></a>jump_to_app</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, main.o(i.jump_to_app))
<P><STRONG><a name="[3a]"></a>jump_to_app</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, main.o(i.jump_to_app))
<BR><BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P>

View File

@ -30,7 +30,7 @@ I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc\n32wb03x_qflash.h)(0x68CD0B36)
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc\misc.h)(0x68CD0B30)
I (D:\Keil_v5\ARM\ARMCC\include\string.h)(0x5EC77604)
F (..\src\main.c)(0x6A96D51D)(--c99 -c --cpu Cortex-M0 -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\src -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\core -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\device -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc -ID:\Keil_v5\Arm\Packs\Nationstech\N32WB03X_DFP\1.4.0\firmware\CMSIS\device -ID:\Keil_v5\ARM\CMSIS\Include -D__UVISION_VERSION="531" -DN32WB03x -DUSE_STDPERIPH_DRIVER -DN32WB03X -DUSE_STDPERIPH_DRIVER -o .\objects\main.o --omf_browse .\objects\main.crf --depend .\objects\main.d)
F (..\src\main.c)(0x6A97688E)(--c99 -c --cpu Cortex-M0 -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\src -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\core -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\device -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc -ID:\Keil_v5\Arm\Packs\Nationstech\N32WB03X_DFP\1.4.0\firmware\CMSIS\device -ID:\Keil_v5\ARM\CMSIS\Include -D__UVISION_VERSION="531" -DN32WB03x -DUSE_STDPERIPH_DRIVER -DN32WB03X -DUSE_STDPERIPH_DRIVER -o .\objects\main.o --omf_browse .\objects\main.crf --depend .\objects\main.d)
I (D:\Keil_v5\ARM\ARMCC\include\stddef.h)(0x5EC775FC)
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\device\n32wb03x.h)(0x68CD0B30)
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\core\core_cm0.h)(0x5FA56A96)
@ -59,7 +59,7 @@ I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc\n32wb03x_keyscan.h)(0x68CD0B36)
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc\n32wb03x_qflash.h)(0x68CD0B36)
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc\misc.h)(0x68CD0B30)
I (..\src\dfu_layout.h)(0x6A96D505)
I (..\src\dfu_layout.h)(0x6A9768A2)
I (..\src\boot_crc32.h)(0x6A96D505)
F (..\src\boot_crc32.c)(0x6A96D5A0)(--c99 -c --cpu Cortex-M0 -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\src -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\core -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\device -I ..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc -ID:\Keil_v5\Arm\Packs\Nationstech\N32WB03X_DFP\1.4.0\firmware\CMSIS\device -ID:\Keil_v5\ARM\CMSIS\Include -D__UVISION_VERSION="531" -DN32WB03x -DUSE_STDPERIPH_DRIVER -DN32WB03X -DUSE_STDPERIPH_DRIVER -o .\objects\boot_crc32.o --omf_browse .\objects\boot_crc32.crf --depend .\objects\boot_crc32.d)
I (..\src\boot_crc32.h)(0x6A96D505)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,9 @@
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Keil_v5\ARM\ARMCC\Bin'
Build target 'caiic_boot'
compiling main.c...
linking...
Program Size: Code=1352 RO-data=680 RW-data=0 ZI-data=2104
FromELF: creating hex file...
After Build - User command #1: fromelf --bin --output=.\bin\caiic_boot.bin .\Objects\caiic_boot.axf
".\Objects\caiic_boot.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01
Build Time Elapsed: 00:00:00

View File

@ -42,7 +42,7 @@ extern "C" {
typedef struct
{
uint32_t size; /* image size in bytes */
uint32_t crc32; /* IEEE CRC32 of the whole image */
uint32_t crc32; /* IEEE CRC32 of the whole image (verified at OTA time) */
uint32_t version; /* e.g. 0x010001 = V1.00.01 */
} caiic_bank_t;

View File

@ -1,10 +1,16 @@
/**
* @file main.c
* @brief CAIIC minimal bootloader: bootsetting arbitration, image CRC32
* @brief CAIIC minimal bootloader: bootsetting arbitration, vector sanity
* check, vector remap and jump to the active application bank.
*
* No interrupts, no peripherals: flash is read through the memory map only.
* If nothing valid is found the CPU stays here forever (recover via SWD).
*
* Policy: the application image CRC is verified during the OTA process
* (app_ota.c) BEFORE bootsetting is switched - boot itself never validates
* image contents, it only trusts the bootsetting sector integrity
* (magic + own CRC32) to pick the active bank, then jumps straight to it.
* If the chosen vector table looks dead the CPU stays here forever
* (recover via SWD).
*/
#include <stddef.h>
#include "n32wb03x.h"
@ -25,18 +31,6 @@ static int bank_vector_ok(uint32_t base)
(reset >= base) && (reset < base + CAIIC_APP_BANK_SIZE);
}
/**
* @brief Check a bank image against its bootsetting CRC32 record.
*/
static int bank_crc_ok(const caiic_bank_t* bank, uint32_t base)
{
if (bank->size == 0 || bank->size > CAIIC_APP_BANK_SIZE)
{
return 0;
}
return bank->crc32 == caiic_crc32((const uint8_t*)base, bank->size);
}
/**
* @brief Remap the vector table to the app and jump to it. Never returns.
*/
@ -60,44 +54,21 @@ static void jump_to_app(uint32_t base)
int main(void)
{
const caiic_bootsetting_t* bs = (const caiic_bootsetting_t*)CAIIC_BOOTSETTING_ADDR;
uint32_t target = 0;
uint32_t target = CAIIC_APP1_BASE; /* default bank */
/* Pick the active bank. Only the bootsetting sector integrity is
* checked (magic + its own CRC32); the app image itself is NOT
* verified here - it was already verified at OTA time before this
* record was written. */
if (bs->magic == CAIIC_BOOT_MAGIC &&
bs->crc32 == caiic_crc32((const uint8_t*)bs, offsetof(caiic_bootsetting_t, crc32)))
{
/* Bootsetting valid: jump to the active bank if its image checks out */
if (bs->active_bank == CAIIC_ACTIVE_BANK1 && bank_crc_ok(&bs->bank1, CAIIC_APP1_BASE))
{
target = CAIIC_APP1_BASE;
}
else if (bs->active_bank == CAIIC_ACTIVE_BANK2 && bank_crc_ok(&bs->bank2, CAIIC_APP2_BASE))
bs->crc32 == caiic_crc32((const uint8_t*)bs, offsetof(caiic_bootsetting_t, crc32)) &&
bs->active_bank == CAIIC_ACTIVE_BANK2)
{
target = CAIIC_APP2_BASE;
}
/* Active bank corrupted: fall back to any bank with a valid image */
else if (bank_crc_ok(&bs->bank1, CAIIC_APP1_BASE))
{
target = CAIIC_APP1_BASE;
}
else if (bank_crc_ok(&bs->bank2, CAIIC_APP2_BASE))
{
target = CAIIC_APP2_BASE;
}
}
else
{
/* Blank/invalid bootsetting (first flash): vector sanity check only */
if (bank_vector_ok(CAIIC_APP1_BASE))
{
target = CAIIC_APP1_BASE;
}
else if (bank_vector_ok(CAIIC_APP2_BASE))
{
target = CAIIC_APP2_BASE;
}
}
if (target != 0)
/* Last-resort sanity: never jump into a blank/garbage vector table */
if (bank_vector_ok(target))
{
jump_to_app(target);
}

Binary file not shown.

View File

@ -27,7 +27,8 @@ Project File Date: 09/01/2026
<h2>Output:</h2>
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Keil_v5\ARM\ARMCC\Bin'
Build target 'N32WB03X'
compiling main.c...
compiling app_ota.c...
compiling cli_core.c...
linking...
Program Size: Code=38080 RO-data=6932 RW-data=10600 ZI-data=33056
FromELF: creating hex file...
@ -45,7 +46,7 @@ Package Vendor: Nationstech
D:\Keil_v5\Arm\Packs\Nationstech\N32WB03X_DFP\1.4.0\firmware\CMSIS\device
<h2>Collection of Component Files used:</h2>
Build Time Elapsed: 00:00:01
Build Time Elapsed: 00:00:02
</pre>
</body>
</html>

View File

@ -3,7 +3,7 @@
<title>Static Call Graph - [.\Objects\embeddedSrc.axf]</title></head>
<body><HR>
<H1>Static Call Graph for image .\Objects\embeddedSrc.axf</H1><HR>
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Wed Sep 02 06:32:32 2026
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Wed Sep 02 08:07:08 2026
<BR><P>
<H3>Maximum Stack Usage = 840 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>

View File

@ -1970,7 +1970,7 @@ I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\n32wb03x_std_periph_driver\inc
I (..\app\bsp_led.h)(0x6A96BAAF)
I (..\app\app_tasks.h)(0x6A96C2F1)
I (..\app\app_ota.h)(0x6A96E4EB)
I (..\..\Boot\src\dfu_layout.h)(0x6A96D505)
I (..\..\Boot\src\dfu_layout.h)(0x6A9768A2)
I (D:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x5EC775FC)
I (D:\Keil_v5\ARM\ARMCC\include\string.h)(0x5EC77604)
I (D:\Keil_v5\ARM\ARMCC\include\stdarg.h)(0x5EC775FC)
@ -1989,7 +1989,7 @@ F (..\app\app_ota.c)(0x6A96E545)(--c99 -c --cpu Cortex-M0 -D__MICROLIB -g -O0 --
I (..\app\app_ota.h)(0x6A96E4EB)
I (D:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x5EC775FC)
I (..\app\ble\app_ble_proto.h)(0x6A96E490)
I (..\..\Boot\src\dfu_layout.h)(0x6A96D505)
I (..\..\Boot\src\dfu_layout.h)(0x6A9768A2)
I (..\..\Boot\src\boot_crc32.h)(0x6A96D505)
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\device\n32wb03x.h)(0x68CD0B30)
I (..\..\nations-tec\N32WB03x_SDK_V2.0.0\firmware\CMSIS\core\core_cm0.h)(0x5FA56A96)

View File

@ -1,9 +1,10 @@
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Keil_v5\ARM\ARMCC\Bin'
Build target 'N32WB03X'
compiling main.c...
compiling app_ota.c...
compiling cli_core.c...
linking...
Program Size: Code=38108 RO-data=6932 RW-data=10600 ZI-data=33056
Program Size: Code=38080 RO-data=6932 RW-data=10600 ZI-data=33056
FromELF: creating hex file...
After Build - User command #1: fromelf --bin --output=.\bin\embeddedSrc.bin .\Objects\embeddedSrc.axf
".\Objects\embeddedSrc.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01
Build Time Elapsed: 00:00:02

View File

@ -0,0 +1,19 @@
/* Keil debugger startup script for mcm-ddc-04 (APP1 @ 0x01008000).
*
* Why: Keil downloads only the APP1 image. The bootsetting record at
* 0x01004000 (written by tools/merge_image.py) still holds the CRC of the
* last packaged build, so after any Keil re-download the bootloader at
* 0x01000000 rejects the APP and spins forever -> debug never reaches main.
*
* Fix: skip the natural boot path, force SP/PC from the APP1 vector table.
* µVision executes this file after LOAD + RESET, then "Run to main()" does
* the rest. For standalone (no debugger) runs, flash tools/out/caiic_full.bin
* instead - it carries a bootsetting CRC that matches the APP image.
*/
FUNC void Setup(void)
{
SP = _RDWORD(0x01008000); /* APP1 initial MSP */
PC = _RDWORD(0x01008004); /* APP1 Reset_Handler */
}
Setup();

View File

@ -113,7 +113,7 @@
<tDllPa></tDllPa>
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
<tIfile>.\debug_app.ini</tIfile>
<pMon>BIN\CMSIS_AGDI.dll</pMon>
</DebugOpt>
<TargetDriverDllRegistry>

View File

@ -417,3 +417,42 @@ ISR 内不得调用 FreeRTOS FromISR API(本工程 BLE 事件均在 BLE 任务
(≈552B)+ 队列/互斥锁(≈370B)≈ 19.9KB,剩余仅 ~600B——未耗尽但余量偏小。
`configTOTAL_HEAP_SIZE` 由 20KB 调至 **22KB**(RW+ZI=43656B,主栈余量约 5.4KB)。
编译:0 Error / 0 Warning,`Code=37996 RO-data=6856 RW-data=10600 ZI-data=33056`。
---
日期:2026-09-02
## 19. Boot 跳转策略调整:校验移到升级过程,解决 Keil 下载无法调试
### 19.1 现象与根因
加了诊断代码重新编译后,Keil 下载/调试**能连上但全速跑永远到不了 main**。根因:
- Keil 下载只写 APP1 区(0x01000000 起的镜像由 Keil 的 FLM 按 axf 地址 0x01008000 写入),
**不会更新 bootsetting(0x01004000)里记录的 APP1 CRC32**——那是上次 `merge_image.py`
打整片包时算的。
- 复位链路:芯片 ROM → Boot → 校验 bootsetting → 校验 APP1 镜像 CRC → **不匹配,拒绝跳转**,
CPU 停在 Boot 的 `for(;;)`。Keil 的 "Run to main" 走的是自然启动,自然卡在 Boot。
- 所以任何一次 Keil 重新下载(不只是诊断代码)都会触发;引入 Boot 之前没有这层校验,故以前正常。
验证方法:调试状态 halt 看 PC,落在 0x01000000~0x01003FFF 即 Boot 空转。
### 19.2 调整内容
- **Boot(`Boot/src/main.c`)改为跳转时不校验镜像 CRC**:只检查 bootsetting 扇区自身完整性
(magic + 自身 CRC32)选出 active bank,再做向量表 sanity(MSP 在 SRAM、复位向量在 bank 内)
兜底后直接跳转;bootsetting 无效时默认 APP1。删除 `bank_crc_ok()` 及双 bank CRC 回退。
- **镜像 CRC 校验职责完全在升级过程**:`app_ota.c` OTA_END 已对新镜像整体 CRC32 比对,
通过才写 bootsetting 切 bank 复位——OTA 链路安全性不变。
- 新增 `MDK-ARM/debug_app.ini` 并挂到工程调试配置(uvoptx `<tIfile>`):调试器下载后强制
`SP/PC = APP1 向量表`,跳过 Boot 直进 APP。Boot 不校验后该脚本已非必需,保留为纯调试可选旁路。
- Boot 重建 0E0W(`Code=1352`,bin 2032B),`tools/make_package.bat` 重新出整片包
(caiic_full 79464B)。
### 19.3 影响与注意
- Keil 直接下载 APP 即可启动和调试,开发节奏恢复。
- 代价:OTA 流程之外的镜像损坏(如 Keil 下载中途断电)不再被 Boot 拦截——向量检查只能挡
全空/乱码。这是"简单"换来的取舍。
- **在板子上烧过其他 0x01000000 起步的程序(SDK 例程 / mcm-ddc-ble)会覆盖 Boot 和
bootsetting**,恢复方法:`tools\flash_package.bat tools\out\caiic_full.bin` 重烧整片包。

View File

@ -0,0 +1,84 @@
# mcm-ddc-ble 开发日志
独立 BLE 工程:从 0x01000000 直接起跑(无 bootloader、无 OTA),用于在单镜像环境下
验证 BLE 功能与后续功能开发。
---
日期:2026-09-02
## 1. 工程创建(基于 SDK rdtss 例程)
### 1.1 选型
以 `nations-tec/N32WB03x_SDK_V2.0.0/projects/n32wb03x_EVAL/ble/rdtss` 为蓝本:
BLE 原始数据透传服务(128-bit UUID,下行写 + 上行 notify),与 mcm-ddc-04 的自定义
GATT 透传服务(CLS)形态最接近,适合作为手机 APP 通信协议的载体。heart_rate 是标准
profile,不适合做数据通道。
### 1.2 移植方式
- 整目录复制 `src/`、`inc/`、`MDK-ARM/` 到 `mcm-ddc-ble/`,工程改名 `mcm-ddc-ble`,
输出 `bin/mcm-ddc-ble.bin`。
- uvprojx/uvoptx 中 268+11 处 SDK 相对路径由 `..\..\..\..\..\` 重定向为
`..\..\nations-tec\N32WB03x_SDK_V2.0.0\`(新工程深度不同);
另有 11+3 处 `..\..\..\dfu\common` 指向 SDK 的 `projects/n32wb03x_EVAL/dfu/common`。
`nations-tec/` 只读,未做任何修改。
- 只使用第一个 target `N32WB03x`(IROM 0x01000000/0x40000);`OTA_IMG_1`/`OTA_IMG_2`
两个 target 未适配(其 after-build 脚本会写 SDK 目录),不要构建。
### 1.3 引脚核对(重点:避开 SWD)
- SWD 调试管脚:SWCLK=PA4 / SWDIO=PA5,全工程无任何占用。
- LED1=PB0、LED2=PA6(与 mcm-ddc-04、STB 板一致)。
- USART1 透传通道:TX=PB6 / RX=PB7(AF4,115200 8N1),与我们板子一致。
- 日志 LPUART:TX=PB1(NS_LOG)。
- `app_usart.h` 里的 PIN_4/PIN_5 是被注释掉的 USART2 备选(PB4/PB5),无影响。
### 1.4 保 SWD:禁止睡眠
例程主循环会进 deep sleep,SWD 随之断开(readme 也提示需 RESET 时机烧录)。
在 `main.c` 主循环前调用 `ns_sleep_lock_acquire()` 永久锁睡眠,SWD 全程可调试;
代价是功耗偏高(仅调试阶段,后续做低功耗时再评估)。
### 1.5 构建
`UV4 -b mcm-ddc-ble.uvprojx -t "N32WB03x"`:0 Error / 0 Warning,
`Code=23340 RO-data=3352 RW-data=1876 ZI-data=6052`,bin 28224B。
---
日期:2026-09-02
## 2. 接入 FreeRTOS + 点灯任务
### 2.1 内容
- 内核:SDK 自带 FreeRTOS V9(`middlewares/Third_Party/FreeRTOS`),工程新增 FREERTOS 组:
`tasks/queue/list/timers.c` + `heap_4.c` + `port.c`(RVDS/ARM_CM0),只加进 `N32WB03x` target。
- `inc/FreeRTOSConfig.h`:从 mcm-ddc-04 移植,heap 缩为 **8KB**(本工程仅 3 个任务);
SVC/PendSV/SysTick 由 port 接管(宏映射),本工程无 `n32wb03x_it.c`,无重复定义问题。
- `main.c` 任务化:
- `ble_schedule_task`(512 字栈,优先级 2):`rwip_schedule()` + 1ms 延时,
替代裸机 while 循环(rwip 只允许单上下文运行)。
- `led_task`(128 字栈,优先级 1):LED1(PB0) 每 500ms 翻转做运行指示;
LED2(PA6) 仍由 app_ble.c 驱动作连接状态指示。
- 睡眠保持锁定(deep sleep 与 RTOS tick 冲突,且保 SWD)。
- 串口透传路径为事件驱动(`usart_forward_to_ble_loop` 由 profile 回调触发、
`app_usart_tx_process` 由 BLE 消息处理触发),rwip_schedule 进任务后行为不变。
### 2.2 踩坑记录
脚本往 uvprojx 写路径时 `\t` 被 Python 解释成制表符(`Source\tasks.c` → `Source<TAB>asks.c`),
Keil 报 `cannot create command input file 'source tasks.__i'`;另外 `<FileName>` 必须写纯文件名
(带路径会被 Keil 当成对象名,同样报此错)。修正后全量重建通过。
### 2.3 构建
0 Error / 0 Warning,`Code=24736 RO-data=3352 RW-data=1964 ZI-data=14484`;
bin ≈ 27.4KB,RAM(RW+ZI)≈ 16.1KB / 48KB(含 8KB FreeRTOS heap)。
### 2.4 上板预期
LED1 每 500ms 闪烁;手机可搜到并连接 `NS_RDTSS`,连接后 LED2 亮;
串口(PB6/PB7,115200)与手机 BLE 互发透传。

Binary file not shown.

File diff suppressed because it is too large Load Diff