xdvca 发表于 2025-5-30 15:08

【开源活动】-基于国民N32G45x的SD卡IAP升级开发

本项目实现了基于国民技术 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 状态变化、串口输出

jobszheng 发表于 2025-6-2 10:06

嘿嘿文本格式的流程图。真是有创意啊

caigang13 发表于 2025-6-2 10:22

插入SD卡自动检测有无新版本固件,如果有可以自动升级或者提示用户选择升级。

miltk 发表于 2025-6-6 12:19

基于国民N32G45x的SD卡IAP升级系统开发,一般需要完成BootLoader与APP分区、SD卡驱动与文件系统移植、触发升级机制设计以及固件校验与跳转等关键步骤

pe66ak 发表于 2025-6-6 13:27

确定系统需实现的功能,如插入储存固件的SD卡后,支持自动或手动完成固件升级,并通过LED灯或串口打印反馈升级结果。

ewyu 发表于 2025-6-6 15:33

准备好国民N32G45x开发板、SD卡模块、SD卡以及相应的开发软件(如Keil等)。同时,获取国民技术提供的库文件和相关资料,以便参考和调用。

清芯芯清 发表于 2025-6-6 16:45

划分BootLoader和APP在MCU内部闪存(FLASH)中的地址范围。例如,BootLoader地址可设为0x08000000~0x08007FFF,APP起始地址设为0x08008000。

yuliangren 发表于 2025-6-6 17:52

BootLoader程序负责检测SD卡、读取固件文件、校验固件、擦除Flash、写入新固件以及跳转到APP等操作;APP程序则是实际的应用程序

teaccch 发表于 2025-6-6 19:18

根据所使用的SD卡模块接口(如SPI接口或SDIO接口),编写相应的驱动代码。例如,若使用SPI接口的SD卡模块,需初始化MCU的SPI外设,配置好相关引脚,并实现SD卡的读写操作。

twinkhahale 发表于 2025-6-6 20:37

移植常用的FATFS文件系统,以便对SD卡内的文件进行操作。通过文件系统,可以更方便地打开、读取和写入固件文件。

canfeil 发表于 2025-6-7 09:14

系统启动后,BootLoader程序首先检测SD卡是否插入。若插入,则检查SD卡根目录下是否存在指定的固件文件(如“FW.BIN”)。

nqty 发表于 2025-6-7 11:26

对读取到的固件文件进行校验,以确保固件的完整性和正确性。可采用校验和、CRC校验等方法。

tiakon 发表于 2025-6-7 13:11

若固件校验通过,BootLoader程序先擦除APP程序所在的Flash区域,然后将新固件写入到该区域。写入过程中需注意数据的正确性和完整性,可分页或分块进行写入。
页: [1]
查看完整版本: 【开源活动】-基于国民N32G45x的SD卡IAP升级开发