在看原厂提供的资料时看到有个 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划分:
| 起始地址 | 结束地址 | 大小 | 页数 |
Bootloader区 | 0x0000000 | 0x0003FFF | 16KB | 4 |
升级标志去 | 0x0004000 | 0x0004FFF | 4KB | 1 |
Application区 | 0x0005000 | 0x007AFFF | 492KB | 123 |
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的过程就实现完了,本例程实现了操作的简化流程,可根据实际应用情况进行修改。
---------------------
作者:6552918
链接:https://bbs.21ic.com/icview-3295540-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。