记录:利用U盘直接烧录hex文件到flash来更新app程序
前几天发过一个网上转的hex转换bin的C程序代码,
准备把这个代码移植到先前写过的fat+U+bin+flash
配置:http://www.stm32cube.com/question/514
编程:http://www.stm32cube.com/question/515
改成fatfs+U+hex+flash
这样的话就不用专门把hex转换为bin在去烧写了.
此贴保留,后续慢慢更新.
准备把这个代码移植到先前写过的fat+U+bin+flash
配置:http://www.stm32cube.com/question/514
编程:http://www.stm32cube.com/question/515
改成fatfs+U+hex+flash
这样的话就不用专门把hex转换为bin在去烧写了.
此贴保留,后续慢慢更新.
18 个回复
admin
赞同来自:
为了要能更好的观察到生成的bin和用c转换的bin是否一致,准备先将hex放入u盘,在程序中添加一个hex转换bin的过程,然后生成相应的bin文件到u盘,.这样在电脑上就可以打开观察两者的区别
所以,首先按照配置链接完成fat写文件的配置,
我利用了上次配置:http://www.stm32cube.com/question/514
直接诶打开这个工程:
然后修改原先写入一个文件为写入两个文件,
正常的写入文件流程是:
之后紧跟 创建并打开操作
创建完成后,就是写入操作了
写入完成了,那么就必须添加一个打开操作的孪生兄弟 关闭操作
这样一个完成的创建并写入一个文件就完成了.
那么这次我先测试下写入两个文件,所以上面的流程复制一遍即可,于是得到了下面修改后的代码
我创建了两个文件分别为 bintest.txt , hextest.txt
内容分别是:bin 1 bin 2 bin 3 bin 4 bin 5 bin 6
和
hex 1 hex 2 hex 3 hex 4 hex 5
测试结束,当然有心的人可以将这个流程封装为一个函数,这样每次写文件的时候调用即可.不用重复劳动.
下面继续!
admin
赞同来自:
btr是用户要读的数据量,br是实际读取的数据量,这样当判断到br==0时,文件读完。
admin
赞同来自:
将第一个文件hextest.txt的内容读出来,写入到bintest.txt文件里
于是将刚才的程序第一个写入改为读出,
首先打开以只读模式 读出到rambuff中,个数是buffer_size,真实读出的数据个数为bytesread
关闭文件
就像前面说的读出的时候可以判断bytesread是否==0,来判断读完
这里我就不判断了,因为我知道能读的完.哈
那么另外一个文件的写入要改为
于是,整个程序被我改为
烧录测试
admin
赞同来自:
内容为:hex 1 hex 2 hex 3 hex 4 hex
那么我们下一步就是,把hex复制到u盘,然后读出这个hex文件,直接复制到bintest.txt文件里进行测试.
于是我们只修改读取文件的名称试试
其中我用到的测试的USBDisk.hex为8.61K
编译测试.
可以看到大小一致,但是内容一样吗?这个就需要进一步对比
通过代码对比工具可以看出,完全一致.
这样我们就可以在读出数据之后对数据进行一系列的处理,完后在去写入到bintext.txt文件里面了
admin
赞同来自:
http://www.stm32cube.com/question/516
这篇文章的程序来对上面我们刚刚测试的程序进行进一步改造.
我们这里还会用到另外一篇文章
http://www.stm32cube.com/question/522
这篇文章是对下面要用到的函数的讲解,一定要看完啊
从这篇文章上看我们要利用
而这个函数的含义就如上面链接的介绍里讲的
注意我后面移植的时候出了个错误就是这里没注意看导致的! 等下我会写出这个错误和解决办法! 函数的含义:
好了,我们开始改造,因为我们操作的时候要同时打开和操作两个文件,所以我们要
一个保存hex文件的打开状态,一个bin文件的打开状态
因为hex文件的内容是字符,我们要转换为ascll码,所以需要特定的一个转换函数,于是我们要
这个网站的编辑器会吞代码,所以我再次发一下上面的代码的图片,你可以参照图片的代码研究
接下来我们对 进行改造
我们先同时打开两个文件,一个读一个写
然后对读取到的hex代码进行循环处理,提取出对我们有用的,删掉无用的
同上,我也发个图片版的
处理完成之后,我们要关闭这两个文件
这样整个处理过程就结束了.
完整的main函数代码如下:
如果上面的代码有错误的地方,肯定是被编辑器给吞了,那么请参考我中间发布的代码图片
admin
赞同来自: 坑自己星人
首先将我们先前生成的那个用户app的USBDisk.hex文件拷入U盘,
然后将u盘插入板卡,观察到LED绿色灯亮,说明烧写完毕,拔出U盘,绿色灯灭
我们把U盘插入电脑,看到里面多了一个名字为:bbbintest.bin 的文件
这个文明大小为3.05K
然而我们用keil自带的hex转bin软件将hex转换为bin后的代码大小为3.04K
说明我们程序转换的不正确,
此时我打开这个bbbintest.bin 和软件生成的USBDisk.bin
观察他们有什么不同.
左边的是软件转换的结果,右边是我们程序生成的结果
可以看到右边的比左边的多出来好多个 0D
同时我们也看到每次多出来的0D 之后必然根了一个 0A
我们再去看我们前面文章学习hex和bin区别的时候这句话:
HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d,0x0a)
所以判断这个应该是系统转换的时候把回车和换行都转换了,于是我去程序中查看
于是我们找到了上面那句话,
我赶紧去查看 这个定义,我们定义的是 2
所以导致了问题存在,于是,将
其改为 1 即可.
重新编译,按照上面的操作拔插u盘,然后看到,文件大小一致了.
对比代码完全一致,测试成功.
admin
赞同来自: 蜡笔小新12138
现在真正的重点开始操作.
由于我们要操作flash,而且需要做用户app跳转所以我们打开以前fatfs+bin文件更新程序的那个工程文件夹,将里面的flash_if.c和flash_if.h文件复制到现在的工程中,
我们在main.c文件中添加flash文件引用
添加跳转定义 上面的代码有木有很眼熟?
对了,这个我们在dfu和串口的iap里面都用到了,U盘+bin也用到了.这里也不例外
我们参考串口iap添加相应的按键检测跳转指令
如果我们按键按下那么进行fat和Usb的初始化
所以我们先将这两个函数注释掉,然后添加到上面代码的后面去
因为flash烧写我准备用word 32位
所以首先我们先增加定义一个函数,函数的作用就是将hex的有效数据分解为32位word数据
我说一下这个地方,比较关键,为什么这么写?
这个地方是根据我对flash的操作来写的,如果你的flash操作不同那么这个地方也要改.
起先我上面的函数是7-6-5-4-3-2-1-0这个顺序,但是写入的效果不对,
于是我利用stm32f407discovery板卡的stlink工具stlink utility
连接查看烧录后的0x800c000地址的数据,和我导入的相应的hex文件里面的数据对比
发现数据是对的,但是顺序是反的,所以几经周折才写出上面顺序.
后面要用到应用app地址即0x800c000
所以先定义一个
意思是下一个需要写入的地址
上面都完成之后,我们需要在 这个函数里进行改造
我们在成功打开文件之后
增加一个清除flash块的操作
然后我们将原来写入到bin文件的代码为flash 写入操作
之后关闭fat和锁定flash
编译烧写代码到板卡
然后u盘里面拷贝基地址为0x800c000的用户app的hex文件, 然后u盘插入板卡,灯亮之后拔出,然后重启
可以看到效果.
ok,利用 cubemx+USB+Fatfs+hex 脱机升级程序完成.
admin
赞同来自: 江小鱼
同上次那个帖子一样,为了更灵活更方便使用,我们可以增加一句重启的代码到程序中,
这样当u盘拔掉之后,2秒后系统重启,就可以自动运行用户app了
ok,此次实验完整结束.
下一个实验是利用片子的内部flash模拟一个U盘,然后利用usb线连接到电脑上,直接拷贝bin文件到这个虚拟U盘来直接完成flash的编程.
这样就可以像使用U盘一个来更新程序了.
admin
赞同来自: boss 、随枫 、蜡笔小新12138
更新记录:
从上面的程序中看到我们用来判断的依据是一个PA0上面的按键,但是实际应用中是没有按键给用户按的.
那么应该怎么判断呢?
最简单的办法就是上电的时候判断U盘是否已经插在了端口上.
于是,我们要更新程序的时候要这样:
1,断电
2,插入u盘
3,上电
4,检测到有u盘已经插入
5,系统更新程序
6,拔掉u盘之后系统自动重启
7,完成升级操作
这样的话,我们就需要有一个判断U盘是否插入了的标准,恰好Hal库已经提供了此判断
他的值为:1或者0
所以我们可以在程序开始的时候先判断
例如:
或者在if中写入自己想要实现的代码,比如上面我们进行的程序升级操作.
boss
赞同来自:
这个好玩
yhz
赞同来自:
赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
渔舟唱晚
赞同来自:
你为何这么叼
zzj_zzj_zzj - stm32
赞同来自:
你为何这么叼赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
翻滚吧小乌龟 - 90后TI
赞同来自:
厉害了我的哥
BSXC
赞同来自:
厉害了我的哥
luscu
赞同来自:
厉害 我的偶像了
寂静の烛光
赞同来自:
学习了,感谢分享
坑自己星人
赞同来自:
一脸懵逼,stm32f407 keil环境 代码有吗