【STM32】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)

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值