IAR配置Cortex-M0的APP程序中断向量
1. 定义APP起始地址
根据MCU的Flash空间大小,以及IAP、APP程序大小合理分配Flash空间,下面以STM32F091单片机为例:
IAP程序地址: 0x08000000 ~ 0x08004FFF (20k)
APP程序地址:0x08005000 ~ 0x080127FF (54k)
APP下载地址:0x08012800 ~ 0x08020000 (54k)
#define FLASH_BASE 0x08000000
#define APP_REGION_ADDR (FLASH_BASE + 20 * 1024)
2. 重映射中断向量表
1)将APP的中断向量表拷贝到SRAM里面去。M0的中断向量表由48个有序字(32bit)组成,把它们从Flash区0x08005000开始的中断向量表拷贝到0x20000000的SRAM区。
2)存储地址映射,即把SRAM映射到代码执行区的地址0x00处。
/* 中断向量个数 */
#define M0_VECTOR_COUNT 48
#if (defined ( __CC_ARM ))
__IO uint32_t VectorTable[M0_VECTOR_COUNT] attribute((at(SRAM_BASE)));
#elif (defined (ICCARM))
__no_init __IO uint32_t VectorTable[M0_VECTOR_COUNT] @ (SRAM_BASE);
#elif defined ( GNUC )
__IO uint32_t VectorTable[M0_VECTOR_COUNT] attribute((section(".RAMVectorTable")));
#elif defined ( TASKING )
__IO uint32_t VectorTable[M0_VECTOR_COUNT] __at(SRAM_BASE);
#endif
#define SYSTEM_VECTOR_REMAP //定义宏函数
{
/* Copy the vector table from the Flash */
for(int i=0; i<M0_VECTOR_COUNT; i++)
{
VectorTable[i] = (__IO uint32_t)(APP_REGION_ADDR + (i * 4));
}
/* Remap SRAM at 0x00000000 */
__HAL_SYSCFG_REMAPMEMORY_SRAM();
}
3)在调试模式下查看中断向量表内容:
3. 配置工程Linker信息
1)修改Vector Table:对应APP起始地址:0x08005000
2)修改Memory Regions:
ROM起始地址:0x08005000
RAM起始地址:0x200000C0
其中:RAM的偏移地址 = 中断向量表(192Bytes)= 0xC0
4. 定义Bin文件信息地址
OTA升级的Bin文件信息地址存放于中断向量表之后,即0x080050C0,共占用12Bytes:包括关键字、基地址、文件ID。
其中,基地址即为用于记录升级文件版本信息的结构体地址。
/* 文件信息地址结构体 */
const version_addr_s g_version_addr_cfg @ (SYS_VERSION_ADDR) =
{
{0xAA, 0x55, 0xAA, 0x55}, // 关键字:0xAA55AA55
(uint32_t)((uint8_t *)(&g_version_info_cfg)), // 基地址:信息起始地址
{0x43, 0x48, 0x30, 0x31}, // 文件ID:0x43483031
};
/* APP程序版本信息 */
const version_cfg_s g_version_info_cfg = {
"Device", // 设备名称
__DATE__, // 编译日期
__TIME__, // 编译时间
0x10, // 版本号:V1.0
};
5. 验证Bin文件信息正确性
1)在调试模式下查看Flash内存信息:定位到地址0x080050C0
2)打开编译生成的bin文件信息:定位到地址0x080050C0
3)查看文件信息:定位到地址0x0800E070(0xAA55AA55之后的基地址)
6. 结束语
ARM Cortex-M0系列MCU中断向量表的重映射,与其它系列相比有点差异,即M0系列没有像M3、M4系列所具备的中断向量表重定位寄存器SCB->Vector,因此中断向量表不能直接在工程中配置生效。
友情链接(第1篇文章,诚挚感谢!)
[1] IAP升级 & Bootloader制作
[2] Stm32的内存管理(Code,RO-data,RW-data,ZI-data)