0

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

interrupt VectorNumber_Vsci1rx void ISR_name(void) 
{
.....Do something......
}

在启用中断之后,当然......但我不知道如何使用 codewarrior 或 KDS 在 ARM 处理器中处理这些中断

4

3 回答 3

0

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

注意:该过程可能会有所不同,具体取决于您使用的 Kinetis 类型(K20、K40 和 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);
于 2015-04-14T15:23:44.377 回答
0

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

于 2015-09-02T19:45:52.367 回答
0

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

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

例如,比较 FRDM-K22 板的 MCUXpresso SDK 中的 File devices\MK22F51212\arm\startup_MK22F51212.s: https ://mcuxpresso.nxp.com/en/dashboard

于 2019-03-02T18:15:20.477 回答