搜索
bottom↓
回复: 7

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

[复制链接]

出0入0汤圆

发表于 2010-12-24 11:53:20 | 显示全部楼层 |阅读模式
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)

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2010-12-24 15:53:05 | 显示全部楼层
刚在网上找到些资料,其中一段是这样说的

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

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

出0入0汤圆

 楼主| 发表于 2010-12-25 14:30:27 | 显示全部楼层
昨晚搞定了,呵呵。看网上说在启动代码里面将向量表中的内容搬进RAM,把汇编代码拷过去编译总报错,说什么当前指令集不支持的操作符或立即数之类的,干脆就在main里面用C语言做了,然后就OK了。

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

出0入0汤圆

发表于 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文档中稍微了一下,
不知道在此芯片中可否使用。

出0入0汤圆

发表于 2011-5-17 23:39:52 | 显示全部楼层
楼主是否有QQ,方便交流一下

出0入0汤圆

发表于 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上做过

出0入0汤圆

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

出0入0汤圆

发表于 2012-7-12 11:50:43 | 显示全部楼层
我也是在Bootloader的每一个中断加一个跳转到APP的中断服务程序,但这样比较麻烦,而且Bootloader不能使用中断了。不知道还有没有更好的方法。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 06:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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