3.用户程序
如下图,用户程序的应定位到boot程序指定的用户程序开始地址处(示例中为0x8002000),另外在ram的前192个字节(48个32位地址)用于存放中断向量;

用户程序首先需要做的就是将中断向量从flash复制到ram,并将中断映射到ram,实现代码如下:
//用户程序存放地址(也是存放中断向量的flash地址)
#define APPLICATION_ADDRESS ((uint32_t)0x08002000)
//RAM中的中断向量
__IO uint32_t VectorTable[48]
__attribute__((at(0x20000000)));
int main(void)
{
uint32_t i;
GPIO_InitTypeDef GPIO_InitStructure;
//从flash中复制中断向量到ram
for(i = 0; i < 48; i++)
{
VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
//中断向量映射到RAM(开始地址处)
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
//__HAL_SYSCFG_REMAPMEMORY_SRAM();//如果是HAL库
//...
}
中断向量映射的原理其实就是存储器地址映射,以STM32G0的存储器地址为例,如下图。中断向量的地址总是在0x0000
0000,是不变的,好在这个地址是个可以映射的地址、没有具体分配给某一类存储器,如果这个地址映射到flash那这个地址就等同于0x0800
0000,如果映射到ram那这个地址就等同于0x2000
0000,也就是在中断产生时CPU就会从ram的中断对应处取指令。

示例代码请到
CAS-BOOT项目 下载!
|