# N32WB031 基础工程开发日志 日期:2025-06-09 工程:`H:\caiic_workspace\mothercup\embeddedSrc` 目标芯片:N32WB031(国民技术 BLE SoC,Cortex-M0,64MHz,Flash 256KB,RAM 48KB) ## 1. 任务目标 基于 N32WB03x SDK V2.0.0 新建裸工程,实现: - UART 串口打印(printf 重定向) - 集成 FreeRTOS,构建实时多任务架构 - GPIO 点灯(LED 周期翻转) - 引脚分配不得与 SWD 调试管脚冲突 ## 2. 参考资料 | 资料 | 路径 | |---|---| | SDK V2.0.0 | `nations-tec/N32WB03x_SDK_V2.0.0` | | 器件包 | `nations-tec/N32WB03x_DFP.1.4.0.pack` | | 用户手册 | `nations-tec/CN_UM_N32WB03X_Series_User_Manual_V1.5.pdf` | | 硬件设计指南 | `nations-tec/CN_DG_N32WB03x_Series_Chips_Hardware_Design_Guide_V1.4.pdf` | | STB 开发板资料 | `nations-tec/N32WB031_STB_V1.3` | 参考例程: - 串口:`projects/n32wb03x_EVAL/peripheral/USART/Printf` - 点灯:`projects/n32wb03x_EVAL/peripheral/GPIO/LedBlink` - FreeRTOS:`projects/n32wb03x_EVAL/application/FreeRTOS/FreeRTOS_ThreadCreation` ## 3. 关键硬件结论 - **SWD 调试管脚:SWCLK=PA4,SWDIO=PA5**(复位后默认 AF0)——本工程所有 GPIO 分配均避开这两个脚 - STB 开发板板载 LED:LED1=PB0(跳线 J21)、LED2=PA6(跳线 J22),蓝色 LED,4.7K 限流 - 串口排针 J3 已引出 PB6/PB7 - 注意:PB8/PB9 默认接 32.768K 晶振;PB3 有下拉注意事项(手册 5.2.4) ## 4. 引脚分配表 | 功能 | 引脚 | 复用 | 说明 | |---|---|---|---| | USART1_TX | PB6 | AF4 | 115200 8N1 | | USART1_RX | PB7 | AF4 | | | LED1 | PB0 | GPIO 推挽输出 | 板载 D1 | | LED2 | PA6 | GPIO 推挽输出 | 板载 D2 | | SWDCLK | PA4 | AF0 | 调试占用,应用程序禁用 | | SWDIO | PA5 | AF0 | 调试占用,应用程序禁用 | ## 5. 工程结构 ``` embeddedSrc/ ├── app/ │ ├── main.c # 入口:时钟更新 → USART 初始化+banner → LED 初始化 → 建队列/任务 → vTaskStartScheduler │ ├── bsp_usart.c/.h # USART1 初始化 + fputc 重定向('\n' 前自动补 '\r') │ ├── bsp_led.c/.h # LED1/LED2 初始化、on/off/toggle │ ├── app_tasks.c/.h # 3 个 FreeRTOS 任务 + 日志队列 │ ├── n32wb03x_it.c/.h # NMI / HardFault 异常处理 │ └── FreeRTOSConfig.h # heap 8KB,SVC/PendSV/SysTick 映射给 FreeRTOS port ├── MDK-ARM/ │ ├── embeddedSrc.uvprojx │ └── embeddedSrc.uvoptx └── docs/ └── 开发日志.md(本文件) ``` SDK 源码(固件库、CMSIS、FreeRTOS V9.0.0、启动文件)以相对路径 `..\..\nations-tec\N32WB03x_SDK_V2.0.0` 引用,不复制到工程内。 工程配置:器件 N32WB031,IROM 0x01000000 / 0x40000,IRAM 0x20000000 / 0xC000,MicroLIB,宏定义 `N32WB03X, USE_STDPERIPH_DRIVER`。 ## 6. 实时多任务架构 使用 FreeRTOS 原生 API(xTaskCreate / vTaskDelay / xQueue),不用 cmsis_os 封装。 | 任务 | 功能 | 周期/触发 | 栈(字) | 优先级 | |---|---|---|---|---| | LedTask | 翻转 LED1,向日志队列发送 LogMsg_t | 500ms | 128 | 2 | | LedTask2 | 翻转 LED2,向日志队列发送 LogMsg_t | 1000ms | 128 | 2 | | PrintTask | xQueueReceive 阻塞取消息并 printf | 队列驱动 | 256 | 3 | 生产者-消费者模型:LED 任务只负责投递消息,打印任务独占串口输出,避免多任务直接 printf 造成的输出交错。 调度相关: - SysTick 由 FreeRTOS port 接管(FreeRTOSConfig.h 中 `xPortSysTickHandler → SysTick_Handler` 映射),main 中不再手动 `SysTick_Config` - `configTOTAL_HEAP_SIZE = 8*1024`(48KB RAM 余量充足) ## 7. 编译验证 - 工具链:Keil µVision5(`D:\Keil_v5\UV4\UV4.exe`,ARMCC V5.06 update 6) - 命令行:`UV4.exe -b embeddedSrc.uvprojx -j0 -o build.log`(工作目录 `embeddedSrc/MDK-ARM`) - 结果:**0 Error(s), 0 Warning(s)** - 体积:`Code=8248 RO-data=724 RW-data=100 ZI-data=10532` - 产物:`Objects/embeddedSrc.axf`、`Objects/embeddedSrc.hex`、`bin/embeddedSrc.bin` - 自查:全工程无 PA4/PA5 占用;SVC/PendSV/SysTick_Handler 无重复定义 ## 8. 烧录与运行 1. Keil 打开 `embeddedSrc/MDK-ARM/embeddedSrc.uvprojx`,F7 编译 2. NS-LINK 接 SWD(PA4/PA5),F8 下载 3. 串口助手接 PB6(TX)/PB7(RX),115200 8N1 4. 复位后预期输出:启动 banner + `LED1 toggled, count = N` / `LED2 toggled, count = N` 滚动日志 注意:未在真实硬件上运行验证。若 LED 不亮,检查 STB 板 J21/J22 跳线;若串口无输出,检查 J3 排针接线。 ## 9. 后续计划 - 板卡实测验证 LED 与串口日志 - 按需接入 BLE 协议栈(SDK ble 例程为裸机 rwip_schedule 调度,与 FreeRTOS 架构需做整合设计) --- 日期:2026-09-01 ## 10. UART DMA 发送 + 日志开关 + CLI 命令框架 ### 10.1 DMA 可行性结论 N32WB031 具备 DMA 外设(5 通道),固件库支持 `USART_EnableDMA` 与通道重映射 (`DMA_RequestRemap`),USART1_TX 可映射到 DMA_CH1(参考官方例程 `projects/n32wb03x_EVAL/peripheral/USART/DMA_Interrupt`)。**硬件支持,已实现 DMA 发送。** ### 10.2 串口驱动扩展(bsp_usart) - TX 双通道并存:`fputc` 轮询发送保留给调度器启动前的 banner 与 PrintTask; 新增 `bsp_usart_write_dma(buf, len)` 走 DMA_CH1(每次发送重新 `DMA_Init`,轮询 `DMA_FLAG_TC1` 完成标志 + 等 `USART_FLAG_TXC` 移位寄存器排空),供 CLI 输出使用。 - RX 新增 RXDNE 中断:`USART1_IRQHandler`(n32wb03x_it.c)→ `bsp_usart_rx_isr_handler()`, 字节经 `xQueueSendFromISR` 投递到 64 字节接收队列;应用侧用 `bsp_usart_read_byte(ch, timeout_ms)` 阻塞取字节。NVIC 优先级 = 3(最低,满足 `configMAX_SYSCALL_INTERRUPT_PRIORITY` 约束)。 - 新增 TX 互斥锁 `bsp_usart_tx_lock/unlock`:调度器未运行时为空操作; PrintTask 的整条 printf 与 CLI 的整段应答各持锁一次,避免 log 开启后两类输出字节级交错。 ### 10.3 主动打印开关 `app_tasks` 新增 `AppTasks_SetLogEnabled()/AppTasks_GetLogEnabled()`,**默认关闭**。 LED 任务照常翻转,仅在开关打开时才向日志队列投递消息。运行时通过 CLI `log on|off` 切换,`log` 无参数查询当前状态。 ### 10.4 CLI 框架(app_cli) - 独立任务 `CliTask`(栈 256 字,优先级 3),独占完成:行接收 → 解析 → 执行 → 应答, 应答全部走 DMA TX(`cli_write`/`cli_printf`,需显式带 `\r\n`)。 - 命令表 `CliCmd_t s_cmds[]`(name/help/handler),新增命令只需在表中加一项。 - 行结束符兼容 **`\r\n`、`\n\r`、`\r`、`\n`** 四种:首个 `\r` 或 `\n` 触发分发, 紧跟的互补字符被吞掉一次。支持退格(0x08/0x7F)编辑,行缓冲 64 字节,超长响铃。 - 内置命令:`help`、`version`、`log [on|off]`、`led <1|2> `。 - 提示符 `n32> `,空行仅重显提示符。 ### 10.5 编译验证 - `UV4.exe -b embeddedSrc.uvprojx -j0 -o build.log`:**0 Error(s), 0 Warning(s)** - 体积:`Code=14712 RO-data=944 RW-data=112 ZI-data=10696`(Flash/RAM 余量仍充足) - 新增源文件:`app/app_cli.c/.h`;uvprojx 的 FWLB 组加入 `n32wb03x_dma.c` - 烧录后预期:banner 之后出现 `CLI ready. Type 'help' for commands.` 与 `n32> ` 提示符; 默认无 LED 滚动日志,`log on` 后恢复。 - 注意:尚未上板实测,DMA 与中断路径需硬件验证。