首先看BOOT代码程序跳转部分部分
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
JumpAddress = *(__IO uint32_t *)(appxaddr + 4);// jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
jump2app = (iapfun)JumpAddress;
__set_MSP(*(volatile uint32_t*)appxaddr);//MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址 (__IO uint32_t *)
jump2app(); //跳转到APP.
}
}
因为mm32f0131是M0内核的单片机目前的库函数中没有SCB->VTOR这个中断向量表重定义的寄存器于是我们可以通过以下方法来实现中断向量表重定义。
基本思想:
1、将中断向量表放入到RAM的起始地址(只需要在应用程序中保留RAM起始地址的0x100大小不使用即可)。
2、在Bootloader中将应用程序的中断向量表从Flash中拷贝到RAM中。
3、设置MM32F013中断向量表位于RAM中
在APP的程序中添加如下代码
#define APP_START_ADDRESS (uint32_t)(0x8008000)
main()
{
memcpy((uint8_t *)SRAM_BASE, (uint8_t *)APP_START_ADDRESS, 48*4); //这里复制中断向量表
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
.
.
.
.
.
}
我这里把flash的起始地址设为0x8008000,可以根据需要进行修改 要注意的是 48*4 是因为我使用的该款单片机有48个中断向量每个向量4个字节 不同的单片机可能存在不同。
在app程序中设置地址
0x8008000设置是因为我app的flash起始地址是这个
0x20000C0的设置是因为我使用的该款单片机有48个中断向量*4即为C0
BOOT部分原码:https://download.csdn.net/download/qxw0923/19823759?spm=1001.2014.3001.5501