4. SDK 目录结构
本章按 Nsing.N32H49x_Library.1.2.0 的实际文件树说明各目录与文件的作用。文中路径均相对于 SDK 根目录。
4.1 顶层结构
- 📁 以
/结尾的为目录 - 📄 其余为文件
Nsing.N32H49x_Library.1.2.0/
├── .vscode/
│ ├── launch.json
│ ├── settings.json
│ └── tasks.json
├── firmware/
│ ├── CMSIS/
│ ├── n32h49x_algo_lib/
│ ├── n32h49x_std_periph_driver/
│ ├── n32h49x_usbfsd_driver/
│ └── n32h49x_usbhs_driver/
├── jlink/
│ └── flash.jlink
├── middlewares/
│ ├── fat_fs/
│ ├── FreeRTOSv202212.01/
│ └── lwip-2.2.0/
├── projects/
│ └── n32h49x_EVAL/
└── N32H49x Version History.txt
| 相对路径 | 作用 |
|---|---|
firmware/ |
固件库:CMSIS 内核与器件支持文件、标准外设驱动库、算法库与 USB 驱动 |
projects/n32h49x_EVAL/ |
评估板工程:板级支持、外设示例与应用工程 |
middlewares/ |
中间件源码:FatFs 文件系统、FreeRTOS 内核与 lwIP 协议栈 |
jlink/flash.jlink |
J-Link Commander 下载脚本,供 GCC 工程的 download 目标调用 |
.vscode/ |
VS Code 的 GDB 调试、构建任务与编辑器配置 |
N32H49x Version History.txt |
SDK 版本记录,逐版本列出新增与修正项 |
4.2 Firmware 固件库
📁 firmware/CMSIS
core/ 为 Arm CMSIS-Core 头文件,Cortex-M4F 工程使用其中的 core_cm4.h 与 arm_math.h;device/ 为 N32H49x 器件支持文件。
CMSIS/
├── core/
│ ├── arm_common_tables.h
│ ├── arm_const_structs.h
│ ├── arm_math.h
│ ├── cmsis_armcc.h
│ ├── cmsis_armclang.h
│ ├── cmsis_compiler.h
│ ├── cmsis_gcc.h
│ ├── cmsis_iccarm.h
│ ├── cmsis_version.h
│ ├── core_cm4.h
│ └── mpu_armv7.h
└── device/
├── startup/
│ ├── startup_n32h49x.s
│ ├── startup_n32h49x_EWARM.s
│ └── startup_n32h49x_gcc.s
├── n32h49x.h
├── n32h49x_conf.h
├── n32h49x_flash.ld
├── system_n32h49x.c
└── system_n32h49x.h
📁 firmware/n32h49x_std_periph_driver
标准外设驱动库:inc/ 存放驱动头文件,src/ 存放同名实现文件,每个驱动模块一对。
n32h49x_std_periph_driver/
├── inc/
│ ├── misc.h
│ ├── n32h49x_adc.h
│ ├── n32h49x_cordic.h
│ ├── n32h49x_crc.h
│ ├── n32h49x_dac.h
│ ├── n32h49x_dbg.h
│ ├── n32h49x_dma.h
│ ├── n32h49x_dsmu.h
│ ├── n32h49x_dvp.h
│ ├── n32h49x_eth.h
│ ├── n32h49x_exti.h
│ ├── n32h49x_fdcan.h
│ ├── n32h49x_femc.h
│ ├── n32h49x_flash.h
│ ├── n32h49x_gpio.h
│ ├── n32h49x_i2c.h
│ ├── n32h49x_iwdg.h
│ ├── n32h49x_lptim.h
│ ├── n32h49x_pwr.h
│ ├── n32h49x_rcc.h
│ ├── n32h49x_rtc.h
│ ├── n32h49x_sdio.h
│ ├── n32h49x_sdram.h
│ ├── n32h49x_spi.h
│ ├── n32h49x_tim.h
│ ├── n32h49x_usart.h
│ ├── n32h49x_vrefbuf.h
│ ├── n32h49x_wwdg.h
│ ├── n32h49x_xspi.h
│ └── n32h49x_xspi_v2.h
└── src/
├── misc.c
├── n32h49x_adc.c
├── n32h49x_cordic.c
├── n32h49x_crc.c
├── n32h49x_dac.c
├── n32h49x_dbg.c
├── n32h49x_dma.c
├── n32h49x_dsmu.c
├── n32h49x_dvp.c
├── n32h49x_eth.c
├── n32h49x_exti.c
├── n32h49x_fdcan.c
├── n32h49x_femc.c
├── n32h49x_flash.c
├── n32h49x_gpio.c
├── n32h49x_i2c.c
├── n32h49x_iwdg.c
├── n32h49x_lptim.c
├── n32h49x_pwr.c
├── n32h49x_rcc.c
├── n32h49x_rtc.c
├── n32h49x_sdio.c
├── n32h49x_sdram.c
├── n32h49x_spi.c
├── n32h49x_tim.c
├── n32h49x_usart.c
├── n32h49x_vrefbuf.c
├── n32h49x_wwdg.c
├── n32h49x_xspi.c
└── n32h49x_xspi_v2.c
📁 firmware/n32h49x_algo_lib
算法库,Keil 与 GCC 两套,头文件同名同接口,实现分别为 .lib 与 .a。
n32h49x_algo_lib/
├── gcc/
│ ├── inc/
│ │ ├── n32h49x_aes.h
│ │ ├── n32h49x_algo_common.h
│ │ ├── n32h49x_des.h
│ │ ├── n32h49x_hash.h
│ │ ├── n32h49x_rng.h
│ │ └── n32h49x_sm4.h
│ └── lib/
│ ├── AES.a
│ ├── Common.a
│ ├── DES.a
│ ├── HASH.a
│ ├── RNG.a
│ └── SM4.a
└── keil/
├── inc/
│ ├── n32h49x_aes.h
│ ├── n32h49x_algo_common.h
│ ├── n32h49x_des.h
│ ├── n32h49x_hash.h
│ ├── n32h49x_rng.h
│ └── n32h49x_sm4.h
└── lib/
├── n32h49x_aes.lib
├── n32h49x_common.lib
├── n32h49x_des.lib
├── n32h49x_hash.lib
├── n32h49x_rng.lib
└── n32h49x_sm4.lib
📁 firmware/n32h49x_usbfsd_driver
全速设备驱动,inc/ 9 个头文件、src/ 6 个实现文件。
n32h49x_usbfsd_driver/
├── inc/
│ ├── usbfsd_core.h
│ ├── usbfsd_def.h
│ ├── usbfsd_init.h
│ ├── usbfsd_int.h
│ ├── usbfsd_lib.h
│ ├── usbfsd_mem.h
│ ├── usbfsd_regs.h
│ ├── usbfsd_sil.h
│ └── usbfsd_type.h
└── src/
├── usbfsd_core.c
├── usbfsd_init.c
├── usbfsd_int.c
├── usbfsd_mem.c
├── usbfsd_regs.c
└── usbfsd_sil.c
📁 firmware/n32h49x_usbhs_driver
高速主机/设备驱动,按 driver/(控制器驱动)、device/(设备栈与设备类)与 host/(主机栈与主机类)三层组织。
n32h49x_usbhs_driver/
├── driver/
│ ├── inc/
│ └── src/
├── device/
│ ├── core/
│ └── class/
│ ├── audio/
│ ├── cdc/
│ ├── customhid/
│ ├── hid_cdc_composite/
│ ├── hid_keyboard/
│ ├── hid_msc_composite/
│ ├── mouse/
│ ├── msc/
│ └── msc_cdc_composite/
└── host/
├── core/
└── class/
├── CDC/
├── HID/
└── MSC/
| 相对路径 | 作用 |
|---|---|
firmware/CMSIS/device/n32h49x.h |
器件头文件:外设寄存器结构、基地址与中断号 |
firmware/CMSIS/device/system_n32h49x.c |
系统时钟初始化; 默认 HSI 经 PLL 输出 240 MHz,PLL 倍频系数须为 8~76 的偶数 |
firmware/CMSIS/device/n32h49x_conf.h |
汇总包含全部驱动头文件,并定义 assert_param |
firmware/CMSIS/device/startup/startup_n32h49x.s |
Keil MDK-ARM 启动文件 |
firmware/CMSIS/device/startup/startup_n32h49x_EWARM.s |
IAR EWARM 启动文件 |
firmware/CMSIS/device/startup/startup_n32h49x_gcc.s |
GCC 启动文件 |
firmware/CMSIS/device/n32h49x_flash.ld |
GCC 链接脚本 |
firmware/n32h49x_std_periph_driver/inc/misc.h |
NVIC 与 SysTick 配置函数,对应第 5 章的 NVIC 模块 |
firmware/n32h49x_std_periph_driver/inc/n32h49x_spi.h |
SPI 与 I2S 共用的驱动头文件 |
firmware/n32h49x_algo_lib/keil/lib/n32h49x_common.lib |
公共算法函数,Keil 版库文件名与头文件 n32h49x_algo_common.h 不同名 |
4.3 Projects 工程目录
projects/ 下只有 n32h49x_EVAL/ 一个评估板工程目录,包含板级支持、外设示例与应用工程三部分。
📁 projects/n32h49x_EVAL/bsp
板级支持代码,示例工程通过 bsp/inc 头文件路径引用。
bsp/
├── inc/
│ ├── bsp_eval.h
│ ├── delay.h
│ └── log.h
└── src/
├── bsp_eval.c
├── delay.c
├── log.c
└── print_remap.c
📁 projects/n32h49x_EVAL/examples
外设示例,按外设分类分目录,共 34 个分类、184 个示例工程。
examples/
├── ADC/
├── ALGO/
├── CORDIC/
├── Cortex-M4F/
├── CRC/
├── DAC/
├── DMA/
├── DSMU/
├── DVP/
├── ETH/
├── EXTI/
├── FDCAN/
├── FEMC/
├── Flash/
├── GPIO/
├── I2C/
├── I2S/
├── IWDG/
├── LPTIM/
├── NVIC/
├── PWR/
├── RCC/
├── RTC/
├── SDIO/
├── SDRAM/
├── SPI/
├── TIM/
├── USART/
├── USBFSD/
├── USBHS/
├── VREFBUF/
├── WWDG/
├── XSPI/
└── XSPI_V2/
📁 projects/n32h49x_EVAL/applications
应用工程,当前只有 GCC_demo 一个,提供 GCC Makefile 构建方式。
applications/
└── GCC_demo/
├── GCC/
│ └── Makefile
├── inc/
│ ├── main.h
│ └── n32h49x_it.h
├── src/
│ ├── main.c
│ └── n32h49x_it.c
└── readme.txt
| 相对路径 | 作用 |
|---|---|
projects/n32h49x_EVAL/bsp/inc/bsp_eval.h |
两块评估板的 LED1~LED3、KEY1~KEY3、WKUP 按键与 USB VBUS 的端口、引脚、时钟与有效电平宏,由 DEMO_BOARD 选择 |
projects/n32h49x_EVAL/bsp/src/log.c |
日志串口初始化 log_init:USART1,TX 为 PA9、RX 为 PA10,115200-8-N-1 |
projects/n32h49x_EVAL/bsp/inc/log.h |
log_info、log_warning、log_error、log_debug 宏,由 LOG_ENABLE 与 LOG_LEVEL 控制输出 |
projects/n32h49x_EVAL/bsp/inc/delay.h |
SysTick 延时函数 SysTick_Delay_Us、SysTick_Delay_Ms |
projects/n32h49x_EVAL/bsp/src/print_remap.c |
标准输入输出重定向函数 _write、_read |
projects/n32h49x_EVAL/bsp/src/bsp_eval.c |
按键状态读取与 LED 控制等板级辅助函数 |
projects/n32h49x_EVAL/examples/ |
34 个外设分类的示例工程,每个示例含 Keil 与 IAR 两套工程 |
projects/n32h49x_EVAL/applications/GCC_demo/ |
LED 闪烁的 GCC 工程:Makefile 定义 n32h49x 目标平台,使用 startup_n32h49x_gcc.s 与 n32h49x_flash.ld,提供 all、clean、download、debug 目标 |
4.4 单个示例的标准结构
每个示例目录包含源码、头文件、Keil 与 IAR 工程以及说明文件。以 examples/GPIO/LedBlink/ 为例:
LedBlink/
├── EWARM/
│ ├── LedBlink.ewd
│ ├── LedBlink.ewp
│ └── LedBlink.eww
├── inc/
│ ├── main.h
│ └── n32h49x_it.h
├── MDK-ARM/
│ ├── LedBlink.uvoptx
│ └── LedBlink.uvprojx
├── src/
│ ├── main.c
│ └── n32h49x_it.c
└── readme.txt
| 相对路径 | 作用 |
|---|---|
src/main.c |
示例主程序:外设初始化与主循环 |
src/n32h49x_it.c |
中断服务函数 |
inc/main.h、inc/n32h49x_it.h |
示例头文件与中断函数声明 |
MDK-ARM/LedBlink.uvprojx |
Keil 工程,目标名 N32H49X,器件 N32H497xG,编译宏 N32H49X 与 USE_STDPERIPH_DRIVER,ROM 起始 0x08000000 长度 0x100000、RAM 起始 0x20000000 长度 0x90000 |
EWARM/LedBlink.eww |
IAR 工作区,配置名同为 N32H49X,链接文件取自工具链目录的 N32H497xG.icf,启动文件使用 startup_n32h49x_EWARM.s |
readme.txt |
中英文说明:功能说明、使用环境、使用说明(系统时钟与 I/O 配置、测试步骤与现象)、注意事项 |
全部示例的 MDK-ARM 工程文件都命名为 <示例名>.uvprojx / <示例名>.uvoptx,EWARM 工程命名为 <示例名>.eww / <示例名>.ewp / <示例名>.ewd,示例目录中没有 GCC 工程。以下情况与标准结构不同:
| 情况 | 示例 | 结构 |
|---|---|---|
| 分组子工程 | USART/485/、USART/LIN/、USART/IrDA_Tx&Rx/、USBHS/USBHS_Device/、USBHS/USBHS_Host/、USBHS/USBHS_Dual_Role/ |
父目录只作分组,不含工程; 子工程各自带 readme.txt、src/、inc/、MDK-ARM/、EWARM/,分别计数 |
| 分组下的工程命名 | USBHS/USBHS_Device/ 与 USBHS/USBHS_Host/ 的子工程 |
工程文件统一命名为 project.uvprojx 与 project.eww,与目录名不同 |
| 辅助源文件 | USART/LIN/LIN_Master/、USART/IrDA_Tx&Rx/Transmit_Receive/、USBHS/USBHS_Device/CDC/ |
src/ 与 inc/ 中另有 lin_master.c、bsp_Tim_38K.c、usbd_cdc_core.c 等辅助实现与配置头文件 |
示例工程通过相对路径引用 firmware/ 与 bsp/,复制示例时保持其在 projects/n32h49x_EVAL/examples/<分类>/ 下的目录层级,否则需要同步修改工程中的头文件路径与源文件路径。
4.5 开发辅助资源
| 相对路径 | 作用 |
|---|---|
jlink/flash.jlink |
J-Link Commander 脚本:复位、加载 build/output.hex、复位、运行、退出 |
.vscode/launch.json |
gdb-arm 调试配置:使用 arm-none-eabi-gdb 连接 localhost:2331 的 GDB 服务,加载程序、复位并在 main 处设置断点 |
.vscode/tasks.json |
make_debug 构建任务,在工作目录 projects/n32h49x_EVAL/applications/GCC_demo/GCC 执行 make debug |
.vscode/settings.json |
编辑器设置与文件关联(n32h49x.h、n32h49x_flash.h 关联为 C 文件) |
projects/n32h49x_EVAL/applications/GCC_demo/GCC/Makefile |
GCC 构建脚本:all 生成 build/output.elf、.hex、.bin;download 调用 JLink.exe 以 -device N32H497xG -if SWD 执行 jlink/flash.jlink;debug 启动 JLinkGDBServer.exe |
.vscode/launch.json 与 GCC_demo/GCC/Makefile 中的工具链路径、J-Link 安装路径均为固定值,且 launch.json 加载的 ELF 文件写死为 Nsing.N32H49x_Library.1.0.0 目录下的绝对路径。使用前请按本机安装位置与 SDK 实际目录修改这些路径。
SDK 资料包在 SDK 根目录之外还提供以下开发支持文件,其官网版本见“资料与工具导航”一章:
| 资源 | 作用 |
|---|---|
| KEIL PACK 包 | Keil 支持包:.pack 安装文件、.pdsc 器件描述、Flash 编程算法与 .svd 文件 |
| IAR 型号补丁 | 将 Nations 器件描述加入 IAR 工具链,安装后 N32H497xG.icf 等链接文件位于工具链的 config/linker/Nsing/N32H49x/ 目录 |
| J-Link 型号补丁包 | J-Link 器件描述文件,使 J-Link 识别 N32H497xG 等型号 |
| Flash 编程算法源代码工程 | Keil 与 IAR 的 Flash 编程算法源工程,可自行编译生成 .FLM 文件 |
| NSLink 与量产工具 | 在线/离线量产下载工具 |