mothercup/mcm-ddc-04/docs/开发日志.md
2026-09-01 20:06:25 +08:00

4.7 KiB
Raw Blame History

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 架构需做整合设计)