社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1331|回复: 3

[求助] 要怎么设置TM4C129的中断向量表的偏移量呢?

[复制链接]

12

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-2-10 10:28:29 | 显示全部楼层 |阅读模式
我是用TM4C129做IAP升级,分为bootloader程序和app程序,flash空间前64KB(0x00000000~0x00010000)分配给bootloader程序,其余给APP程序(0x00010000~0x00100000)。
现在的情况是程序可以从bootloader程序跳转到app程序了,但是 跳转后执行一会儿就死机了(串口内容只打印了一半),目测是 APP程序的中断向量表没有设置好;因为当APP程序中有中断产生时,TM4C129的 PC 指针仍强制跳转到地址0X00000004 中断向量表处,而不是新程序的中断向量表(0x00010004),所以在APP程序开始处需要设置中断向量表的偏移量,在stm32中用  SCB->VTOR = FLASH_BASE | 0x10000; 来设置,不知道在TM4C129中要如何设置这个偏移量?
我用  HWreg(NVIC_VTABLE) = 0x10000;  这一句不行。谢谢。

此帖出自最爱TI M4论坛


回复

使用道具 举报

983

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2017-2-10 13:18:09 | 显示全部楼层
我记得 TI M4 自己的 Demo 程序的 Bootloader 和 APP 都有各自的中断向量表表,跳转到 APP 之前,会将 APP 的中断表从 Flash 复制到 RAM 中,所以最好是看一下 Demo 程序是怎么实现的。然后再琢磨一下它为什么要这么处理。


回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2017-2-10 15:07:30 | 显示全部楼层
academic 发表于 2017-2-10 13:18
我记得 TI M4 自己的 Demo 程序的 Bootloader 和 APP 都有各自的中断向量表表,跳转到 APP 之前,会将 APP  ...

确实有把中断向量表复制到ram区,是在中断注册函数里,源码如下:
void
IntRegister(uint32_t ui32Interrupt, void (*pfnHandler)(void))
{
    uint32_t ui32Idx, ui32Value;

    //
    // Check the arguments.
    //
    ASSERT(ui32Interrupt < NUM_INTERRUPTS);

    //
    // Make sure that the RAM vector table is correctly aligned.
    //
    ASSERT(((uint32_t)g_pfnRAMVectors & 0x000003ff) == 0);

    //
    // See if the RAM vector table has been initialized.
    //
    if(HWREG(NVIC_VTABLE) != (uint32_t)g_pfnRAMVectors)
    {
        //
        // Copy the vector table from the beginning of FLASH to the RAM vector
        // table.
        //
        ui32Value = HWREG(NVIC_VTABLE);
        for(ui32Idx = 0; ui32Idx < NUM_INTERRUPTS; ui32Idx++)
        {
            g_pfnRAMVectors[ui32Idx] = (void (*)(void))HWREG((ui32Idx * 4) +
                                                             ui32Value);
        }

        //
        // Point the NVIC at the RAM vector table.
        //
        HWREG(NVIC_VTABLE) = (uint32_t)g_pfnRAMVectors;
    }

    //
    // Save the interrupt handler.
    //
    g_pfnRAMVectors[ui32Interrupt] = pfnHandler;

     

}


搞不懂他为什么要把中断向量表弄到ram区里,这样做有什么好处吗?

点评

应该是为了能够更快地响应中断吧,这样做其实也很合理。  详情 回复 发表于 2017-2-21 10:14


回复

使用道具 举报

983

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2017-2-21 10:14:56 | 显示全部楼层
ypp240124016 发表于 2017-2-10 15:07
确实有把中断向量表复制到ram区,是在中断注册函数里,源码如下:
void
IntRegister(uint32_t ui32Inte ...

应该是为了能够更快地响应中断吧,这样做其实也很合理。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-11-19 14:29 , Processed in 0.260034 second(s), 15 queries , Redis On.

快速回复 返回顶部 返回列表