IAP代码架构工程
1、IAP一般分两个工程,一个Bootloader工程,一个Application工程。
这两个工程的差异后面会讲。
IAP架构工程的好处在于产品上线以后,想要升级的话,不用借助烧录器,就可以完成产品的软件升级。
2、Bootloader的跳转
一般bootloader工程从0x8000000处运行,跑到main函数以后,通过一个跳转函数,跳到Applicaiton的地址,运行Application程序。本实验Application烧录到0x8007000地址,所以在代码中直接 jump_app(0x08007000)。
typedef void (*jump_callback) (void);
uint8_t jump_app(uint32_t app_addr)
{
uint32_t jump_addr;
jump_callback cb;
if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000)
{
jump_addr = *(__IO uint32_t*) (app_addr + 4);
cb = (jump_callback)jump_addr;
__set_MSP(*(__IO uint32_t*)app_addr);
//__set_CONTROL(0);
cb();
return 1;
}
return 0;
}
修改GD32F303RCTx_FLASH.ld,将Bootloader.bin大小限制在20K。
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 20k
}
3、Application工程。开始可以直接copyBootloader工程,然后再修改即可。
1⃣️、修改Application的GD32F303RCTx_FLASH.ld文件,将起始地址修改为0x8007000、大小修改为50K
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K
FLASH (rx) : ORIGIN = 0x8007000, LENGTH = 50K
}
2⃣️、在main函数的最开始修改中断向量表。
这两句话是一样的
//设置中断向量表
nvic_vector_table_set(NVIC_VECTTAB_FLASH,0x7000);
//SCB->VTOR = 0x08007000; //设置中断向量表
4、烧录的差异。
boot烧录命令:
pyocd flash --erase auto --target GD32F303RC --base-address 0x8000000 ./Bootloader/build/Bootloader.bin
Application烧录命令:
pyocd flash --erase auto --target GD32F303RC --base-address 0x8007000 ./Application/build/Application.bin
5、代码里可以使用make gdboot或者make gdapp烧录。
6、启动打印如下。先打印boot,在打印Application。
7、代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git