韩啸
摘要:该文介绍了KL25中断的基本概念、中断向量表文件,分析说明了KL25中断服务程序及ARM Coretex-M0+非内核中断编程结构, 最后给出UART接收中断程序实例。
关键词:KL25;中断;中断向量表;UART
中图分类号: TP338 文献标识码:A 文章编号:1009-3044(2014)21-5134-02
所谓中断,是指MCU在正常运行程序时,由于MCU内核异常或者MCU各模块发出请求事件,引起MCU停止正在运行的程序,而转去处理异常或执行处理外部事件的程序(又称中断服务程序)。
这些引起MCU中断的事件称为中断源。KL25的中断源分为两类:内核中断和非内核中断。内核中断主要是异常中断,即当出现错误时,这些中断会复位芯片或是做出其他处理。非内核中断是指MCU各个模块为中断源引起的中断, MCU执行完中断服务程序后,又回到刚才正在执行的程序,从停止的位置继续执行后续的指令。非内核中断又称可屏蔽中断,可通过编程控制,开启或关闭该中断。
1 KL25中断向量表文件
中断向量序号是每一个中断源的固定编号,由芯片设计生产时决定的,编程时不能更改,它代表了中断服务程序入口地址在中断向量表的位置[1]。
中断向量表是指按照中断源的中断向量序号的固定顺序,存放中断服务程序入口地址的一段存储区域。每个中断服务程序入口地址占用4个字节单元,KL25中断向量表的位置在存储区0x0000_0000~0x0000_00c0的一段地址范围,共48*4=192个字节,存放48个中断服务程序的入口地址。中断服务程序的入口地址又称为中断向量或中断向量指针,它指向中断服务程序在存储器中的位置。
在中断向量表头文件vectors.h中,主要包含以下内容:定义了中断向量表的类型*vector_entry,用于vectors.c中定义中断向量表数组。申明要用到的中断服务函数,其中extern,指明是外部函数。将中断服务函数名进行宏定义,宏名与中断向量序号对应[2]。可把这项任务在“isr.h”中断服务程序头文件中实现。在中断向量表源文件vectors.c中,将vectors.h定义的中断向量放在rom_vector[]数组中。另外定义了_int_kernel_isr(void)空函数。到此,中断向量表文件编写完成,中断向量表也就实现了。
2 KL25的中断服务程序及其“注册”
为了规范编程将各个中断服务程序放在"isr.c"中断底层驱动构件源文件。中断服务程序的“注册”就是将用户编写好中断服务程序入口地址,添加到中断向量表中。实际是在中断向量表头文件vectors.h中,将宏定义的中断服务函数名替换成用户编写好中断服务程序名。在设计工程框架时将中断向量表文件封装起来,避免用户直接对中断向量表文件进行修改,而采用“宏回调”的方式为用户提供编程接口。用户只需在“isr.h”文件中取消对应中断向量表项“VECTOR_XXX”指向默认中断服务例程函数的映射,再重新指定该表项为用户自定义的中断服务例程函数即可。
3 ARM Coretex-M0+ 非内核模块中断编程结构
M0+中断结构原理图如图1所示。由模块中断源、中断控制器(NVIC)和M0+内核组成。其中断过程分为二步,①模块中断源向中断控制器(NVIC)发出中断请求信号。②中断控制器对发来的中断信号进行管理,判断该中断是否允许中断,若允许,通过私有外设总线发送给M0+内核,由内核进行中断处理;如果同时有多个中断信号到来,NVIC根据设定好的中断信号的优先级进行判断,优先级高的中断首先响应,优先级低的中断挂起,压入堆栈保存;如果优先级完全相同的多个中断源同时请求,则先响应IRQ中断号较小的,其他的被挂起[3]。
4 UART接收中断程序实例
本实例实现以下功能:在主函数文件UART1模块首先向PC机发送字符串“Hello World!”,主程序进入主循环闪烁蓝色指示灯,当PC机向串口1发送数时产生中断,执行中断服务程序。中断服务程序程序的功能是:成功接收数据后,马上将该数据回发给PC机。中断处理程序执行完毕后,又回到主程序。KL25中断编程的步骤:在中断底层驱动构件源文件isr.c中,写好中断服务函数 void isr_uart1_re(void);在中断底层驱动构件头文件isr.h中,将中断服务函数void isr_uart1_re(void)注册到中断向量表中。在UART.C构件中写好串口接收中断使能,初始化函数uart_enable_re_int(uint_8 uartNo)。在主函数文件(main.c)中,调用uart_enable_re_int(uint_8 uartNo)函数,使能串口UART1模块接收中断的功能。
参考文献:
[1] 杨明.Freescale HCS08单片机原理及应用[M].北京:电子工业出版社,2011:162-168.
[2] 王宜怀.嵌入式技术基础与实践[M].北京:清华大学出版社,2013:124-132.
[3] 王宜怀.基于32位ColdFire构建嵌入式系统[M].北京:电子工业出版社,2009:116-122.