STM32之串⼝IAP更新升级
⼀、IAP简介
IAP是应⽤编程,⽬的是为了在产品发布后可以⽅便地通过预留的通信⼝对产品中的固件程序进⾏更新升级,后续产品发布后,更新程序我只需要把.bin⽂件通过串⼝发送给芯⽚就可以执⾏更
stm32怎么使用printf新,很⽅便产品的维护⼯作。对于应⽤IAP的项⽬,整个项⽬需要有两个项⽬的代码,第⼀个项⽬程序不执⾏正常的功能,通过串⼝或者USB等通信来接收对第⼆个项⽬代码,并且执⾏更新第⼆
部分的代码,称这个程序为Bootloader程序,第⼆个项⽬的程序是我们产品要实现的功能程序,即产品功能程序。针对我的⼯程项⽬,当芯⽚上电后,⾸先会执⾏Bootloader程序,并且会执⾏以
下操作:
1、通过按键来判断是否需要对产品功能程序进⾏更新
2、不更新则跳转到4运⾏产品功能程序。
3、进⼊更新功能程序状态,要等待串⼝发送过来的产品功能程序,接收成功后并开始功能程序的更新⼯作。更新完成后⾃⼰跳转到4运⾏产品功能程序
4、进⼊到产品的功能程序。
Bootloader程序⼀般使⽤JLINK下载或者ISP串⼝下载到芯⽚⾥边,⽽产品的功能程序则是通过设置后,KEIL在编译后把.axf⽂件转为.bin⽂件,更新产品功能程序则是通过串⼝软件把.bin⽂件发送
给Bootloader程序,就可以进⾏产品功能。
⼆、IAP 程序运⾏流程
STM32芯⽚正常运⾏的流程如下:
加⼊IAP程序后,STM32芯⽚运⾏的流程如下:
三、IAP配置
1、Bootloader程序:
我使⽤的芯⽚STM32F407VET6,在Bootloader程序是参考正点原⼦的源代码修改的,我通过⼀个拨码开关来判断是不是要更新产品功能程序,如果要更新则拨到ON,程序会通过串⼝等待接收
要更新的代码,接收完成后会⾃⼰更新,更新完成后⾃动进⼊到产品功能程序⾥边,下次需要更新则需
要重新上电或者复位。程序代码如下:
while(1)
{
if(USART_RX_CNT)
{
if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
{
applenth=USART_RX_CNT;
oldcount=0;
USART_RX_CNT=0;
printf("⽤户程序接收完成!\r\n");
printf("代码长度:%dBytes\r\n",applenth);
flagtest=0;
}
else
oldcount=USART_RX_CNT;
}
t++;
delay_ms(10);
if(t==30)
{
LED0=!LED0;
t=0;
}
key=KEY_Scan(0);
if(key==1) //按键按下
{
if(applenth&&flagtest==0)
{
flagtest=1;
printf("开始更新固件...\r\n");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码
printf("固件更新完成!\r\n");
}else
{
printf("⾮FLASH应⽤程序!\r\n");
}
}
else
{
printf("没有可以更新的固件!\r\n");
}
}
else
{
flagtest=0;
printf("开始执⾏FLASH⽤户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执⾏FLASH APP代码
}else
{
printf("⾮FLASH应⽤程序,⽆法执⾏!\r\n");
}
}
}
2、产品功能程序的IAP配置
因为加⼊IAP功能后,实际上我们的程序由两个部分组成,⼀个是Bootloader程序,另⼀个的产品功能程序。那么我们会在芯⽚的Flash中设置64k来保存bootloader程序,64k以后存储产品的功
能程序,如下图所⽰,IROM1的起始地址⼀般为0X08000000,⼤⼩为0X80000(512k),STM32F407VET6的flash为512k,⽽对于bootloader程序预留了64K的空间,对于产品功能程序的起始地
址为0X08010000,即偏移量0X10000(64k)预留给bootloader,⽽0X8010000开始以后都是产品功能程序的存储空间。
另外,在程序中还需要设置产品功能程序中断向量表的起始地址,表⽰flash是从这个新设置的起始地址开始的。⼀般放在main函数的最开头。
SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量
我们要知道更新产品程序是通过串⼝发送bin⽂件给bootloader项⽬的程序,我们要怎么配置把产品功能程序⽣成.bin⽂件?在KEIL环境中设置,如下图所⽰,name of Executable为axf⽂件的名
字,实际上.bin⽂件是通过.axf⽂件转换的。
图中输⼊的内容为D:\software\keil\ARM\ARMCC\ --bin -o E:\IMI_101项⽬\IMI_101\MDK-ARM\IMI_101.bin E:\IMI_101项⽬\IMI_101\MDK-ARM\IMI_101\IMI_101.axf
其中为安装KEIL软件包含的软件,主要⽤于把axf⽂件转换为bin⽂件。
E:\IMI_101项⽬\IMI_101\MDK-ARM\IMI_101.bin 为⽣成的bin⽂件存放的路径和⽂件名字
E:\IMI_101项⽬\IMI_101\MDK-ARM\IMI_101\IMI_101.axf 为axf⽂件所在的路径和⽂件名
产品功能程序在编译⽆报错即就可以⽣成IMI_101.bin⽂件。
四、参考⽂档
by ⽺⽺得亿
2017-11-23 ShenZhen

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。