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) 刚在网上找到些资料,其中一段是这样说的
STM32 支持中断向量表映射。cortex-M3核有专门的向量偏移寄存器,该寄存器决定:
1. 向量表是位于FLASH还是RAM,向量表的基址
2. 向量表的偏移量
M0核的LPC1114似乎没有向量偏移寄存器,看来只有把中断向量表映射到RAM中去了 昨晚搞定了,呵呵。看网上说在启动代码里面将向量表中的内容搬进RAM,把汇编代码拷过去编译总报错,说什么当前指令集不支持的操作符或立即数之类的,干脆就在main里面用C语言做了,然后就OK了。
不过还是搞不明白有些可以用C实现的功能,为啥偏偏要写在启动代码的汇编里呢? 请问楼主如何搞定的?
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文档中稍微了一下,
不知道在此芯片中可否使用。 楼主是否有QQ,方便交流一下 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上做过 楼主,请问你是怎么解决的?
我现在用的芯片情况跟你很相似。armv6内核。好像这款,都没有VTOR寄存器
你上面说的“启动代码里面将向量表中的内容搬进RAM”是怎么实现的?
楼上说的,那是有VTOR寄存器的情况。
这句:
SYSMEMREMAP = 0x02; /*异常向量表重映射 */不太明白为什么这么做? 我也是在Bootloader的每一个中断加一个跳转到APP的中断服务程序,但这样比较麻烦,而且Bootloader不能使用中断了。不知道还有没有更好的方法。
页:
[1]