STM32F103VET6利用片内FLASH虚拟U盘,使用文件复制方式实现IAP
2019-06-01 来源:eefocus
在原子论坛偶尔搜到一篇 利用STM32片内FLASH虚拟U盘,使用文件复制方式实现IAP的帖子http://www.openedv.com/forum.php?mod=viewthread&tid=39012&extra=page%3D1 按照楼主提供的代码修改了一下发现不能用,仔细阅读相关zizi资料(《5 分钟用 STM32的内置 Flash 做一个超小 U 盘》)发现了我用的是STM32F103VET6属于大容量的,片内FLASH是2K一页,所以要修改相关代码,贴出来修改的相关代码
一.修改memory.c 文件
修改Data_Buffer数组为2K,BULK_MAX_PACKET_SIZE宏定义为64,所以BULK_MAX_PACKET_SIZE*4*2*sizeof(unit32)=2KB的容量。
二.修改mass_mal.c 文件
1. FLASH_START_ADDR 0x800300 这个是IAP的存储容量12K ,要确保IAP不会超过这个容量,同时也是虚拟U盘的内存起始地址。
2. FLASH_SIZE 0x7D000 这个是U盘的内存大小他的计算原则是 单片机总容量512K减去IAP的空间容量,即512-12 = 500K 也就是0x7D000
3. FLASH_PAGE_SIZE 0x800 这个是Flash页大小,STM32大容量产品Flash分页是2K 小容量是1K zhed这点要注意修改
4. FLASH_WAIT_TIMEOUT 100000 这个就不修改
三.计算跳转地址
1. #define ApplicationAddress 0x0800A800 这个数据计算比较麻烦,首先要插入STM32虚拟U盘,电脑会提示格式化U盘,这个时候格式化U盘,使用FAT默认格式格式化U盘。格式化完成后会出现我们虚拟的U盘。查看U盘属性得到U盘可用存储空间如下图。我的格式化以后有470K可用,这样就可以计算跳转地址512K-470K = 42K 即0xA800 ApplicationAddress = 0x8000000+0xA800 = 0x0800A800
到此虚拟U盘IAP程序修改完成,接下来修改APP程序
四.修改APP的地址生成Bin文件
1.修改APP起始地址
改成刚刚计算的跳转地址
2.生成Bin文件
添加对应目录下的fromelf.exe
3.重新编译APP程序,找到生成的BIN文件把他复制到我们虚拟的U盘里面 如下图
五.断电重启或者按下复位键,IAP就会自动跳转到APP设置的起始地址执行相应的代码。至此整个升级过程结束。
六.如何进入IAP
IAP程序里面设置检测引脚状态,刚上时单片机运行IAP程序,检测引脚判断是跳转还是执行IAP初始化虚拟U盘。拉低该引脚则初始化虚拟U盘,这个时候连接到电脑USB就能看到虚拟的U盘。
七.安全问题
这种升级fa方式没有安全性,仅仅用作测试。在此t可提供一种假设,把IAP存储空间扩大后然后虚拟U盘,虚拟U盘空间相应减小(要能放下BIN文件才可以),这样就相当于IAP空间有一部分未使用,可以用来存放真正的用户程序,然后把加密(AES128等加密算法)的BIN文件复制到U盘。再次上点后IAP程序检测虚拟U盘的指定位置,如果有数据就把该数据全部复制到IAP存储的可用空间,在复制的同时实现Bin文件的解密。这样就可以间接对bin文件加密和解密,增加安全性。如下图