既然有USB,自然会想着实现在线更新功能,代码不复杂,接下来编写bootloader。
一、检查更新标志
每次复位后mcu会先运行bootloader部分,此时需要先检查用户区是否有程序、是否有更新标志、是否有强制进入boot的按键事件。
if(CheckIO()==0) //ESC和F1同时按下强制进入bootloader
{
const unsigned char *pRom = (const unsigned char *)APP_StartAddr;
if(*pRom!=0XFF) //检查用户程序是否存在,不存在强制进入bootloader
{
pRom = (const unsigned char *)0X7FFF;
if(*pRom!=0X01) //查询更新标志
{
ANSB = 0XFF;
OEB = 0X00;
PUB = 0x00;
#asm
goto APP_StartAddr //跳转用户区
#endasm
}
}
}
二、通信
接下来只需要等待上位机发送更新内容,然后把数据写入Flash中即可,此处代码较多就不贴出来了。
三、跳转用户区
更新完成后再次软复位,会回到第一步,此时更新标志等都没有后,就会跳转用户区
#asm
goto APP_StartAddr //跳转用户区
#endasm
四、用户程序
用户程序在接收到升级指令后,直接软复位即可。