STM32G0[Cortex-M0+] Bootloader和APP实现
bootloader跳转
typedef void (*iapfun)(void); //定义一个函数类型的参数
iapfun jump2app;
void jump_to_app(u32 appxaddr)
{
if(((*(__IO uint32_t*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
NVIC->ICER[0] = 0XFFFFFFFF; //失能所有中断
jump2app=(iapfun)*(__IO uint32_t*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
__set_MSP(*(__IO uint32_t*)appxaddr); //初始化APP堆栈指针
jump2app(); //跳转到APP.
}
}
APP设置
keil设置
设置rom地址,bootloader跳转到这个地址,也就是jump_to_app()的目标地址。
修改偏移地址
打开system_stm32g0xx.c文件,修改代码如下:
#if defined(USER_VECT_TAB_ADDRESS)
/*!< Uncomment the following line if you need to relocate your vector Table
in Sram else user remap will be done in Flash. */
/* #define VECT_TAB_SRAM */
#if defined(VECT_TAB_SRAM)
#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field.
This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
#else
#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field.
This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET 0x00002800U /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
#endif /* VECT_TAB_SRAM */
#endif /* USER_VECT_TAB_ADDRESS */
APP设置完成