GD32f303远程升级成功笔记上篇

       近两年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的操作后面写文章介绍。下班了!

相较于通用的GD32 IAP升级函数,GD32F303 IAP升级代码需要做一些针对性的修改。下面是一个简单的GD32F303 IAP升级源码示例: ```c #include "gd32f30x.h" #include "iap.h" #define IAP_APP_ADDRESS (uint32_t)0x08008000 // 应用程序起始地址 #define IAP_APP_SIZE (uint32_t)0x00070000 // 应用程序大小 #define IAP_APP_END_ADDRESS (IAP_APP_ADDRESS + IAP_APP_SIZE) // 应用程序结束地址 /** * @brief GD32F303 IAP升级函数 * @param[in] buf: 存储升级数据的缓冲区 * @param[in] len: 升级数据的长度 * @retval 升级结果 * @arg 0: 成功 * @arg 非0: 失败 */ uint8_t gd32f303_iap_upgrade(uint8_t* buf, uint32_t len) { uint32_t i = 0; uint32_t app_addr = IAP_APP_ADDRESS; // 检查升级数据的长度是否超出应用程序范围 if (len > IAP_APP_SIZE) { return 1; // 升级数据过长 } // 关闭所有中断 __disable_irq(); // 关闭Flash缓存 fmc_cache_disable(); // 使能Flash写入 fmc_unlock(); // 擦除应用程序 for (i = app_addr; i < IAP_APP_END_ADDRESS; i += FLASH_PAGE_SIZE) { fmc_page_erase(i); } // 写入升级数据 for (i = 0; i < len; i += 4) { fmc_word_program(app_addr + i, *(uint32_t*)(buf + i)); } // 校验升级数据 for (i = 0; i < len; i += 4) { if (*(uint32_t*)(buf + i) != *(uint32_t*)(app_addr + i)) { return 2; // 校验失败 } } // 升级成功,重启系统 NVIC_SystemReset(); return 0; } ``` 需要注意的是,GD32F303 IAP升级源码中需要对Flash缓存进行关闭操作,并且需要注意升级数据的长度是否超出应用程序范围。同时,在进行IAP升级时,需要注意数据的完整性和安全性,以避免因为升级失败导致微控制器无法正常工作。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值