Arm Kinetis中断处理程序代码战士

Arm Kinetis中断处理程序代码战士,arm,isr,codewarrior,Arm,Isr,Codewarrior,如何使用codewarrior处理ARM微控制器的中断??在HCs08处理器中,我会这样做,例如: interrupt VectorNumber_Vsci1rx void ISR_name(void) { .....Do something...... } 当然,在启用中断之后。。。 但是我不知道如何在使用codewarrior或KDS的ARM处理器中处理这些中断我使用了Kinetis K20(K20DX128VLH5)和codewarrior for MCU,并使用了这种方法。为了将某个方

如何使用codewarrior处理ARM微控制器的中断??在HCs08处理器中,我会这样做,例如:

interrupt VectorNumber_Vsci1rx void ISR_name(void) 
{
.....Do something......
}
当然,在启用中断之后。。。 但是我不知道如何在使用codewarrior或KDS的ARM处理器中处理这些中断

我使用了Kinetis K20(K20DX128VLH5)和codewarrior for MCU,并使用了这种方法。为了将某个方法声明为事件的处理程序,请查找应该随任何项目自动生成的类kinetis_sysinit.c。在这里,您将发现一个类似于我发布的以下代码的方法。这是中断向量表。如果您正在使用K20子系列中的内容,请下载。从ref手册第62页开始,您可以找到哪个向量对应于哪个模块

注意:根据您使用的Kinetis类型(K20 vs K40 vs K60等),过程可能会有所不同。查看设备参考手册,找出哪些中断向量对应于哪些中断向量

在下面的代码中,您可以看到我添加了一些自己的方法来处理GPIO、UART和定时器中断

/* The Interrupt Vector Table */
void (* const InterruptVector[])() __attribute__ ((section(".vectortable"))) =
{
    /* Processor exceptions */
    (void(*)(void)) &_estack,   // Vector 0
    __thumb_startup,            // Vector 1
    NMI_Handler,                // Vector 2
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    0,
    0,
    0,
    0,
    SVC_Handler,
    DebugMonitor_Handler,
    0,
    PendSV_Handler,
    SysTick_Handler,

    /* Interrupts */
    Default_Handler,    // Vector 16
    Default_Handler,    // Vector 17
    Default_Handler,    // Vector 18
    Default_Handler,    // Vector 19
    Default_Handler,    // Vector 20
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,    // Vector 30
    Default_Handler,
    (tIsrFunc)uart_status_handler,  // 32 is UART0 status sources
    Default_Handler,    // 33 is UART0 error sources
    Default_Handler,
    Default_Handler,    // Vector 35
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,    // Vector 40
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,    // Vector 45
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,    // Vector 50
    Default_Handler,
    Default_Handler,
    Default_Handler,
    Default_Handler,
    (tIsrFunc)timer_handler,        // Vector 55, LPTMR
    Default_Handler,    //(tIsrFunc)portA_button_handler,   // Vector 56, port A pin detect
    Default_Handler,
    (tIsrFunc)portC_button_handler, // Vector 58, port C pin detect
    Default_Handler,
    Default_Handler,
    Default_Handler,
};
在同一个类中,一定要在外部声明方法。在tIsrFunc的typedef结构的正下方,朝上写下如下内容:

extern void timer_handler(void);
extern void portC_button_handler(void);
extern void uart_status_handler(void);

您使用的是什么版本的CodeWarrior?您正在使用哪个工具集?如果您使用的是GCC工具集,那么中断名称是不同的,并且与默认处理程序的关联性很弱。只要用正确的名称创建一个中断,它就会工作。如果不使用GCC工具集,则必须在kinetis_sysinit.c中编辑数组。

我手头没有Codewarrior或KDE。但是所有遵循ARM-CMSIS标准的ARM控制器都是这样

控制器的所有中断处理程序都已定义,但具有弱链接。因此,您所要做的就是创建一个同名函数

例如,比较FRDM-K22板的MCUXpresso SDK中的文件设备\MK22F51212\arm\startup\u MK22F51212.s:

你的问题可以再具体一点。我只是向您展示了如何声明中断处理程序是什么方法,我没有包括如何启用实际中断(对于GPIO中断,这意味着设置NVICCPRx和NVICISERX,对于低功耗计时器,您需要设置LPTMR0_CSR=LPTMR_CSR_TIE_MASK,等等)