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

Arm LPC1114引导加载程序轮询和用户应用程序中断,arm,bootloader,cortex-m,Arm,Bootloader,Cortex M,Keil UV4开发系统,LPC1114 正在运行引导加载程序:0x0000.0000-0x0000.2000,用户应用程序:0x0000.2000-0x0000.6000 问题-如何配置使用轮询的引导加载程序和使用中断的用户应用程序 我指的是NXP appnote 10995,以及中断的重新定向,然而,在这种情况下,引导加载程序不使用中断,而用户应用程序使用中断。当用户应用程序生成中断时,LPC114中断向量位于扇区0(引导加载程序)中 我理解位于扇区0的中断向量必须以某种方式重定向到位于0x

Keil UV4开发系统,LPC1114 正在运行引导加载程序:0x0000.0000-0x0000.2000,用户应用程序:0x0000.2000-0x0000.6000

问题-如何配置使用轮询的引导加载程序和使用中断的用户应用程序

我指的是NXP appnote 10995,以及中断的重新定向,然而,在这种情况下,引导加载程序不使用中断,而用户应用程序使用中断。当用户应用程序生成中断时,LPC114中断向量位于扇区0(引导加载程序)中


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

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

不幸的是,我在先前的回答中对您的处理器做出了错误的假设。Cortex-M0不能像Cortex-M3那样更改向量表的偏移量

因此,在处理器(M0)的情况下,当中断发生时,引导和应用程序使用相同的向量表,这是由引导定义的。因此,无论您计划在应用程序中使用什么样的中断,都必须由引导定义,以便将它们重定向到应用程序的ISR。您可以通过将ISR函数定义为re direct函数来实现,以便调用为应用程序创建的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"); 
} 
在上面的例子中,就是这样发生的

  • ISR向量指向引导程序定义的
    SysTick\U处理程序()
    的地址
  • SysTick\U处理程序()
    重定向到应用程序ISR。它通过从应用程序的向量表中读取应用程序ISR的地址来实现

  • 只要不为引导加载程序启用中断,ISR就可以通过使用重定向在应用程序中正常工作。如果您想为引导加载程序启用中断,那么您必须更具创造性。

    谢谢您的明确建议。一项,VT或LPC1114上没有。对此表示抱歉。我应该先检查一下你的设备。我会再调查一下,然后再给你打电话。好了。。。这应该更有意义。因此,引导加载程序在禁用中断的情况下使用systick轮询,而用户应用程序在启用中断的情况下使用systick轮询。我在0x2000以完全擦除方式加载用户应用程序,然后仅以扇区擦除方式加载引导加载程序。从引导加载程序启动调试并查看systick轮询,然后在超时后跳转到用户应用程序,该应用程序应运行systick中断,并允许引导加载程序中的断点查看中断结果-尚未发生。。有没有办法在debug中查看引导加载程序和用户应用程序?@user3613165,我还没有尝试过,但您可能可以使用引导和应用程序创建一个映像,这样您就可以同时调试这两个应用程序。我通常是在调试模式下运行应用程序,从0x00000000开始将其烧录到芯片上。我使用#define来确保我执行了一些通常通过引导完成的设置项目(振荡器等)。然后,我在调试模式下运行应用程序,而不在设备上启动。在这种情况下,我会检查以确保应用程序的ISR设置和功能符合我的预期(无需启动)。