SD卡升级——SDIO_IAP实验
来源:互联网 发布:如何做学术海报 知乎 编辑:程序博客网 时间:2024/05/29 16:48
在嵌入式项目中,经常会用到SD卡升级这一方式来进行产品的软件升级。刚好最近做的项目也需要这一功能,由于之前未接触过IAP开发,刚好在这个时候可以学习一下,于是先到各大网站去搜索相关资料,两天下来,基本对于IAP的概念和编程步骤有了大致的了解。本人手里有块正点原子的开发板,前期的实验都是在这块开发板上实现的。在实现了SD卡IAP功能以后,立马将工程移植到项目中去,很快就把这个功能添加进去了,甚是高兴,对于以前的SD卡升级功能也不再那么神秘了。
本人是先看正点原子的超级战舰手册,先看的《第三十九章 FLASH模拟EEPROM实验》,了解了STM32片内FLASH编程的步骤,然后再看的《第五十三章 串口IAP实验》,学习IAP编程的思想,最后到阿莫电子论坛上搜索相关的资料,最终完成了SD卡IAP编程的学习,并解决了实际问题。
学习总结:
1.STM32片内FLASH编程步骤4步曲:解锁、擦除、编程、上锁;
2.设置IAP程序在FLASH的起始地址,设置用户程序的起始地址为IAP后面的地址,并修改ROM空间大小;
3.在用户程序中,设置中断向量偏移地址为用户程序的起始地址;
4.STM32大容量存储器的页大小为2K,起初总以为是512字节;
5.页擦除的时候,所有的页地址都是实际的字节地址,而并非常说的“第几页第几页”中的页编号;
6.页擦除的时候,如果指定的页地址没有和页边界对齐的话,擦除操作仍然有效,只是擦除的范围是指定地址所在的整页大小;
原子哥的IAP实验是基于串口的,由于串口的数据发送是不可调的,只能一次性将整个用户程序的BIN文件发送给bootloader,而且bootloader是将接收到的用户文件暂存在片内SRAM的,这就限值了用户程序的大小,不能大于SRAM的大小64K。而SD卡设计则不受用户程序大小限值,只要FLASH装得下就行。由于原子哥的代码很多都是寄存器版本的,而文件系统又是他自己独门的FAT32驱动,再加上他的开发板SD卡例程都基于SPI驱动的(只有一个扩展例程是SDIO的),而我的项目时间比较急,要求用最高的效率完成这项功能,于是就产生了以ST官方库函数为主导,以网上开源文件系统Fatfs作为SD卡文件系统驱动,以SDIO4位总线的DMA访问模式为SD卡驱动这样一个方案,一切都只为了开发的效率,同时,也将源代码与大家分享,相信也有很多人使用这样一种方案的。
本工程试验平台:
1.硬件:正点原子超级战舰开发板,由于购买时配套的3.5寸触摸屏,对于3.5以下的屏为测试过,但应该没问题,因为LCD驱动用的还是原子哥的驱动,是兼容2.4到3.5的。SanDisk 1G SD卡, MicroSD 2G。注意:要使用超级战舰开发板上的SDIO功能,必须将开发板上的P10跳线帽接到P11上,因为原子的SD卡驱动默认使用SPI接口的,所以这里必须要设置!
2.软件:ST官方库V3.0的,比较老了。
FatFs文件系统,注意:本人在ff.h配置中将宏_FS_READONLY配置为1,即只生成读操作的代码,不编译写操作的代码,目的是为了减小
bootloader的代码量,包括原子哥的LCD.C中的代码也删减了很多。
下面就将主要的源代码贴出,供大家参考。工程源码: SDIO_IAP.zip
还要注意的地方:用户程序是放在FLASH地址0x08010000的位置的,而且该代码只识别SD卡根目录下的RTC.bin文件,如果要更改文件名,则只需将FirmwareUpdate函数中的“RTC.bin”文件改成你要升级的文件即可。
以下是运行效果:
希望对大家有帮助。
本人是先看正点原子的超级战舰手册,先看的《第三十九章 FLASH模拟EEPROM实验》,了解了STM32片内FLASH编程的步骤,然后再看的《第五十三章 串口IAP实验》,学习IAP编程的思想,最后到阿莫电子论坛上搜索相关的资料,最终完成了SD卡IAP编程的学习,并解决了实际问题。
学习总结:
1.STM32片内FLASH编程步骤4步曲:解锁、擦除、编程、上锁;
2.设置IAP程序在FLASH的起始地址,设置用户程序的起始地址为IAP后面的地址,并修改ROM空间大小;
3.在用户程序中,设置中断向量偏移地址为用户程序的起始地址;
4.STM32大容量存储器的页大小为2K,起初总以为是512字节;
5.页擦除的时候,所有的页地址都是实际的字节地址,而并非常说的“第几页第几页”中的页编号;
6.页擦除的时候,如果指定的页地址没有和页边界对齐的话,擦除操作仍然有效,只是擦除的范围是指定地址所在的整页大小;
原子哥的IAP实验是基于串口的,由于串口的数据发送是不可调的,只能一次性将整个用户程序的BIN文件发送给bootloader,而且bootloader是将接收到的用户文件暂存在片内SRAM的,这就限值了用户程序的大小,不能大于SRAM的大小64K。而SD卡设计则不受用户程序大小限值,只要FLASH装得下就行。由于原子哥的代码很多都是寄存器版本的,而文件系统又是他自己独门的FAT32驱动,再加上他的开发板SD卡例程都基于SPI驱动的(只有一个扩展例程是SDIO的),而我的项目时间比较急,要求用最高的效率完成这项功能,于是就产生了以ST官方库函数为主导,以网上开源文件系统Fatfs作为SD卡文件系统驱动,以SDIO4位总线的DMA访问模式为SD卡驱动这样一个方案,一切都只为了开发的效率,同时,也将源代码与大家分享,相信也有很多人使用这样一种方案的。
本工程试验平台:
1.硬件:正点原子超级战舰开发板,由于购买时配套的3.5寸触摸屏,对于3.5以下的屏为测试过,但应该没问题,因为LCD驱动用的还是原子哥的驱动,是兼容2.4到3.5的。SanDisk 1G SD卡, MicroSD 2G。注意:要使用超级战舰开发板上的SDIO功能,必须将开发板上的P10跳线帽接到P11上,因为原子的SD卡驱动默认使用SPI接口的,所以这里必须要设置!
2.软件:ST官方库V3.0的,比较老了。
FatFs文件系统,注意:本人在ff.h配置中将宏_FS_READONLY配置为1,即只生成读操作的代码,不编译写操作的代码,目的是为了减小
bootloader的代码量,包括原子哥的LCD.C中的代码也删减了很多。
下面就将主要的源代码贴出,供大家参考。工程源码: SDIO_IAP.zip
还要注意的地方:用户程序是放在FLASH地址0x08010000的位置的,而且该代码只识别SD卡根目录下的RTC.bin文件,如果要更改文件名,则只需将FirmwareUpdate函数中的“RTC.bin”文件改成你要升级的文件即可。
以下是运行效果:
希望对大家有帮助。
0 0
- SD卡升级——SDIO_IAP实验
- SD卡升级——SDIO IAP实验
- SD卡升级——SDIO IAP实验
- s3c2443Eboot支持SD卡升级
- android 制作sd升级卡
- RK2928 SD卡升级失败
- Android系统SD卡升级
- 华为手机SD卡升级指导
- android SD卡自动升级流程
- STM32F072使用SD卡进行IAP升级
- Mobile的SD卡升级系统之二:热升级
- Mobile的SD卡升级系统之二:热升级
- 实验七 数据缓存写入SD卡
- 裸机实验之SD卡下载
- 裸机实验体验之SD卡下载
- [FAQ12492] SD卡升级包升级后,如何删除升级包文件?
- SD卡升级实现方法之UBOOT+WINCE应用
- EBoot支持SD卡下载升级Bootloader和WinCE系统
- leetcode Convert Sorted Array to Binary Search Tree
- 换一种学习方法
- MQTT协议的简单介绍和服务器的安装(一)
- 遇到问题---ERROR 1327: Undeclared variable: calcPrice2_price_temp
- linux下java调用C
- SD卡升级——SDIO_IAP实验
- 5-MPU6050采集的数据
- 图的邻接表存储 c实现
- C/C++数组为什么不支持整体赋值操作
- J-Link仿真Cortex-M架构eCos停留在swi 0的解决办法
- MySQL性能优化-关于索引
- 腾迅马拉松(〇)解题报告
- I帧、P帧和B帧的特点
- server2003 必要的系统优化和安全设置