这里写自定义目录标题
GD32IAP升级—BootLoader
本文记录并说明GD32使用IAP升级过程中,必要的操作和关键步骤。
IAP升级
IAP升级原理很简单,简要介绍如下:
先下载BootLoader程序,如果有需要对程序进行升级时,BootLoader通过串口或者其他接口接收升级程序,接收之后把接收到的文件放到指定位置,然后设置中断向量,最后跳转过去即可;
重点部分
1.中断向量设置
代码如下
// 设置偏移量
nvic_vector_table_set(FLASH_BASE,0x4000);//设置偏移量
2.程序起始地址设置说明
BootLoader中不需要设置程序其实地址,可以设置长度;
APP程序中需要设置程序起始地址:设置如下
升级出现的问题
判断程序地址出错
在代码中判断出错
f(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
原因分析:
1、可能是接收数据出错
2、可能是写数据出错
3、见下面分析
写入Flash之后,跳转失败
调用GD32的提供的fmc.c文件时在写数据到flash中时,fmc_write_32bit_data函数擦除数据的时候是一次性擦除需要用到的所有块,而第二次写入数据的时候会造成把刚刚写进去的数据又进行擦除,所以会导致,上面提到的判断程序地址出错
void fmc_write_32bit_data(uint32_t address, uint16_t length, int32_t* data_32)
{
uint16_t StartSector, EndSector,i;
/* unlock the flash program erase controller */
fmc_unlock();
/* clear pending flags */
fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_OPERR | FMC_FLAG_WPERR | FMC_FLAG_PGMERR | FMC_FLAG_PGSERR);
/* get the number of the start and end sectors */
StartS