volzhcan 发表于 2010-12-24 11:53:20

LPC1114做IAP时实现了程序刷新和跳转,但无法调用中断,求教向量表应如何设置

1 做好了IAP driver,放在flash的第0区,最后有一个函数指针跳转到0x40C1(应用程序的image entry)。
2 编译应用程序时将IROM设为0x4000起始。
3 将两个hex文件用flash magic分别烧写,或者将应用程序编译后生成的hex转为bin,通过串口发给IAP driver。都可以实现IAP driver到应用程序的跳转,但应用程序里的中断却无法调用。

看到周立功的IAP例程,里面给的应用程序包是二进制文件,没有源码,用UE打开之后起始位置处并没有中断向量,这个是如何实现的呢?之后又参考了stm32的IAP例程,它的应用程序中调用了下面的函数
void NVIC_Configuration(void)
{
/* Set the Vector Table base location at 0x2000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
}

但LPC1114的user manual里似乎没有设置向量表地址的相关寄存器,请问中断向量表应该如何配置?

附周立功IAP的源码及stm32的官方例程和文档
周立功LPC1114_IAPourdev_606804IRT7DM.zip(文件大小:84K) (原文件名:TinyM0_Routine_IAP.zip)
stm32 iap说明文档ourdev_606805W6IUZZ.pdf(文件大小:276K) (原文件名:13588.pdf)
stm32 iap codeourdev_606806XHOHHG.zip(文件大小:299K) (原文件名:an2557.zip)

volzhcan 发表于 2010-12-24 15:53:05

刚在网上找到些资料,其中一段是这样说的

STM32 支持中断向量表映射。cortex-M3核有专门的向量偏移寄存器,该寄存器决定:
   1. 向量表是位于FLASH还是RAM,向量表的基址
   2. 向量表的偏移量

M0核的LPC1114似乎没有向量偏移寄存器,看来只有把中断向量表映射到RAM中去了

volzhcan 发表于 2010-12-25 14:30:27

昨晚搞定了,呵呵。看网上说在启动代码里面将向量表中的内容搬进RAM,把汇编代码拷过去编译总报错,说什么当前指令集不支持的操作符或立即数之类的,干脆就在main里面用C语言做了,然后就OK了。

不过还是搞不明白有些可以用C实现的功能,为啥偏偏要写在启动代码的汇编里呢?

ritchie 发表于 2011-4-26 22:41:08

请问楼主如何搞定的?

nxp 有一个应用笔记:

    AN10995 LPC1100 secondary bootloader V1 (Oct 13, 2010) with software (Oct 13, 2010)
但是我看代码都是手工搞定映射。 在secondary bootloader针对每个中断程序加入函数调用, 跳转到真正的地址上。
很麻烦, 不方便。

实际上 STM32 和 LM3Sxx 系列都提供了设定中断向量基址的函数, 比如您所提到的 STM32的例子, 实际上是修改了一个
寄存器, 貌似地址为: 0x4004 ED08。

NXP 的LPC1768中将此寄存器称之为 VTOR, 可否实现修改地址还没验证。
我又翻了一下 LPC1343 和 LPC1114 的 user manual, 都没有此寄存器
的详细说明。LPC1114文档中一字未提, LPC1343文档中稍微了一下,
不知道在此芯片中可否使用。

bpshui 发表于 2011-5-17 23:39:52

楼主是否有QQ,方便交流一下

sjzd 发表于 2011-7-11 20:15:18

zlg的例子里有的吧,向量表重映射到ram


void targetInit (void)
{
    INT32U i, uiRegVal;
    extern void *__GpvVectorTable[];
    zyIrqDisable();
   
    SYSMEMREMAP = 0x02;                                                 /*异常向量表重映射            */
    VTOR      = (unsigned long)__GpvVectorTable;
    SYSOSCCTRL= 0x00;                                                 /*振荡器频率工作范围选择      */

    PDRUNCFG &= ~(0x1ul << 5);                                          /*系统振荡器上电            */
    for ( i = 0; i < 0x100; i++ ) {                                     /*等待振荡器稳定            */
    }
    SYSPLLCLKSEL = MAIN_CLKSRCSEL_VALUE;                              /*选择系统振荡器OSC         */
    SYSPLLCLKUEN = 0x00;                                                /*切换时钟源                  */
    SYSPLLCLKUEN = 0x01;                                                /*更新时钟源                  */
    while (!(SYSPLLCLKUEN & 0x01)) {                                    /*等待更新完成                */       
    }
    uiRegVal   = SYSPLLCTRL;
    uiRegVal&= ~0x1FF;
    SYSPLLCTRL = (uiRegVal | (PLL_PVALUE << 5) | PLL_MVALUE);         /*预分频:M+1 与 2*P          */
    PDRUNCFG&= ~(0x01ul << 7);                                        /*系统MAIN PLL上电            */
    while (!(SYSPLLSTAT & 0x01)){                                       /*等待锁定                  */
    }
    MAINCLKSEL = 0x03;                                                /*选择PLL输出               */
    MAINCLKUEN = 0x01;                                                /*更新MCLK时钟源选择          */
    MAINCLKUEN = 0x00;                                                /*翻转更新寄存器            */
    MAINCLKUEN = 0x01;
    while (!(MAINCLKUEN & 0x01)) {                                    /*等待更新完成                */
    }
    SYSAHBCLKDIV = SYS_AHB_DIV_VALUE;                                 /*SYStem AHB时钟分频          */
   
    SYSAHBCLKCTRL |= (1ul << 16);                                       /*使能AHB总线时钟             */
                                                                        /*否则无法配置ICON            */
    zyIrqEnable();
    zyIfInit();
    return;
}


void *const __GpvVectorTable[] = {
   (void *)RAM_TOP,
   (void *)__main,
   (void *)(NMI_HANDLE),
   (void *)(HARD_FAULT_HANDLE),
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
   (void *)(SVCALL_HANDLE),
   (void *)(DEBUG_MON_HANDLE),
    NULL,
   (void *)(PEND_SV_HANDLE),
   (void *)(SYS_TICK_HANDLE),

   (void *)IRQ_16_HANDLE,
   (void *)IRQ_17_HANDLE,
   (void *)IRQ_18_HANDLE,
   (void *)IRQ_19_HANDLE,

   (void *)IRQ_20_HANDLE,
   (void *)IRQ_21_HANDLE,
   (void *)IRQ_22_HANDLE,
   (void *)IRQ_23_HANDLE,
   (void *)IRQ_24_HANDLE,
   (void *)IRQ_25_HANDLE,
   (void *)IRQ_26_HANDLE,
   (void *)IRQ_27_HANDLE,
   (void *)IRQ_28_HANDLE,
   (void *)IRQ_29_HANDLE,

   (void *)IRQ_30_HANDLE,
   (void *)IRQ_31_HANDLE,
   (void *)IRQ_32_HANDLE,
   (void *)IRQ_33_HANDLE,
   (void *)IRQ_34_HANDLE,
   (void *)IRQ_35_HANDLE,
   (void *)IRQ_36_HANDLE,
   (void *)IRQ_37_HANDLE,
   (void *)IRQ_38_HANDLE,
   (void *)IRQ_39_HANDLE,

   (void *)IRQ_40_HANDLE,
   (void *)IRQ_41_HANDLE,
   (void *)IRQ_42_HANDLE,
   (void *)IRQ_43_HANDLE,
   (void *)IRQ_44_HANDLE,
   (void *)IRQ_45_HANDLE,
   (void *)IRQ_46_HANDLE,
   (void *)IRQ_47_HANDLE,
   (void *)IRQ_48_HANDLE,
   (void *)IRQ_49_HANDLE,

   (void *)IRQ_50_HANDLE,
   (void *)IRQ_51_HANDLE,
   (void *)IRQ_52_HANDLE,
   (void *)IRQ_53_HANDLE,
   (void *)IRQ_54_HANDLE,
   (void *)IRQ_55_HANDLE,
   (void *)IRQ_56_HANDLE,
   (void *)IRQ_57_HANDLE,
   (void *)IRQ_58_HANDLE,
   (void *)IRQ_59_HANDLE,

   (void *)IRQ_60_HANDLE,
   (void *)IRQ_61_HANDLE,
   (void *)IRQ_62_HANDLE,
   (void *)IRQ_63_HANDLE,
   (void *)IRQ_64_HANDLE,
   (void *)IRQ_65_HANDLE,
   (void *)IRQ_66_HANDLE,
   (void *)IRQ_67_HANDLE,
   (void *)IRQ_68_HANDLE,
   (void *)IRQ_69_HANDLE,

   (void *)IRQ_70_HANDLE,
   (void *)IRQ_71_HANDLE,
   (void *)IRQ_72_HANDLE,
};


---------------------------------------------------------------------------------------------------
最近也要做类似lz的东东,一个boot,一个app以前在nxp的lpc21xx、23xx和 Ti的lm3s上做过

hancker 发表于 2012-7-12 10:42:59

楼主,请问你是怎么解决的?
我现在用的芯片情况跟你很相似。armv6内核。好像这款,都没有VTOR寄存器
你上面说的“启动代码里面将向量表中的内容搬进RAM”是怎么实现的?
楼上说的,那是有VTOR寄存器的情况。
这句:
SYSMEMREMAP = 0x02;                                                 /*异常向量表重映射            */不太明白为什么这么做?

LiuShengAn 发表于 2012-7-12 11:50:43

我也是在Bootloader的每一个中断加一个跳转到APP的中断服务程序,但这样比较麻烦,而且Bootloader不能使用中断了。不知道还有没有更好的方法。
页: [1]
查看完整版本: LPC1114做IAP时实现了程序刷新和跳转,但无法调用中断,求教向量表应如何设置