本帖最后由 6552918 于 2023-4-11 11:19 编辑
#申请原创# #技术资源#@21小跑堂
在看原厂提供的资料时看到有个 341-Boot定制资料-220615 文件,以为是现成的用户BOOT例程,但实际只是简单的举例,并没有完整的实现IAP应用 正好前一阵在搞SD卡实现IAP功能,但使用的是SPI驱动的SD卡,但SWMDM-QFP100-34SVEA3&A2板上的SD卡是使用SDIO驱动的,顺便在这块板上使用SDIO驱动SD卡把IAP功能能完整的实现一下。 1. 硬件部分说明1.1 硬件说明使用SWMDM-QFP100-34SVEA3&A2板上的SD卡槽,使用杜邦线将A5和LED连接,用于驱动LED进行状态指示。串口收发使用M0 M1进行收发 使用DAP-LINK进行程序下载和仿真 1.2 FLASH说明SWM341的FLASH有512KB,128个页,每个页大小为4KB,需要根据使用情况对FLASH进行划分。 本例程FLASH划分:
2. 软件部分说明因为要使用SD卡读写文件,需要文件系统移植,这里采用的是FATFS文件系统。另外还涉及到片内FLASH的拆除写入,这部分功能由厂商提供的API接口实现 2.1 移植FATFS fatfs 的官方网站: http://elm-chan.org/fsw/ff/00index_e.html 厂家提供的SD卡例程中已经有移植好的例程 这里我对移植过程做个简单的描述 首先添加fatfs源码 添加.c文件 添加.h文件路径 diskio.c文件是移植的接口文件,里面需要根据实际使用情况实现接口函数 disk_status、disk_initialize、disk_read、disk_write、disk_ioctl等函数 这些函数的具体操作需要调用SD_SPI中的先关API FATFS定义了RAM MMC(SD/TF) USB设备的盘符,这些盘符在操作API时会用到 ffconf.h内是FATFS的配置文件,相关配置项需要根据自己的实际情况进行配置 片内FLASH_IAP移植 此部分直接使用原厂提供的IAP函数即可,将文件添加到工程 添加.c文件 添加.h文件路径 这里重点说一下SWM在FLASH操作上的注意事项 因为FLASH自带 CACHE,厂家将FLASH操作都封装为了API,直接调用API函数操作即可,但在写入函数时有严格的要求 重点是即使你要写入的是 一个字节 ,但在实际操作时也要按 4个 字 的长度才行 至此,软件包的移植工作就都完成了,接下来实现具体的逻辑操作。 2.2 升级流程说明本实例仅实现基础功能,在实际使用过程中需要根据实际情况进行修改 整体流程如下: 整个方案流程如下 1 MCU启动 2 bootloader判断升级标志状态,标志不为0x12345678,进入步骤3,标志为进行app0x12345678,进行跳转至app进入步骤7 3 bootloader初始化外设 4 bootloader初始化文件系统 5 bootloader检查app升级文件是否存在,升级文件存在,输出提示信息,并等待升级命令。未收到升级命令则正常运行。 6 bootloader收到升级命令,读取SD卡内升级文件写入app区,写入完成,跳转至APP 7 app判断升级标志状态,标志不为0x12345678,代表第一次进入app,需要将升级标志写为0x12345678。标志为0x12345678,代表从bootloader正常启动。 8 app初始化外设 9 app初始化文件系统 10 app检查app升级文件是否存在,升级文件存在,输出提示信息,并等待升级命令 11 app收到升级命令,需要先擦除升级标志,并进行系统复位,回到步骤1。未收到升级命令则正常运行。
我的这个SD_IAP实例因为BootLoader和application功能都十分类似,因此使用一个工程下的不同项目进行维护 在不同点使用宏定义进行编译选择。在app内添加SD_IAP_APP宏定义作为编译开关。 不同项目输出的bin文件名称分别进行了设置,防止出现错误 这里重点说一个MDK的小技巧,在进入bootloader和application后都要进行中断向量的重新映射才能使程序正常运行,例如: 一般的做法都是在bootloader和application使用不同的宏定义区实现,比如 这种方式在修改时有时会遗忘,比较麻烦,MDK可采用下图的方式修改,一劳永逸。不用再为不同起始地址配置不同的宏定义,一切都由MDK根据FLASH地址的配置自动设置。 3. 升级过程测试首先将BOOT程序使用下载器下载到芯片里,下载是要设置为全片擦除 硬件状态是LED指示灯以1秒间隔亮灭闪烁 检测到等级文件后串口会打印升级提示 发送升级命令 aa0155 Bootloader进**读取并写入到APP区,完成后会跳转至APP区,硬件状态是LED指示灯以300毫秒间隔亮灭闪烁 在APP内识别到SD卡内的升级文件后,通过升级命令可以跳转回BOOT区
至此,整个使用SD卡进行IAP的过程就实现完了,本例程实现了操作的简化流程,可根据实际应用情况进行修改。
视频:
|