COLDFIRE系列處理器的中斷使用和其他單片機(jī)(如9S12)并不相同,可以說(shuō)功能更加強(qiáng)大,但是使用起來(lái)要復(fù)雜些。在FREESCALE論壇上,問(wèn)的最多的問(wèn)題也就是“進(jìn)不了中斷的問(wèn)題”,這也是COLDFIRE入門(mén)學(xué)習(xí)最棘手的問(wèn)題之一。
在COLDFIRE上使用中斷的流程基本是這樣的: 寫(xiě)SR開(kāi)全局中斷--->設(shè)置某中斷LEVEL和PRIO,寫(xiě)屏蔽碼--->編寫(xiě)中斷服務(wù)程序,寫(xiě)中斷向量表--->初始化并運(yùn)行程序 以下代碼均以使用PIT0產(chǎn)生每100ms一個(gè)中斷為例。 1、寫(xiě)SR開(kāi)全局中斷: 這個(gè)功能其實(shí)完全可以通過(guò)一句話來(lái)完成,在這里,必須寫(xiě)SR的16/17/18三位為0,才可以打開(kāi)全局中斷。這是初學(xué)者容易忽略和犯錯(cuò)誤的問(wèn)題。有些朋友已經(jīng)設(shè)置好中斷優(yōu)先級(jí)和等級(jí),打開(kāi)屏蔽,初始化好并且做好向量表,發(fā)現(xiàn)還是無(wú)法進(jìn)入中斷,問(wèn)題就是出在了這里。 大家需要注意的是,COLDFIRE單片機(jī)開(kāi)始運(yùn)行時(shí),SR中16/17/18三位的值都是1,這樣是關(guān)閉了所有中斷的,所以要使用中斷,必須把這三位都設(shè)置為0,這就相當(dāng)于一個(gè)總閘,如果你總閘不開(kāi),你怎么設(shè)置中斷都是不能夠運(yùn)行的。 用這句話來(lái)實(shí)現(xiàn): asm{ move.w #0x2000,SR }; 有了這句話寫(xiě)在MAIN函數(shù)的首位,全局中斷就打開(kāi)了。 2、設(shè)置中斷LEVEL和PRIO: COLDFIRE可以管理中斷的LEVEL和PRIO,必須設(shè)置它才可以使中斷工作。這點(diǎn)的具體內(nèi)容可以在DS的中斷控制器那章找到。在這里就不再具體講了,以PIT0為例,代碼如下: MCF_INTC0_ICR55 = MCF_INTC_ICR_IL(0x3) | MCF_INTC_ICR_IP(0x3); 這里設(shè)置的中斷LEVEL為3,中斷PRIO為3,這個(gè)都是用戶可以指定的。設(shè)置好LEVEL和PRIO,還必須打開(kāi)中斷屏蔽碼,否則中斷也無(wú)法工作了。以PIT0為例,代碼如下: MCF_INTC0_IMRH &= ~MCF_INTC_IMRH_INT_MASK55; //Open the local mask MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_MASKALL; // Open the maskall 這樣這部分工作就完成了。 3、編寫(xiě)中斷服務(wù)程序,寫(xiě)中斷向量表: 中斷服務(wù)程序中一般要清除中斷標(biāo)志,這點(diǎn)人人皆知了,但是在CW IDE 6.3/4中,聲明中斷服務(wù)程序有一個(gè)格式,以PIT0為例,必須寫(xiě)成: __declspec(interrupt:0) void PIT0_isr(void) { …… } 函數(shù)名可以自己起。跟9S12使用interrupt關(guān)鍵字有所不同。 另外需要寫(xiě)中斷向量表,一般在“xxxx_vector.s”文件中,到對(duì)應(yīng)位置,把定義的中斷服務(wù)程序名寫(xiě)入。這里要注意的是,函數(shù)名前必須加下劃線“_”,這個(gè)是指對(duì)應(yīng)的匯編程序,代碼如下: vector117: .long asm_exception_handler vector118: .long asm_exception_handler vector119: .long _PIT0_isr vector120: .long asm_exception_handler vector121: .long asm_exception_handler 在本文件中這樣寫(xiě)還是會(huì)提示錯(cuò)誤,因?yàn)橹袛喾?wù)程序是在其他文件中編寫(xiě)的,必須聲明它為外部函數(shù),這樣在此文件的前一部分加入: .extern _PIT0_isr 就可以了。 4、初始化并運(yùn)行程序: PIT0的初始化和ISR的編寫(xiě),在本系列學(xué)習(xí)文章的第五篇都有了。有興趣的可以翻閱一下以前的文章。 好,這就是使用COLDFIRE中斷的流程,不僅僅是PIT0,使用其他中斷也都是大同小異,希望能夠大家?guī)?lái)幫助。 到此,COLDFIRE學(xué)習(xí)系列的入門(mén)級(jí)文章就結(jié)束了,其他模塊其實(shí)也沒(méi)什么好寫(xiě)的。下一個(gè)系列將推出比較高級(jí)一點(diǎn)的文章,主要重點(diǎn)會(huì)放在嵌入式操作系統(tǒng)和以太網(wǎng)上。謝謝關(guān)注。 |
|
來(lái)自: WUCANADA > 《embedded》