记录下使用RAM中断向量表的常规写法:
首先需要在link文件中指定vector_rom及vector_ram的位置,
VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address
* (RESET,+FIRST)
}
在map文件中有如下定义后可以在c代码中引申这些变量定义值
extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
extern uint32_t __VECTOR_TABLE[];
extern uint32_t __VECTOR_RAM[];
#if defined(USE_RAM_VECTOR_TABLE)
/**
* @brief 把中断向量表复制一份到SDRAM,并使用该中断向量表
* @note 适用于nor_sdram_code版本的程序,芯片上电后把所有代码加载至SDRAM中运行,
使用SDRAM的中断向量表后,中断产生时CPU不需要访问FLASH
* @retval 无
*/
void CopyAndUseRAMVectorTable(void)
{
/* 根据不同编译平台的分散加载文件得到VECTOR_TABLE 和 VECTOR_RAM的地址*/
#if defined(__CC_ARM)
/* ROM、RAM中的中断向量表基地址(MDK分散加载文件的语法) */
extern uint32_t Image$$VECTOR_ROM$$Base[];
extern uint32_t Image$$VECTOR_RAM$$Base[];
/* SDRAM主体代码的基地址,用于计算VECTOR_RAM占用的空间 */
extern uint32_t Image$$ER_m_ram_text$$Base[];
#define __VECTOR_TABLE Image$$VECTOR_ROM$$Base
#define __VECTOR_RAM Image$$VECTOR_RAM$$Base
#define __RAM_VECTOR_TABLE_SIZE (((uint32_t)Image$$ER_m_ram_text$$Base - (uint32_t)Image$$VECTOR_RAM$$Base))
#elif defined(__ICCARM__)
/* ROM、RAM中的中断向量表的大小和基地址(IAR分散加载文件的语法) */
extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
extern uint32_t __VECTOR_TABLE[];
extern uint32_t __VECTOR_RAM[];
#elif defined(__GNUC__)
/* 暂未测试GCC开发环境 */
extern uint32_t __VECTOR_TABLE[];
extern uint32_t __VECTOR_RAM[];
extern uint32_t __RAM_VECTOR_TABLE_SIZE_BYTES[];
uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES);
#endif /* defined(__CC_ARM) */
uint32_t n;
uint32_t irqMaskValue;
irqMaskValue = DisableGlobalIRQ();
if (SCB->VTOR != (uint32_t)__VECTOR_RAM)
{
/* 把中断向量表的内容从ROM复制至RAM */
for (n = 0; n < ((uint32_t)__RAM_VECTOR_TABLE_SIZE) / sizeof(uint32_t); n++)
{
__VECTOR_RAM[n] = __VECTOR_TABLE[n];
}
/* 调整Cortex-M内核的VTOR寄存器指向RAM版本的中断向量表
* 后面产生中断时会从VTOR寄存器指向的地址加载中断
*/
SCB->VTOR = (uint32_t)__VECTOR_RAM;
}
EnableGlobalIRQ(irqMaskValue);
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
exception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U)
__DSB();
#endif
}
#endif