近两年stm芯片很难买到,公司以前做的一些产品,换成了GD芯片,重新做硬件,写程序。第一次用GD芯片做远程升级。其实和stm芯片远程升级大同小异,主要是实现flash的操作以及app和bootloader的互相跳转,当然还需要wifi芯片,本人选用的乐鑫的ESP8266,升级过程产品依然能正常操作,升级数据接受完成,复位一下就会运行升级后的APP程序。
大致思路如下。我是分两个工程来做的,分bootload工程和APP工程,当然也看过同行用一个工程实现的文章,具体部分也没说出来,我觉得分两个工程也不影响什么,不钻这个牛角尖。bootloader工程需要设置flash使用的大小,stm芯片也是一样,起始地址0x8000000不变,我这里是0x4000≈16K,也够用了,用stm32芯片的时候我设置的是64k,我是考虑以后领导提要求bootloader可能会做复杂,实际上不需要留这么大空间。
这个设置好之后就是程序部分了。我这里只贴核心部分代码,具体一些防护措施(升级程序的各种情况的判断和处理)就不贴出来了,后面完整工程会上传到CSDN上。
bootloader最重要是2个部分,从应用层读取升级文件,覆盖之前的APP程序(当然也可以不用覆盖以前的APP程序,直接运行接受到的升级程序,那么需要注意新APP的flash起始地址。),还有从BootLoader跳转到APP程序,代码如下:
#define APP_LOADED_ADDR 0x08004000
#define FLASH_APP1_ADDR 0x08004000
void iap_load_app(uint32_t appxaddr)
{
if (((*(__IO uint32_t*)APP_LOADED_ADDR) & 0x2FFE0000) == 0x20000000) {
app_address = *(__IO uint32_t*) (APP_LOADED_ADDR + 4);
application = (pAppFunction) app_address;
__set_MSP(*(__IO uint32_t*) APP_LOADED_ADDR);
application();
}
}
void jumpToApp(void)
{
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)
{
iap_load_app(FLASH_APP1_ADDR);//
}
}
flash操作部分比较多,就不贴出来了,后面可看我的完整工程文件。当然如果时间够我也可以整理贴出来。
APP部分:从wifi模块接受升级程序,是bin文件。这个需要在APP和在涂鸦网站进行相应的操作。由于时间关系,我后面再整理文章发出来。
APP工程需要设置flash的起始地址和大小。这里要和bootloader对应,起始地址从0x8004000开始。总的大小就是0x3C000=0x40000-0x4000。
然后,配置flash的起始地址nvic_vector_table_set(NVIC_VECTTAB_FLASH, flash_run_add); 就是APP跳转到bootloader,就2句代码:__disable_irq();NVIC_SystemReset();
flash的操作后面写文章介绍。下班了!