Note:使用RAM中断向量表的常规方法

记录下使用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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值