目录

前言:

一、flash分配

二、起始地址设置方法

三、设置app生成bin文件

四、下载程序 

五、合并hex

前言:

        主要实现bootloader串口读取app程序 ,将app程序拷贝到对应运行的flash区域,跳转到对应的区域执行代码。本文没有复杂的显示,app只点亮一个灯做测试用。

一、flash分配

        本文使用的是stm32f103ve,flash有512k(如果你使用的大于512k可以使用此程序,如果小于512k那么就需要调整flash区域),分为两个程序,app程序在0x08000000运行,因此将app程序放在0x08000000处,上电就运行app程序,如果串口通知有需要拷贝程序,那么再跳转到bootloader程序。flash分配图解如下:

二、起始地址设置方法

        打开keil设置app程序起始地址和大小,点击

 设置bootloader程序起始地址和大小

 因为app程序没有偏移所以程序中不需要设置,但是需要设置bootloader程序中断向量表的偏移

在system_stm32f10x.c中找到systemInit函数,修改如下

将VECT_TAB_OFFSET 修改为0x70000,因为bootloader从0x08070000开始。

三、设置app生成bin文件

E:\keil\ARM\ARMCC\bin\fromelf.exe   --bin -o  .\OBJ\demo.bin .\OBJ\demo.axf

 需要找准目录

E:\keil\ARM\ARMCC\bin\fromelf.exe是keil的安装目录下的工具

.\OBJ\demo.axf是编译生成的axf文件

.\OBJ\demo.bin是需要生成的bin文件

四、下载程序 

因为下载的是两个文件,所以一定要擦除的是扇区,不能是整个flash,将app和boorloader全部下载就好。

 打开sscom,发送OK,进入到bootloader

 然后点击发送需要升级的bin文件

可以看到程序已经更新,可以拿改变灯的状态或者输出不同字符串查看程序是否更新成功。

本文只是做一个简易的demo,如果需要更多的应用可以将串口拷贝作成一个上位机。

五、合并hex

         如果bootloader和app都已经写好了,那么如果想要更方便的拷贝升级,那么可以将bootloader和app合并为一个文件,那么拷程序的时候只需要拷贝一个文件就可以。

打开bootloader的hex文件,和app的hex文件

 将bootloader的hex文件所有内容都拷贝到app的hex文件的前面,如果他们之间存在空行的话需要删除掉。合并完成之后将合并之后的hex文件烧写到芯片中即可使用。

代码地址:GitHub - clcmotta/bootloader: bootloader demobootloader demo. Contribute to clcmotta/bootloader development by creating an account on GitHub.https://github.com/clcmotta/bootloader.git

查看原文