韓嘯
摘要:該文介紹了KL25中斷的基本概念、中斷向量表文件,分析說明了KL25中斷服務(wù)程序及ARM Coretex-M0+非內(nèi)核中斷編程結(jié)構(gòu), 最后給出UART接收中斷程序?qū)嵗?/p>
關(guān)鍵詞:KL25;中斷;中斷向量表;UART
中圖分類號(hào): TP338 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)21-5134-02
所謂中斷,是指MCU在正常運(yùn)行程序時(shí),由于MCU內(nèi)核異?;蛘進(jìn)CU各模塊發(fā)出請(qǐng)求事件,引起MCU停止正在運(yùn)行的程序,而轉(zhuǎn)去處理異?;驁?zhí)行處理外部事件的程序(又稱中斷服務(wù)程序)。
這些引起MCU中斷的事件稱為中斷源。KL25的中斷源分為兩類:內(nèi)核中斷和非內(nèi)核中斷。內(nèi)核中斷主要是異常中斷,即當(dāng)出現(xiàn)錯(cuò)誤時(shí),這些中斷會(huì)復(fù)位芯片或是做出其他處理。非內(nèi)核中斷是指MCU各個(gè)模塊為中斷源引起的中斷, MCU執(zhí)行完中斷服務(wù)程序后,又回到剛才正在執(zhí)行的程序,從停止的位置繼續(xù)執(zhí)行后續(xù)的指令。非內(nèi)核中斷又稱可屏蔽中斷,可通過編程控制,開啟或關(guān)閉該中斷。
1 KL25中斷向量表文件
中斷向量序號(hào)是每一個(gè)中斷源的固定編號(hào),由芯片設(shè)計(jì)生產(chǎn)時(shí)決定的,編程時(shí)不能更改,它代表了中斷服務(wù)程序入口地址在中斷向量表的位置[1]。
中斷向量表是指按照中斷源的中斷向量序號(hào)的固定順序,存放中斷服務(wù)程序入口地址的一段存儲(chǔ)區(qū)域。每個(gè)中斷服務(wù)程序入口地址占用4個(gè)字節(jié)單元,KL25中斷向量表的位置在存儲(chǔ)區(qū)0x0000_0000~0x0000_00c0的一段地址范圍,共48*4=192個(gè)字節(jié),存放48個(gè)中斷服務(wù)程序的入口地址。中斷服務(wù)程序的入口地址又稱為中斷向量或中斷向量指針,它指向中斷服務(wù)程序在存儲(chǔ)器中的位置。
在中斷向量表頭文件vectors.h中,主要包含以下內(nèi)容:定義了中斷向量表的類型*vector_entry,用于vectors.c中定義中斷向量表數(shù)組。申明要用到的中斷服務(wù)函數(shù),其中extern,指明是外部函數(shù)。將中斷服務(wù)函數(shù)名進(jìn)行宏定義,宏名與中斷向量序號(hào)對(duì)應(yīng)[2]。可把這項(xiàng)任務(wù)在“isr.h”中斷服務(wù)程序頭文件中實(shí)現(xiàn)。在中斷向量表源文件vectors.c中,將vectors.h定義的中斷向量放在rom_vector[]數(shù)組中。另外定義了_int_kernel_isr(void)空函數(shù)。到此,中斷向量表文件編寫完成,中斷向量表也就實(shí)現(xiàn)了。
2 KL25的中斷服務(wù)程序及其“注冊(cè)”
為了規(guī)范編程將各個(gè)中斷服務(wù)程序放在"isr.c"中斷底層驅(qū)動(dòng)構(gòu)件源文件。中斷服務(wù)程序的“注冊(cè)”就是將用戶編寫好中斷服務(wù)程序入口地址,添加到中斷向量表中。實(shí)際是在中斷向量表頭文件vectors.h中,將宏定義的中斷服務(wù)函數(shù)名替換成用戶編寫好中斷服務(wù)程序名。在設(shè)計(jì)工程框架時(shí)將中斷向量表文件封裝起來,避免用戶直接對(duì)中斷向量表文件進(jìn)行修改,而采用“宏回調(diào)”的方式為用戶提供編程接口。用戶只需在“isr.h”文件中取消對(duì)應(yīng)中斷向量表項(xiàng)“VECTOR_XXX”指向默認(rèn)中斷服務(wù)例程函數(shù)的映射,再重新指定該表項(xiàng)為用戶自定義的中斷服務(wù)例程函數(shù)即可。
3 ARM Coretex-M0+ 非內(nèi)核模塊中斷編程結(jié)構(gòu)
M0+中斷結(jié)構(gòu)原理圖如圖1所示。由模塊中斷源、中斷控制器(NVIC)和M0+內(nèi)核組成。其中斷過程分為二步,①模塊中斷源向中斷控制器(NVIC)發(fā)出中斷請(qǐng)求信號(hào)。②中斷控制器對(duì)發(fā)來的中斷信號(hào)進(jìn)行管理,判斷該中斷是否允許中斷,若允許,通過私有外設(shè)總線發(fā)送給M0+內(nèi)核,由內(nèi)核進(jìn)行中斷處理;如果同時(shí)有多個(gè)中斷信號(hào)到來,NVIC根據(jù)設(shè)定好的中斷信號(hào)的優(yōu)先級(jí)進(jìn)行判斷,優(yōu)先級(jí)高的中斷首先響應(yīng),優(yōu)先級(jí)低的中斷掛起,壓入堆棧保存;如果優(yōu)先級(jí)完全相同的多個(gè)中斷源同時(shí)請(qǐng)求,則先響應(yīng)IRQ中斷號(hào)較小的,其他的被掛起[3]。
4 UART接收中斷程序?qū)嵗?/p>
本實(shí)例實(shí)現(xiàn)以下功能:在主函數(shù)文件UART1模塊首先向PC機(jī)發(fā)送字符串“Hello World!”,主程序進(jìn)入主循環(huán)閃爍藍(lán)色指示燈,當(dāng)PC機(jī)向串口1發(fā)送數(shù)時(shí)產(chǎn)生中斷,執(zhí)行中斷服務(wù)程序。中斷服務(wù)程序程序的功能是:成功接收數(shù)據(jù)后,馬上將該數(shù)據(jù)回發(fā)給PC機(jī)。中斷處理程序執(zhí)行完畢后,又回到主程序。KL25中斷編程的步驟:在中斷底層驅(qū)動(dòng)構(gòu)件源文件isr.c中,寫好中斷服務(wù)函數(shù) void isr_uart1_re(void);在中斷底層驅(qū)動(dòng)構(gòu)件頭文件isr.h中,將中斷服務(wù)函數(shù)void isr_uart1_re(void)注冊(cè)到中斷向量表中。在UART.C構(gòu)件中寫好串口接收中斷使能,初始化函數(shù)uart_enable_re_int(uint_8 uartNo)。在主函數(shù)文件(main.c)中,調(diào)用uart_enable_re_int(uint_8 uartNo)函數(shù),使能串口UART1模塊接收中斷的功能。
參考文獻(xiàn):
[1] 楊明.Freescale HCS08單片機(jī)原理及應(yīng)用[M].北京:電子工業(yè)出版社,2011:162-168.
[2] 王宜懷.嵌入式技術(shù)基礎(chǔ)與實(shí)踐[M].北京:清華大學(xué)出版社,2013:124-132.
[3] 王宜懷.基于32位ColdFire構(gòu)建嵌入式系統(tǒng)[M].北京:電子工業(yè)出版社,2009:116-122.