From 5d5c1d827c33963bf5e8b0eb6c4d827a82eb7a4a Mon Sep 17 00:00:00 2001 From: "evan.liu" <583229071@qq.com> Date: Wed, 2 Sep 2026 08:22:53 +0800 Subject: [PATCH] =?UTF-8?q?Boot=E6=94=B9=E4=B8=BA=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E6=A0=A1=E9=AA=8C=E9=95=9C=E5=83=8FCRC(?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E7=A7=BB=E5=88=B0OTA=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E8=BF=87=E7=A8=8B),=E4=BF=AE=E5=A4=8DKeil=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=90=8E=E6=97=A0=E6=B3=95=E8=B0=83=E8=AF=95;=E6=96=B0?= =?UTF-8?q?=E5=A2=9Edebug=5Fapp.ini=E8=B0=83=E8=AF=95=E6=97=81=E8=B7=AF;?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=BC=80=E5=8F=91=E6=97=A5=E5=BF=97(?= =?UTF-8?q?=E7=AC=AC19=E8=8A=82)=E4=B8=8Emcm-ddc-ble=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 13 +- Boot/MDK-ARM/Listings/caiic_boot.map | 111 +- Boot/MDK-ARM/Objects/caiic_boot.axf | Bin 113944 -> 113156 bytes Boot/MDK-ARM/Objects/caiic_boot.build_log.htm | 8 +- Boot/MDK-ARM/Objects/caiic_boot.hex | 116 +- Boot/MDK-ARM/Objects/caiic_boot.htm | 64 +- .../MDK-ARM/Objects/caiic_boot_caiic_boot.dep | 4 +- Boot/MDK-ARM/Objects/main.crf | Bin 198853 -> 198611 bytes Boot/MDK-ARM/Objects/main.o | Bin 225188 -> 223616 bytes Boot/MDK-ARM/bin/caiic_boot.bin | Bin 2188 -> 2032 bytes Boot/MDK-ARM/build.log | 6 +- Boot/src/dfu_layout.h | 2 +- Boot/src/main.c | 65 +- mcm-ddc-04/MDK-ARM/Objects/app_ota.crf | Bin 236931 -> 236931 bytes mcm-ddc-04/MDK-ARM/Objects/app_ota.o | Bin 273048 -> 273048 bytes mcm-ddc-04/MDK-ARM/Objects/cli_core.crf | Bin 242295 -> 242295 bytes mcm-ddc-04/MDK-ARM/Objects/cli_core.o | Bin 283400 -> 283400 bytes mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.axf | Bin 1167008 -> 1167008 bytes .../MDK-ARM/Objects/embeddedSrc.build_log.htm | 5 +- mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.htm | 2 +- .../MDK-ARM/Objects/embeddedSrc_N32WB03X.dep | 4 +- mcm-ddc-04/MDK-ARM/build.log | 7 +- mcm-ddc-04/MDK-ARM/debug_app.ini | 19 + mcm-ddc-04/MDK-ARM/embeddedSrc.uvoptx | 2 +- mcm-ddc-04/docs/开发日志.md | 39 + mcm-ddc-ble/docs/开发日志.md | 84 + .../MDK-ARM/heart_rate.uvguix.Administrator | 18 +- tools/out/caiic_full.bin | Bin 79308 -> 79464 bytes tools/out/caiic_full.hex | 4764 ++++++++--------- 29 files changed, 2716 insertions(+), 2617 deletions(-) create mode 100644 mcm-ddc-04/MDK-ARM/debug_app.ini create mode 100644 mcm-ddc-ble/docs/开发日志.md diff --git a/AGENTS.md b/AGENTS.md index c0569ac..ceff56e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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 特征) ## 硬件引脚约束(重要) diff --git a/Boot/MDK-ARM/Listings/caiic_boot.map b/Boot/MDK-ARM/Listings/caiic_boot.map index bc2cecf..f89562e 100644 --- a/Boot/MDK-ARM/Listings/caiic_boot.map +++ b/Boot/MDK-ARM/Listings/caiic_boot.map @@ -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) ============================================================================== diff --git a/Boot/MDK-ARM/Objects/caiic_boot.axf b/Boot/MDK-ARM/Objects/caiic_boot.axf index fe6e020957e080caf5a230068931f8cb40e72c10..cb63cdee94b22ab9055bd870c54bd9534dc18760 100644 GIT binary patch delta 3713 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 LZR&rHW8D7%l8(-) diff --git a/Boot/MDK-ARM/Objects/caiic_boot.build_log.htm b/Boot/MDK-ARM/Objects/caiic_boot.build_log.htm index 2b4309d..0bc79f4 100644 --- a/Boot/MDK-ARM/Objects/caiic_boot.build_log.htm +++ b/Boot/MDK-ARM/Objects/caiic_boot.build_log.htm @@ -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

Project:

@@ -27,6 +27,10 @@ Project File Date: 09/02/2026

Output:

*** 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

Collection of Component Files used:

-Build Time Elapsed: 00:00:01 +Build Time Elapsed: 00:00:00 diff --git a/Boot/MDK-ARM/Objects/caiic_boot.hex b/Boot/MDK-ARM/Objects/caiic_boot.hex index d55b749..a4bf890 100644 --- a/Boot/MDK-ARM/Objects/caiic_boot.hex +++ b/Boot/MDK-ARM/Objects/caiic_boot.hex @@ -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 diff --git a/Boot/MDK-ARM/Objects/caiic_boot.htm b/Boot/MDK-ARM/Objects/caiic_boot.htm index 1261c0a..633a104 100644 --- a/Boot/MDK-ARM/Objects/caiic_boot.htm +++ b/Boot/MDK-ARM/Objects/caiic_boot.htm @@ -3,7 +3,7 @@ Static Call Graph - [.\Objects\caiic_boot.axf]

Static Call Graph for image .\Objects\caiic_boot.axf


-

#<CALLGRAPH># ARM Linker, 5060750: Last Updated: Wed Sep 02 05:36:40 2026 +

#<CALLGRAPH># ARM Linker, 5060750: Last Updated: Wed Sep 02 08:07:05 2026

Maximum Stack Usage = 736 bytes + Unknown(Cycles, Untraceable Function Pointers)

Call chain for Maximum Stack Depth:

@@ -72,7 +72,7 @@ Global Symbols

__main (Thumb, 0 bytes, Stack size unknown bytes, entry.o(.ARM.Collect$$$$00000000))
[Address Reference Count : 1]

  • startup_n32wb03x.o(.text)
-

_main_stk (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001)) +

_main_stk (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))

_main_scatterload (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))

[Calls]

  • >>   __scatterload @@ -82,19 +82,19 @@ Global Symbols

    [Called By]
    • >>   __scatterload
    -

    _main_clock (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008)) +

    _main_clock (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008)) -

    _main_cpp_init (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A)) +

    _main_cpp_init (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A)) -

    _main_init (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B)) +

    _main_init (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B)) -

    __rt_final_cpp (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D)) +

    __rt_final_cpp (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D)) -

    __rt_final_exit (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F)) +

    __rt_final_exit (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F)) -

    __asm___17_system_n32wb03x_c_f233b82c____REV16 (Thumb, 4 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text), UNUSED) +

    __asm___17_system_n32wb03x_c_f233b82c____REV16 (Thumb, 4 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text), UNUSED) -

    __asm___17_system_n32wb03x_c_f233b82c____REVSH (Thumb, 4 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text), UNUSED) +

    __asm___17_system_n32wb03x_c_f233b82c____REVSH (Thumb, 4 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text), UNUSED)

    system_delay_cycles (Thumb, 6 bytes, Stack size 0 bytes, system_n32wb03x.o(.emb_text))

    [Calls]

    • >>   system_delay_cycles @@ -241,7 +241,7 @@ Global Symbols

      WWDG_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_n32wb03x.o(.text))
      [Address Reference Count : 1]

      • startup_n32wb03x.o(RESET)
      -

      __aeabi_uidiv (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED) +

      __aeabi_uidiv (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)

      __aeabi_uidivmod (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text))

      [Stack]

      • Max Depth = 12
      • Call Chain = __aeabi_uidivmod @@ -254,18 +254,18 @@ Global Symbols
      • >>   read_flash_ID
      -

      __aeabi_memcpy4 (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED) +

      __aeabi_memcpy4 (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED) -

      __aeabi_memcpy8 (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED) +

      __aeabi_memcpy8 (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED)

      __aeabi_memset (Thumb, 14 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)

      [Called By]

      • >>   _memset$wrapper
      • >>   __aeabi_memclr
      -

      __aeabi_memset4 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) +

      __aeabi_memset4 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) -

      __aeabi_memset8 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) +

      __aeabi_memset8 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)

      __aeabi_memclr (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)

      [Calls]

      • >>   __aeabi_memset @@ -276,7 +276,7 @@ Global Symbols
      • >>   read_flash_ID
      -

      __aeabi_memclr8 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) +

      __aeabi_memclr8 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)

      _memset$wrapper (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED)

      [Calls]

      • >>   __aeabi_memset @@ -288,7 +288,7 @@ Global Symbols
        [Called By]
        • >>   _main_scatterload
        -

        __scatterload_rt2 (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED) +

        __scatterload_rt2 (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)

        OTPTrim_Read (Thumb, 192 bytes, Stack size 368 bytes, system_n32wb03x.o(i.OTPTrim_Read))

        [Stack]

        • Max Depth = 712
        • Call Chain = OTPTrim_Read ⇒ read_flash_ID @@ -317,26 +317,24 @@ Global Symbols
          [Called By]
          • >>   SystemInit
          -

          __scatterload_copy (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED) +

          __scatterload_copy (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED) -

          __scatterload_null (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED) +

          __scatterload_null (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED) -

          __scatterload_zeroinit (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED) +

          __scatterload_zeroinit (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED) -

          caiic_crc32 (Thumb, 62 bytes, Stack size 12 bytes, boot_crc32.o(i.caiic_crc32)) +

          caiic_crc32 (Thumb, 62 bytes, Stack size 12 bytes, boot_crc32.o(i.caiic_crc32))

          [Stack]

          • Max Depth = 12
          • Call Chain = caiic_crc32

          [Called By]
          • >>   main -
          • >>   bank_crc_ok
          -

          main (Thumb, 162 bytes, Stack size 0 bytes, main.o(i.main)) -

          [Stack]

          • Max Depth = 28
          • Call Chain = main ⇒ bank_crc_ok ⇒ caiic_crc32 +

            main (Thumb, 56 bytes, Stack size 0 bytes, main.o(i.main)) +

            [Stack]

            • Max Depth = 12
            • Call Chain = main ⇒ caiic_crc32
            -
            [Calls]
            • >>   caiic_crc32 -
            • >>   jump_to_app -
            • >>   bank_vector_ok -
            • >>   bank_crc_ok +
              [Calls]
              • >>   caiic_crc32 +
              • >>   jump_to_app +
              • >>   bank_vector_ok

              [Address Reference Count : 1]
              • entry9a.o(.ARM.Collect$$$$0000000B)

              @@ -367,21 +365,13 @@ Local Symbols
              [Called By]

              • >>   OTPTrim_Read
              -

              bank_crc_ok (Thumb, 48 bytes, Stack size 16 bytes, main.o(i.bank_crc_ok)) -

              [Stack]

              • Max Depth = 28
              • Call Chain = bank_crc_ok ⇒ caiic_crc32 -
              -
              [Calls]
              • >>   caiic_crc32 -
              -
              [Called By]
              • >>   main -
              - -

              bank_vector_ok (Thumb, 46 bytes, Stack size 8 bytes, main.o(i.bank_vector_ok)) +

              bank_vector_ok (Thumb, 46 bytes, Stack size 8 bytes, main.o(i.bank_vector_ok))

              [Stack]

              • Max Depth = 8
              • Call Chain = bank_vector_ok

              [Called By]
              • >>   main
              -

              jump_to_app (Thumb, 30 bytes, Stack size 0 bytes, main.o(i.jump_to_app)) +

              jump_to_app (Thumb, 30 bytes, Stack size 0 bytes, main.o(i.jump_to_app))

              [Called By]

              • >>   main

              diff --git a/Boot/MDK-ARM/Objects/caiic_boot_caiic_boot.dep b/Boot/MDK-ARM/Objects/caiic_boot_caiic_boot.dep index c9233a7..fe6b0f2 100644 --- a/Boot/MDK-ARM/Objects/caiic_boot_caiic_boot.dep +++ b/Boot/MDK-ARM/Objects/caiic_boot_caiic_boot.dep @@ -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) diff --git a/Boot/MDK-ARM/Objects/main.crf b/Boot/MDK-ARM/Objects/main.crf index 89c93fdd71ce9c63a61e7e782b6dc424e5490b8b..fa3f7e5f82f7f3a4b0f6848d071237bebcd28c1f 100644 GIT binary patch delta 786 zcmXw2T}TvB6h8OvwCc>b<_5L1tJjk#$JG8dU6lw|giNT{vLH4MDT2yueej_iknkmp z3Y)fhoqHEp&U`smwF@58`P?&eV=r4O%%hX-@UP|gr;&XDtF;hDa(J(=wJOlMCIq@4>f zxhb|8Vo)vsX31nV(|s=6+n>ooo3j*?$;1MMx-NpXQVjVz&(ansFWcFBsyhp3ov0-n zw6rZgxQ8scPx$nUGaQ!{KAUl83yeNz^oabWv3}fjI^-MS(-HUdF*!H2ztI-Ey)cZBve0C5i&PwSCJw0t=6gEa zCRKud4pkiFNR=X%*&@xs9a0Lh)fRE*MmSV4&}@q+ue?i&@HhMSNL3-W*uvlVKB*e~ z!DN(FEv_*cBefk@nLHr11HXF_ct~m|s(M?flr8Gn87Gy*&t3scklKUTEG{vBM5>Or z75zM6l2ko@Wb&BB6s~wCOp$6pOlz1HgaX3H`q2dwDQVxXl)gS-!ynVG3XIc`pe$<7WP3g3-d2D1t@8Ca$%_ PHi7M8a9QJj0LuRX-2Tk^ delta 994 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 delta 13675 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 he+o={tkbB1x7GN|MzqMC`MAS eaJ>KkNVA~^+W`>p2LJ&8001C32mk=o1ONdoyFvK? delta 366 zcmeys-y=BT4CBU$XAiU0a4<0Ta7>=YsKw|%`5@zb#wD8*ncA5Q3bwMi@wzEwFlew` zU{^fJtdP;+#CVfIppT2l*d~Ad!oV3SXZyD13fC`31|2dJP{2RSi#&Qj?1c ziVAN3zaRRqnAPE=dodw{QG?^6lBa?jhr$2v?f)4x7%#~C8aznIVA9~a=&0DqqTnV1 zl&J#BFkNs|UCW~MKpd*N0IXWrSMmWuT^dkK5Uh^x0k6mZ?`0r0^%uB&*&jG6G_d^t zo(I+hGKfK!>4FB(Df9m`?Em+ifq}t+fl=^);3{xYs%G?}5q?g`=r{bf}6|6S|<0(Vw71E5K&|25o#HWch-V0gmL!0526 f!2JLaGg@pGVmrqu&;txnpe+g(91ILsSQr=q@M?$o diff --git a/Boot/MDK-ARM/build.log b/Boot/MDK-ARM/build.log index 758d57b..2443ad9 100644 --- a/Boot/MDK-ARM/build.log +++ b/Boot/MDK-ARM/build.log @@ -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 diff --git a/Boot/src/dfu_layout.h b/Boot/src/dfu_layout.h index a81326c..c636dbe 100644 --- a/Boot/src/dfu_layout.h +++ b/Boot/src/dfu_layout.h @@ -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; diff --git a/Boot/src/main.c b/Boot/src/main.c index efed12e..00bf106 100644 --- a/Boot/src/main.c +++ b/Boot/src/main.c @@ -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 #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))) + bs->crc32 == caiic_crc32((const uint8_t*)bs, offsetof(caiic_bootsetting_t, crc32)) && + bs->active_bank == CAIIC_ACTIVE_BANK2) { - /* 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)) - { - 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; - } + 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); } diff --git a/mcm-ddc-04/MDK-ARM/Objects/app_ota.crf b/mcm-ddc-04/MDK-ARM/Objects/app_ota.crf index 65174e36b09ba05e02e988404e9f0a7aa0e734d0..5b73b405a827156248b16efdd487d132ecf73a79 100644 GIT binary patch delta 32 ncmZqP&DXq}Z^CA-MHla0VPgP-hmCt%_cFHbW!k!z`Pdu)?IsS5 delta 32 ncmZqP&DXq}Z^CA-)>XH!urUCEdgI>Ky^O7UnYQj_J~jsc+}jO} diff --git a/mcm-ddc-04/MDK-ARM/Objects/app_ota.o b/mcm-ddc-04/MDK-ARM/Objects/app_ota.o index 09075629bc1ab06e8f47fde3a278b2f4df9396a4..152db84ca76026c31e6f075098813174e401c316 100644 GIT binary patch delta 52 zcmbPnRba+dfepKr*e$FK%&iP8nhzfxfWf#dxebw2p%@S<8FV)%?QLy+uw0BcP;|}U3n1b delta 37 qcmezVgzx(kz70>fxms7j3xs`!MbEbNGraB`KGi}dQXFiF7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J)5-qLWz?EsT?= aAB+?{w*CHO!B8O<3u6l?|KBpfMd|>`SQ_B~ diff --git a/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.build_log.htm b/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.build_log.htm index eefaa7a..cab10cf 100644 --- a/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.build_log.htm +++ b/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.build_log.htm @@ -27,7 +27,8 @@ Project File Date: 09/01/2026

              Output:

              *** 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

              Collection of Component Files used:

              -Build Time Elapsed: 00:00:01 +Build Time Elapsed: 00:00:02 diff --git a/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.htm b/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.htm index 3d4c1a9..ec05610 100644 --- a/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.htm +++ b/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc.htm @@ -3,7 +3,7 @@ Static Call Graph - [.\Objects\embeddedSrc.axf]

              Static Call Graph for image .\Objects\embeddedSrc.axf


              -

              #<CALLGRAPH># ARM Linker, 5060750: Last Updated: Wed Sep 02 06:32:32 2026 +

              #<CALLGRAPH># ARM Linker, 5060750: Last Updated: Wed Sep 02 08:07:08 2026

              Maximum Stack Usage = 840 bytes + Unknown(Cycles, Untraceable Function Pointers)

              Call chain for Maximum Stack Depth:

              diff --git a/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc_N32WB03X.dep b/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc_N32WB03X.dep index 163d55e..87e129c 100644 --- a/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc_N32WB03X.dep +++ b/mcm-ddc-04/MDK-ARM/Objects/embeddedSrc_N32WB03X.dep @@ -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) diff --git a/mcm-ddc-04/MDK-ARM/build.log b/mcm-ddc-04/MDK-ARM/build.log index 80eb5c3..43c7661 100644 --- a/mcm-ddc-04/MDK-ARM/build.log +++ b/mcm-ddc-04/MDK-ARM/build.log @@ -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 diff --git a/mcm-ddc-04/MDK-ARM/debug_app.ini b/mcm-ddc-04/MDK-ARM/debug_app.ini new file mode 100644 index 0000000..632f687 --- /dev/null +++ b/mcm-ddc-04/MDK-ARM/debug_app.ini @@ -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(); diff --git a/mcm-ddc-04/MDK-ARM/embeddedSrc.uvoptx b/mcm-ddc-04/MDK-ARM/embeddedSrc.uvoptx index 84cb31a..350f1a5 100644 --- a/mcm-ddc-04/MDK-ARM/embeddedSrc.uvoptx +++ b/mcm-ddc-04/MDK-ARM/embeddedSrc.uvoptx @@ -113,7 +113,7 @@ - + .\debug_app.ini BIN\CMSIS_AGDI.dll diff --git a/mcm-ddc-04/docs/开发日志.md b/mcm-ddc-04/docs/开发日志.md index 7376cab..94d368c 100644 --- a/mcm-ddc-04/docs/开发日志.md +++ b/mcm-ddc-04/docs/开发日志.md @@ -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 ``):调试器下载后强制 + `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` 重烧整片包。 diff --git a/mcm-ddc-ble/docs/开发日志.md b/mcm-ddc-ble/docs/开发日志.md new file mode 100644 index 0000000..c0c4e62 --- /dev/null +++ b/mcm-ddc-ble/docs/开发日志.md @@ -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` → `Sourceasks.c`), +Keil 报 `cannot create command input file 'source tasks.__i'`;另外 `` 必须写纯文件名 +(带路径会被 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 互发透传。 diff --git a/nations-tec/N32WB03x_SDK_V2.0.0/projects/n32wb03x_EVAL/ble/heart_rate/MDK-ARM/heart_rate.uvguix.Administrator b/nations-tec/N32WB03x_SDK_V2.0.0/projects/n32wb03x_EVAL/ble/heart_rate/MDK-ARM/heart_rate.uvguix.Administrator index 0aa63e7..ab501d5 100644 --- a/nations-tec/N32WB03x_SDK_V2.0.0/projects/n32wb03x_EVAL/ble/heart_rate/MDK-ARM/heart_rate.uvguix.Administrator +++ b/nations-tec/N32WB03x_SDK_V2.0.0/projects/n32wb03x_EVAL/ble/heart_rate/MDK-ARM/heart_rate.uvguix.Administrator @@ -15,17 +15,17 @@ 38003 Registers - 225 121 + 155 156 346 Code Coverage - 562 1116 + 1090 160 204 Performance Analyzer - 722 187 187 582 + 1250 @@ -34,7 +34,7 @@ 35141 Event Statistics - 250 50 954 + 200 50 700 1506 @@ -93,8 +93,8 @@ 2 3 - -32000 - -32000 + -1 + -1 -1 @@ -1806,7 +1806,7 @@ File 2666 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000B6B655F6D656D5F696E6974960000000000000006000B6B655F6D656D5F696E69740A4B455F4D454D5F454E5614675F727769705F686561705F656E765F73697A65146E735F486172644661756C745F48616E646C65720C6170705F626C655F696E69740F4750494F5F50696E5F546F67676C65000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000B6B655F6D656D5F696E6974960000000000000006000B6B655F6D656D5F696E69740A4B455F4D454D5F454E5614675F727769705F686561705F656E765F73697A65146E735F486172644661756C745F48616E646C65720C6170705F626C655F696E69740F4750494F5F50696E5F546F67676C65000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 1423 @@ -1822,7 +1822,7 @@ Build 976 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000084E3332574230337896000000000000000100084E33325742303378000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000084E3332574230337896000000000000000100084E33325742303378000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 583 @@ -1838,7 +1838,7 @@ Debug 2373 - 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 898 diff --git a/tools/out/caiic_full.bin b/tools/out/caiic_full.bin index 60d16a32b5aad9e37425a9a5bf619223199989a3..37a19a66cf59d1bbf450a07a9c25e8df43992158 100644 GIT binary patch delta 7825 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 do<*=^f<i delta 7730 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