Stm32f10x系列MCU Bootloader 流程
芯片:stm32f103ze
所需软件:SecureCRT (用于使用Ymode协议发送Application文件),其实应该我们自己写个上位机,这里借助SecureCRT来充当我们自己写的应用程序(用于验证Bootloader是否成功)。
keil版本:μVision V5.11.0.0
用途:使用通信接口用于软件的更新(免去拆机繁琐的流程)。
BootLoader其实看上去挺复杂的样子,但也还好~仔细查找网上的资料都
有很多介绍,以下为自己做bootloader的过程以及应注意的事项,帮助
大家少走弯路~
请先下载我上传的资源:
http://download.csdn.net/detail/jimoxiaosage/9451290
首先确定自己要做个串口能更新固件的程序出来~,听说名字叫Bootloader,网上也是挺多资料,网上资料找了找,看了看基本了解其流程:
在程序起始位置(0x0800 0000)写Bootloader程序,在另一个偏移位置写应用程序(比如0x0800 3000,那么bootloader 的程序空间就只能被限定为0x3000大小,超出了就不行咯)。在Bootloader程序中通过检测标志位(按键按下,或是Flash中的数据等等)来判断是否进行更新。(此处的更新指的是更新用户应用程序区域,即0x0800 3000 之后的flash 数据)通过串口,使用Ymodem协议将要更新的镜像--xxx.bin烧写入Flash,烧写完成后程序跳转到应用程序(0x0800 3000 ),固件更新完成。
BootLoader工程Stm32官网上有,当然也可以使用我的(有简单修改过):
在这个工程中需要注意的地方:
1.用户程序起始地址:#define ApplicationAddress 0x8003000 。(该地址需要与另一个工程-用户应用程序的起始地址一样,具体看后面)。
2.需要配置烧写时擦除的位置,如图:
3.默认程序地址就是0x8000 0000 ,大小需要修改为0x3000,如下图:
4.注意串口是否可用,该工程串口引脚PA9,PA10,特别注意时钟是否配置正确(主频72M)否则会出现乱码~~~。
5.附带我修改过的程序流程图,按键就是PA0,
//----------------------------------- 以上 BootLoader 做好了-----------------------------------
下面就需要写个应用程序来验证该BootLoader~~
如下是我的工程需要注意的地方:
1.修改keil配置,将起始地址修改为 0x0800 3000,大小根据自己的flash大小来设定,如图:
2.同样要擦除的Flash区域也要勾选下(不然debug时会把本来写进去的Bootloader擦掉了~)如图:
3.由于我们将程序起始地址改成了0x0800 3000,复位时其实仍然是从0x0800 0000开始跑的~所以要在main函数最前面加:NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x3000); 同时,还需要修改如下定义的值:
#define VECT_TAB_OFFSET 0x3000
改值原本为0,修改为偏移量。
4.使用keil自带的fromelf 来输出***.bin文件~,这部分网上找的挺多都不能用的,可能跟keil软件版本有关吧,详细问题还是查看keil帮助文档会比较清楚,以下贴上我的设置:
fromelf --bin --output=1s.bin ..\OutPut\Stm32f103Templete.axf
,这样编译完成就会出现一个1s.bin的文件咯~
简单看下我的main函数~实际就是个闪灯的程序~(可以把时间修改为500ms,再生成一个500ms.bin文件来验证我们的Bootloader)
//-------------------------------- 以上为用户应用程序部分------------------------------
以上步骤结束后我们会有:
1.Stm3210xIAP (Bootloader)
2.Stm3210xIapApplication (user application)
3.1s.bin 500ms.bin
4.SecureCRT软件
首先先把1的工程编译,烧到芯片中~,接下来把2的工程编译烧到芯片中~此时如果PA2接个LED灯会看到灯交替闪烁。
接着打开SecureCRT软件,设置好相应波特率,打开串口~,
接着PA0接到地(模拟一个按键按下)再将开发板上电,此时就会进入固件升级,打印相关信息~此时芯片等待Ymodem协议发送文件过来,使用secureCRT软件,send Ymodem,选中我们所需要更新的文件如:1s.bin,烧写完成后会发现LED灯变成每1s交替闪烁了。
可以重复以上过程烧写500ms.bin文件试试~。
以上整个过程结束。