本项目实现了基于国民技术 N32G45x 系列 MCU 的 SD 卡 IAP 升级功能,支持以下两种方式:
插入 SD 卡后自动检测并升级
通过按键手动触发升级
升级过程通过 LED 灯闪烁状态 和 串口打印日志 来反馈当前升级进度与结果。
三、系统原理与流程图
1. 系统原理图(可配图说明):
主控芯片:N32G45x 系列
外设:
SD 卡模块(SPI 模式)
串口(用于日志输出)
LED 灯(升级状态指示)
用户按键(手动升级触发)
2. 升级流程图:
arduino
复制
编辑
上电/复位
↓
检测SD卡是否存在
↓
是否存在升级文件 FW.BIN?
↓ ↓
否 是
↓ ↓
正常运行 检查文件校验和
↓
校验成功?
↓ ↓
否 是
↓ ↓
升级失败 擦除APP区
↓
写入新固件
↓
校验写入数据
↓
写入成功?
↓ ↓
否 是
↓ ↓
升级失败 设置标志位跳转APP
四、测试环境
项目 参数/型号
MCU 国民技术 N32G45x 系列
开发板 官方N32G45x开发板
SD 卡模块 SPI 接口模块
SD 卡格式 FAT32
串口调试工具 USB转TTL,串口助手
软件环境 Keil MDK / IAR / VSCode + GCC
烧录工具 J-Link / DAP-Link
五、操作流程
使用 Keil 编译出主程序(BootLoader 和 App 分开)
将生成的 FW.BIN 固件文件拷贝至 SD 卡根目录
插入 SD 卡到开发板
上电后 MCU 自动检测是否需要升级
升级成功后跳转到新的应用程序运行
用户也可以通过按键手动触发升级
六、关键代码讲解(BootLoader 部分)
1. SD 卡初始化(使用 SPI)
c
复制
编辑
FRESULT res;
res = f_mount(&fs, "", 1);
if (res != FR_OK) {
printf("SD 卡挂载失败\n");
}
2. 固件读取并写入 Flash
c
复制
编辑
UINT br;
f_open(&file, "FW.BIN", FA_READ);
while (f_read(&file, buffer, 1024, &br) == FR_OK && br > 0) {
Flash_Write(destAddr, buffer, br);
destAddr += br;
}
f_close(&file);
3. Flash 擦除 + 校验逻辑
c
复制
编辑
FLASH_Unlock();
FLASH_ErasePage(APP_START_ADDR);
// 写入过程...
if (memcmp(app_addr, fw_bin_data, length) == 0) {
printf("校验成功\n");
}
4. 跳转至 APP
c
复制
编辑
typedef void (*pFunction)(void);
pFunction JumpToApplication;
JumpToApplication = (pFunction) *(__IO uint32_t*)(APP_START_ADDR + 4);
__set_MSP(*(__IO uint32_t*) APP_START_ADDR);
JumpToApplication();
七、应用场景
物联网设备 OTA 升级
工业控制现场维护
教育类项目演示
消费类产品如玩具、MP3 的固件升级
八、项目目录结构
arduino
复制
编辑
N32_SD_IAP/
├── Bootloader/
│ └── main.c
├── Application/
│ └── app_main.c
├── SD_FW/
│ └── FW.BIN(放到 SD 卡中)
├── Docs/
│ ├── 项目说明文档.pdf
│ └── 测试报告.docx
├── 视频演示.mp4
九、提交资料建议
**代码:**上传 Bootloader 与 Application 两部分源码
**文档:**PDF 格式,含原理、流程图、测试过程与效果
**视频:**简短演示 SD 卡插入、升级过程、LED 状态变化、串口输出
|