LPC1114引导加载程序 - 轮询和用户应用程序中断

时间:2014-07-15 14:59:39

标签: arm bootloader cortex-m

Keil UV4开发系统,LPC1114 运行bootloader:0x0000.0000-0x0000.2000,用户app:0x0000.2000-0x0000.6000

问题 - 如何使用轮询和使用中断的用户应用程序配置Bootloader

我一直在指NXP appnote 10995,并重新指示中断,但在这种情况下,引导加载程序不使用中断,而用户应用程序也是如此。当用户应用程序生成中断时,LPC114中断向量位于扇区0(引导加载程序)中。

我理解位于扇区0的中断向量必须以某种方式重定向到位于0x0000.2000的中断处理程序,但是中断代码是否仍然需要包含在引导加载程序中以允许来自中断处理程序的重定向功能?

1 个答案:

答案 0 :(得分:1)

即使引导加载程序没有使用它们,仍会在启动文件(startup_LPC11xx.s)中为引导加载程序定义中断向量。至少需要初始堆栈指针值,复位向量,NMI向量和硬故障向量。

不幸的是,我在之前关于你的处理器的回答中做了一个不正确的假设。 Cortex-M0无法像Cortex-M3那样将偏移量更改为向量表。

因此,对于处理器(M0),引导和应用程序在发生中断时使用相同的向量表 - 由引导定义。因此,无论您计划在应用程序中使用什么中断,都必须由引导程序定义,以便将它们重定向到应用程序的ISR。您可以将ISR函数定义为重定向函数,以便为您的应用程序创建ISR。

您提到的应用说明中给出的示例完全符合我的描述:

void SysTick_Handler(void) 
{ 
    /* Re-direct interrupt, get handler address from 
       application vector table */ 
    asm volatile("ldr r0, =0x203C"); 
    asm volatile("ldr r0, [r0]"); 
    asm volatile("mov pc, r0"); 
} 

在上面的情况中,这就是发生的事情......

  1. ISR会引导至引导所定义的SysTick_Handler()的地址。
  2. SysTick_Handler()重定向到应用程序ISR。它通过从应用程序的向量表中读取应用程序ISR的地址来实现。
  3. 只要您不为启动加载程序启用中断,ISR就可以通过使用重定向在您的应用程序中正常运行。如果您想为启动加载程序启用中断,那么您必须更具创造性。