福利来啦!!!STM32F407通过SD卡进行程序升级(把bin文件烧写到FLASH的方式)

2019-07-20 00:40发布

        发福利啦~~~STM32F407通过SD卡进行升级的程序已经修改好并且上传。该bootloader是直接把bin文件烧写到flash里面去,不是原子哥的跳转哦,理论上可以烧写960k的bin程序。程序流程是把一个需要烧写的bin文件放到SD卡里面,然后在bootloader程序里读出来并把bin文件烧写到指定的FLASH区域,并且让该程序运行。
        说说辛酸史~~~~刚开始的时候走了很多弯路,第一个思路是像原子哥那样,通过把bin文件的内容复制到SRAM然后进行跳转运行,但后来仔细看了资料和他的程序,发现他的程序有限制,要在100k左右,太大了无法放得下,而且这个不是烧写到FLASH去运行,于是放弃这个思路。第二思路是把bin文件的内容复制到外部SRAM里面去,然后在外部SRAM里面运行时候,再把外部SRAM里面的bin内容给烧写到FLASH,相当于一开始从FLASH运行的程序跳转到外部SRAM去运行,然后通过外部SRAM运行的这个程序去把FLASH的内容给修改了,就是烧写新的程序。按照思路,在外部SRAM运行的程序是能够“独立”运行了,已经和FLASH没有关系,那时也能够对FLASH进行烧写,烧写地址是从0x8000000开始的,但烧写到16K以后就死掉了,就是整个程序都崩溃了。以为是在外部SRAM运行的程序不能把它自身的内容给复制出去,外部SRAM的程序存放地址是0x6800000,然后我又把0x6800000这个地址开始的数据复制出来烧写到FLASH去,有点像是一个人在跑步的时候把腿提起来给别人看一样,想想都觉得问题会出现在这里,使劲折腾验证了半天,发现不是这个问题,跑步的时候提起腿来给别人看居然没有“摔倒”~~~后来又去看了资料,发现所有运行的程序中断时都需要跑到FLASH的复位中断向量那里,但我都烧写到16K了,才跑出来折腾,这有点说不过去~~~反正到现在我也不知道是什么鬼在影响,哪位大神了解得可以解释解释。。。后来没办法了,只能换第三个思路,就是老老实实的写一个bootloader引导程序,然后把需要烧写的bin文件烧写到指定的FLASH里去。这个思路是通的,结果也是可以的。而且通过这种方式升级,速度比用FlyMcu.exe串口烧写的快很多很多。具体思路是通过修改原子哥第五十五章串口IAP实验里面的那个bootloader程序,把串口的那些功能全部去掉(串口升级的限制是120K左右,完全不够用啊,分包升级的方式感觉没什么思路也懒得动~~),把原子哥最后那个综合实验里面的 exeplay程序给移植进来,把打开SD卡进行选择文件升级直接给固定死成到SD卡里面的某个文件夹下面去找bin文件,比如在update文件夹下面找,目前只做了把一个bin文件放到这个文件夹下,然后直接升级,直接去掉人工选择的方式(人工选择的方式其实也挺好的,就是觉得固定死文件路径更加方便,避免麻烦)。在bootloader程序里面读到升级的标志位或者检测到按键按下,然后就去SD卡的update文件夹下读bin文件,并且把内容复制到外部SRAM(外部SRAM开辟了960K可以用来存这些数据),然后把从0x08010000到末尾的FLASH区域数据全部删除,再把外部SRAM的bin文件数据从0x08010000开始开始烧写进FLASH,烧写完成了,就把升级标志位清零,然后重启,重启时当然还是先从bootloader的程序开始运行,但判断到到标志位为0后以及0x08010000开始的数据不为FFFF则进行程序跳转。需要注意的是,用来升级的bin文件的起始地址要从0x08010000开始,设置好就可以了。现在还想通过网页传送bin文件的方式进行程序升级,可是网页方面没怎么接触,真希望有思路的大神能指导一二呀。至于这个SD卡升级的程序我就不敢贴出来献丑啦,现在加了网络的程序进去,基本上面目全非~~重要的SD卡升级程序部分还是有的,大神们也可以通过改改原子哥的程序来实现。其实SD卡升级在很多地方还是很有必要的,比如生产的时候,烧写好bootloader程序之后,插个有bin文件的SD卡进去升级就可以了,那速度真心快啊。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
52条回答
jiang633
1楼-- · 2019-07-22 20:30
 精彩回答 2  元偷偷看……
lzq12
2楼-- · 2019-07-23 00:00
 精彩回答 2  元偷偷看……
jiang633
3楼-- · 2019-07-23 03:44
lzq12 发表于 2016-12-26 08:54
你是说主程序么,这个和bootloader没有关系的吧,我主程序的功能都能用呢,你要不试试直接修改原子哥的定 ...

你在你的BOOT里面初始化一个定时器看看串口是否还能输出数据,我用原子哥的升级代码初始化了一个定时器之后串口就无法输出数据了,不知道是不是我没设置好的原因,你可以试试看
lzq12
4楼-- · 2019-07-23 04:56
 精彩回答 2  元偷偷看……
jiang633
5楼-- · 2019-07-23 07:08
lzq12 发表于 2016-12-26 10:03
首先来理顺一下你的程序:1、你是在我这个bootloader里面添加了定时器和串口功能么?如果时这样的话,那 ...

我用的不是你的bootloader,是用别人改原子哥通过串口升级的代码,增加NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);是在bootloader还是在APP增加,bootloader已经增加有了NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);,bootloader和APP都有串口初始化,是否要区分设置他们的中断优先级?我发现用自己的定时器没法应,原子哥的定时器没有什么影响,可以使用,
lzq12
6楼-- · 2019-07-23 08:01
jiang633 发表于 2016-12-26 14:21
我用的不是你的bootloader,是用别人改原子哥通过串口升级的代码,增加NVIC_PriorityGroupConfig(NVIC_Pr ...

只要用到了中断,就增加NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);,按道理是不用区分中断优先级的,不过为了排除问题,区分一下也可以,如果怕bootloader设置的定时器中断会影响到APP的,那就在APP那里先关闭在bootloader的开启的中断,原理上,跳转到APP之后,bootloader的代码是不会再执行的,还有就是看一下bootloader的bin文件大小,看看有没有超出,原子哥的串口升级代码对APP的大小也有限制的,这个也得看一下

一周热门 更多>