程序是用户程序,为了实现配合bootloader使用:
中断向量表g_pfnVectors的地址是在链接文件里面决定的,可以是0x08000000(第一个sector,无bootloader),或者是0x08020000(第二个sector,第一个sector给bootloader用)
在程序启动的时候,读出g_pfnVectors的地址,直接写到SCB->VTOR里面,这样就可以不管它实际的位置了。是否使用bootloader,就需要修改ld文件,程序的部分不用改动。
代码
[C] 纯文本查看 复制代码 void InitNVIC()
{
uint32_t i = 0;
__set_PRIMASK(1); // 关闭全局中断
/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/* 关闭所有中断,清除所有中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
/* 设置中断向量表偏移量 */
extern uint32_t *g_pfnVectors;
uint32_t gvaddr = (uint32_t)g_pfnVectors;
SCB->VTOR = gvaddr;
__set_PRIMASK(0); // 打开全局中断
}
在编译后的文件中,可以看到中断向量表的位置在0x08000000
但是,在程序中读取,地址却是0x20020000
根据datasheet,这个地址是reserved
|