飛思卡爾單片機(jī)中斷_第1頁(yè)
飛思卡爾單片機(jī)中斷_第2頁(yè)
飛思卡爾單片機(jī)中斷_第3頁(yè)
飛思卡爾單片機(jī)中斷_第4頁(yè)
飛思卡爾單片機(jī)中斷_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

FreescaleHCS12微控制器MC9S12DG128HCS12中斷默認(rèn)狀態(tài):在進(jìn)入中斷效勞程序時(shí),I位自動(dòng)置1,禁止其他可屏蔽中斷即使有優(yōu)先級(jí)更高的中斷請(qǐng)求,也必須等當(dāng)前中斷效勞程序執(zhí)行完以后才能響應(yīng)優(yōu)先級(jí)的作用只有在多個(gè)中斷源同時(shí)請(qǐng)求中斷時(shí)在能表達(dá)無法實(shí)現(xiàn)中斷嵌套如果在進(jìn)入中斷效勞程序時(shí),手動(dòng)對(duì)I位清零:任何其他可屏蔽中斷都可以被響應(yīng),無論其優(yōu)先級(jí)有多高中斷響應(yīng)由時(shí)間控制,可以實(shí)現(xiàn)中斷嵌套對(duì)中斷執(zhí)行無法預(yù)測(cè)HPRIO存放器寫入HPRIO中的中斷向量的后八位,可以改變?cè)撝袛嗟膬?yōu)先級(jí)同樣,優(yōu)先級(jí)的作用只有在多個(gè)中斷源同時(shí)請(qǐng)求中斷時(shí)在能表達(dá)在CW4.6環(huán)境下,中斷編程主要有兩種方式:第一種是使用“interrupt〞關(guān)鍵字,“interrupt〞關(guān)鍵字是一個(gè)非標(biāo)準(zhǔn)ANSI-C的關(guān)鍵字,因此,它不能被所有ANSI-C編譯器廠商所支持。同樣,對(duì)不同的編譯器,interrupt〞關(guān)鍵字的用法可能會(huì)改變?!癷nterrupt〞關(guān)鍵字同樣會(huì)提示編譯器下面的函數(shù)是一個(gè)中斷效勞例程。例:voidinterrupt20SCI0_ISR(void);其中,interrupt表示該函數(shù)為終端效勞程序,后面的20表示中斷號(hào)20,在這里SCI0的中斷向量號(hào)就是20.這種方法寫起來非常簡(jiǎn)單,但是,在S12單片機(jī)實(shí)際使用中,中斷號(hào)并沒有在手冊(cè)中給出,通常需要自己在中斷向量表中從上往下數(shù)出來,或者根據(jù)中斷向量計(jì)算得到,很容易出錯(cuò)。

于是有了第二種方法:在ISR程序之前,使用符號(hào)“#pragmaTRAP_PROC〞,TRAP_PROC提示編譯器下面的函數(shù)是中斷效勞例程。編譯器會(huì)用一個(gè)特殊的中斷返回指令來結(jié)束這個(gè)函數(shù)。此時(shí),中斷函數(shù)的書寫如下所示:#pragmaTRAP_PROCvoidSCI0_ISR(void){

...}

這時(shí)候編譯器不知道這個(gè)ISR指向那個(gè)中斷向量,我們需要在鏈接文件即:prm文件中指定之。使用VECTOR命令來實(shí)現(xiàn)中斷向量與ISR程序的連接。例:VECTOR0_Startup

//這是系統(tǒng)默認(rèn)prm文件中自帶的,即復(fù)位后0號(hào)中斷即復(fù)位中斷的ISR為_Startup()我們可以這樣寫:VECTOR20SCI0_ISR

//指定中斷號(hào)或者VECTORADDRESS0xFFD6SCI0_ISR

//直接指定中斷向量地址

注:使用#pragmaTRAP_PROC與修改prm文件的方法,在中斷效勞子程序的結(jié)尾處必須要手動(dòng)參加返回主程序的指令,包括取出堆棧、中斷返回兩個(gè)步驟。在S12單片機(jī)中,可以寫作asm{

pula;

rti;}

尾注:兩種方法所寫的中斷效勞子程序必須被放在非分頁(yè)存儲(chǔ)區(qū)內(nèi),即non_blankedcodeseg.其中一種常用的方法是在效勞子程序前聲明://下面代碼放在NON_BANKED區(qū)#pragmaCODE_SEGNON_BANKED在中斷程序后聲明://下面內(nèi)容按默認(rèn)放置#pragmaCODE_SEGDEFAULT

HCS12默認(rèn)中斷處理機(jī)制運(yùn)行運(yùn)行運(yùn)行等待運(yùn)行等待中斷A中斷B程序低優(yōu)先級(jí)高優(yōu)先級(jí)中斷A請(qǐng)求中斷B請(qǐng)求等待人人平等在可屏蔽中斷效勞程序中EnableInterrupts運(yùn)行運(yùn)行運(yùn)行等待運(yùn)行運(yùn)行等待中斷A中斷B程序低優(yōu)先級(jí)高優(yōu)先級(jí)中斷B請(qǐng)求中斷B被掛起中斷A請(qǐng)求長(zhǎng)幼不分采用中斷優(yōu)先處理機(jī)制運(yùn)行運(yùn)行等待運(yùn)行運(yùn)行等待中斷A中斷B程序低優(yōu)先級(jí)高優(yōu)先級(jí)中斷A請(qǐng)求中斷B請(qǐng)求中斷B返回運(yùn)行等級(jí)森嚴(yán)中斷優(yōu)先處理機(jī)制在中斷效勞程序中,首先對(duì)I為清零,即EnableInterrupts選擇優(yōu)先級(jí)更高的中斷源可以進(jìn)入響應(yīng)中斷設(shè)置優(yōu)先等級(jí)兩級(jí)一個(gè)中斷源為低優(yōu)先級(jí),其他為高優(yōu)先級(jí)在低優(yōu)先級(jí)中斷效勞程序中,對(duì)I位清零在高優(yōu)先級(jí)中斷效勞程序中,不清零多級(jí)利用局部的中斷屏蔽位比方TimerChannel0的中斷屏蔽位TIE_C0I優(yōu)先機(jī)制-兩級(jí)例如:中斷向量地址$FFF0–FFF1為低優(yōu)先級(jí)其他的中斷為高優(yōu)先級(jí)在$FFF0–FFF1中斷效勞程序中,EnableInterrupts(I位清零)其他的中斷包括自己都可以在中斷效勞程序執(zhí)行時(shí),被響應(yīng)在其他的中斷效勞程序中,I位不清零〔默認(rèn)〕只有當(dāng)前中斷效勞程序執(zhí)行完后,才能響應(yīng)其他的中斷請(qǐng)求當(dāng)同時(shí)有多個(gè)中斷源請(qǐng)求中斷時(shí),中斷向量地址最靠近$FFFF的,將會(huì)首先被響應(yīng)優(yōu)先機(jī)制–多級(jí)自定義優(yōu)先級(jí)中斷向量地址中斷源CCR屏蔽位局部屏蔽位HPRIO1中$FFEE,$FFEFECT通道0ITIE_C0I$EE0低$FFEC,$FFEDECT通道1ITIE_C1I$EC2高$FFEA,$FFEBECT通道2ITIE_C2I$EA要求:在低優(yōu)先級(jí)的中斷效勞程序中,高優(yōu)先級(jí)的中斷請(qǐng)求可以被響應(yīng)HPRIO=0xEA:ECT0,1,2同時(shí)請(qǐng)求中斷時(shí),CPU將會(huì)首先響應(yīng)通道2默認(rèn)時(shí),CPU將會(huì)首先響應(yīng)通道0優(yōu)先機(jī)制–多級(jí)情況1:每個(gè)中斷都單獨(dú)發(fā)生,在一個(gè)中斷程序執(zhí)行時(shí),沒有其他中斷情況2:在執(zhí)行ECT1的中斷效勞程序時(shí),ECT0請(qǐng)求中斷ECT0中斷效勞程序?qū)⒈粓?zhí)行情況3:在執(zhí)行ECT2的中斷效勞程序時(shí),ECT0請(qǐng)求中斷ECT2的中斷效勞程序執(zhí)行結(jié)束后,執(zhí)行ECT0的中斷效勞程序情況4:ECT1,ECT2同時(shí)請(qǐng)求中斷ECT1的中斷效勞程序先執(zhí)行,當(dāng)EnableInterrupts后執(zhí)行ECT2的中斷效勞程序ECT2的中斷效勞程序執(zhí)行結(jié)束后,返回執(zhí)行ECT1的中斷效勞程序方案:優(yōu)先機(jī)制–多級(jí)在ECT0中斷效勞程序中:在ECT1中斷效勞程序中〔自定義優(yōu)先級(jí)最低〕:在ECT2中斷效勞程序中〔自定義優(yōu)先級(jí)最高〕:用戶程序TIE_C1I=0;//關(guān)閉ECT1局部中斷TIE_C2I=1;//開放ECT2局部中斷EnableInterrupts;//開放全局中斷…TIE_C1I=1;//開放ECT1局部中斷TIE_C2I=1;//開放ECT2局部中斷TIE_C0I=1;//開放ECT0局部中斷TIE_C2I=1;//開放ECT2局部中斷EnableInterrupts;//開放全局中斷…TIE_C0I=1;//開放ECT0局部中斷TIE_C2I=1;//開放ECT2局部中斷ECT模塊的組成8個(gè)獨(dú)立的定時(shí)器通道,每個(gè)通道具備輸入捕捉和輸出比較功能4個(gè)帶有8位緩存的脈沖累加器,也可以作為2個(gè)16位的累加器使用帶有4位預(yù)分頻因子的16位模數(shù)遞減計(jì)數(shù)器用戶可選可抵御噪音的延遲計(jì)數(shù)器ECT系統(tǒng)控制存放器1:TSCR1TEN=1:定時(shí)器使能;TEN=0:定時(shí)器禁止,進(jìn)入低功耗狀態(tài)。TSWAI=0:等待模式時(shí)定時(shí)器繼續(xù)工作,方便調(diào)試;1:禁止定時(shí)器。TSFRZ=0:凍結(jié)模式時(shí)定時(shí)器繼續(xù)工作,方便仿真;1:禁止定時(shí)器。TFFCA=0:自動(dòng)去除標(biāo)志位;1:手動(dòng)去除。 注:在ECT模塊初始化時(shí)必須設(shè)置TSCR1才可以使定時(shí)器工作。一般設(shè)置TSCR1=0x80TSCR1ECT系統(tǒng)控制存放器2:TSCR2TOI=0:禁止定時(shí)器溢出中斷;TOI=1:允許。TCRE=0:定時(shí)器自由運(yùn)行;1=輸出比較7引起復(fù)位。PR2、PR1、PR0:定時(shí)器預(yù)分頻因子TSCR2PR200001111PR100110011PR001010101預(yù)分頻因子2^02^12^22^32^42^52^62^7定時(shí)器時(shí)鐘頻率總線時(shí)鐘頻率/1總線時(shí)鐘頻率/2總線時(shí)鐘頻率/4總線時(shí)鐘頻率/8總線時(shí)鐘頻率/16總線時(shí)鐘頻率/32總線時(shí)鐘頻率/64總線時(shí)鐘頻率/128ECT系統(tǒng)計(jì)數(shù)存放器:TCNTTCNT:16位的加1自由計(jì)數(shù)器,最大值為65535。一般直接(非中斷)使用的方法:

while(TCNT!=0x0000);//計(jì)算未滿足時(shí),就一直等待 while(TCNT==0x0000);//計(jì)數(shù)瞬時(shí)滿足TCNT實(shí)驗(yàn)3:內(nèi)容(1)ECT控制流水燈顯示intcounter;voidTimerOverflow(void){while(TCNT!=0x0000);//等待TCNT溢出時(shí)(恢復(fù)0x0000),就結(jié)束空循環(huán),執(zhí)行下面語句

counter++;if(counter==8)PORTB=0x7e;//0x7e=01111110if(counter==7)PORTB=0xbd;//0xbd=10111101if(counter==6)PORTB=0xdb;//0xdb=11011011if(counter==5)PORTB=0xe7;if(counter==4)PORTB=0xe7;if(counter==3)PORTB=0xdb;if(counter==2)PORTB=0xbd;if(counter==1)PORTB=0x7e;}voidmain(void){TSCR1=0x80;//TSCR1.7=TEN位(TimerEnable位,0=Disables,1=enable)TSCR2=0x03;//預(yù)分頻器設(shè)置TSCR2.[2-0]:0=1,1=2,2=4,3=8,4=16,5=32,6=64,7=128//預(yù)置分頻系數(shù)控制著每個(gè)自由運(yùn)行計(jì)數(shù)時(shí)間,它需要2^16個(gè)定時(shí)器時(shí)鐘時(shí)間才溢出一次.counter=0;

DDRB=0xff;//設(shè)置端口B為輸出方式

PORTB=0xff;//LEDsofffor(;;){TimerOverflow();if(counter>=8){counter=0;TSCR2=0x05;//調(diào)整定時(shí)器的預(yù)分頻器值

}}}本例是否使用中斷主要用途:測(cè)量事件發(fā)生的間隔時(shí)間輸入捕捉能感應(yīng)到引腳上的電平的變化如果發(fā)現(xiàn)電平變化,那么:1、計(jì)數(shù)器的值被保存到到輸入捕捉存放器中,狀態(tài)標(biāo)志位被置12、如果中斷允許,那么向CPU發(fā)出中斷請(qǐng)求定時(shí)器模塊輸入捕捉功能定時(shí)器模塊IC0-IC7:既可以用于輸入捕捉、也可以用于輸出比較功能定時(shí)器模塊輸入捕捉IOSx:0=通道x為輸入捕捉獲;1=通道x為輸出比較。輸入捕捉/輸出比較選擇存放器TIOS8個(gè)16位的定時(shí)器通道存放器TC0,TC1,…,TC7當(dāng)檢測(cè)到IOSx選擇位對(duì)應(yīng)的輸入捕捉沿跳變、或觸發(fā)輸出比較的輸出動(dòng)作時(shí),鎖存自由運(yùn)行計(jì)數(shù)器的計(jì)數(shù)值。B2B1B0

C7FC6FC5FC4FC3FC2FC1FC0FB6B5B4B3B7B2B1B0RST:00000000捕捉/比較通道x的中斷標(biāo)志位,寫‘1’去除中斷狀態(tài)標(biāo)志位。定時(shí)器中斷標(biāo)志存放器1:TFLG1CxI:1=第x個(gè)通道中斷允許;0=第x個(gè)通道中斷禁止。定時(shí)器中斷使能存放器:TIE定時(shí)器模塊輸入捕捉EDGnA/B:輸入捕捉邊沿控制,n代表通道序號(hào)。??刂拼娣牌?/4:TCTL3、TCTL4定時(shí)器模塊輸入捕捉SHxy=0:正常操作。1=通道x在通道y上產(chǎn)生同樣的動(dòng)作。TFMOD=0:只要產(chǎn)生正確的輸入捕獲事件,TFLG1中的CxF位就置一。1=隊(duì)列模式時(shí)才使用。PACMX=0:8位脈沖累加器溢出后自動(dòng)回0。1=不自動(dòng)回0,停留在0XFF。脈沖累加器對(duì)IC通道捕獲的有效邊沿?cái)?shù)量進(jìn)行計(jì)數(shù)。BUFEN=1:使用輸入捕獲緩沖區(qū)。0=不使用。LATQ=0:輸入捕獲隊(duì)列模式使能。產(chǎn)生一次成功的輸入捕獲時(shí),IC通道存放器中保存的計(jì)數(shù)值會(huì)被送到保持器中,然后IC存放器會(huì)接收新的計(jì)數(shù)值。1=鎖存模式使能。輸入控制系統(tǒng)控制存放器:ICSYS實(shí)驗(yàn)3:內(nèi)容(2)ECT輸入捕捉控制LED燈顯示要求:利用輸入捕捉0通道,對(duì)外來的信號(hào)進(jìn)行下降沿捕捉,并觸發(fā)中斷。中斷發(fā)生后用LED燈指示中斷成功。voidmain(void){EnableInterrupts;sysInit();//包含ECTInit(void)DDRB=0xFF;//PTBasoutput設(shè)置端口B為輸出方式

PORTB=0x00;//LEDsonfor(;;){}}voidECTInit(void){TIOS_IOS0=0;//PutthePT0astheInputCapturePin//設(shè)置PT0為輸入捕捉(IC)TSCR1=0x90;//0x90=10010000EnabletheClock定時(shí)器使能,自動(dòng)去除相應(yīng)存放器TCTL4_EDG0B=1,TCTL4_EDG0A=0;//下降沿捕捉TSCR2_PR0=1;//預(yù)分頻系數(shù)Prescale=32TSCR2_PR1=0;TSCR2_PR2=1;TIE_C0I=1;//定時(shí)器中斷使能存放器TIE,COI=1中斷使能,=0中斷屏蔽}interruptvoidEnhanced_Capture_Timer_channel_0(void){PORTB=~PORTB;//PORTB燈取反}實(shí)驗(yàn)3:內(nèi)容(2)ECT輸入捕捉控制LED燈顯示//以下是在main函數(shù)中,如何使用PORTA_BIT6來產(chǎn)生一個(gè)方波信號(hào)。DDRA=0xff; //設(shè)置PORTA的方向存放器,為輸出PORTA=0x00; //PORTA的輸出初始化為低電平DDRB=0xff; //PORTB設(shè)置為L(zhǎng)ED燈的控制信號(hào)PORTB=0xff; //LED全滅for(;;){for(i=0;i<6000;i++)PORTA_BIT6=1;//循環(huán)中設(shè)置信號(hào)為高電平for(i=0;i<6000;i++)PORTA_BIT6=0;} //循環(huán)中設(shè)置信號(hào)為低電平,產(chǎn)生方波voidic_init(void)//IC0的初始化:{TSCR1=0x90;//主定時(shí)器使能

TSCR2=0x07;//分頻因子=128ICSYS=0x02; //IC緩沖使能

TIOS=0; //通道設(shè)置為輸入捕獲TCTL4=0xff; //采用上升、下降沿觸發(fā)

TIE=0x01;} //通道0開中斷//方波信號(hào)已經(jīng)成功得產(chǎn)生了,中斷效勞程序:voidinterrupt8ic0_int(void){TFLG1_C0F=1;//中斷標(biāo)志去除ic4=TC0;//通過讀TC0存放器來響應(yīng)中斷,ic4為用戶設(shè)置的變量PORTB=0x55; }//用LED燈來指示已經(jīng)進(jìn)入了中斷實(shí)驗(yàn)要求:利用輸入捕捉0通道,對(duì)外來的信號(hào)進(jìn)行雙沿捕捉,并觸發(fā)中斷,中斷發(fā)生后,讀取捕捉后的計(jì)數(shù)值。方波信號(hào)由PORTA_BIT6產(chǎn)生,PORTA_BIT6和IOC0硬件連接。最簡(jiǎn)單最常用的功能就是:產(chǎn)生一定間隔的脈沖,其非常精確的時(shí)間間隔的電平輸出,比使用延時(shí)要準(zhǔn)確的多。通過定時(shí)器通道存放器TC0~TC7的預(yù)設(shè)值與自由計(jì)數(shù)器TCNT比較,當(dāng)兩者相等時(shí)觸發(fā)中斷,并按照預(yù)設(shè)的輸出方式輸出電平。定時(shí)器模塊輸出比較定時(shí)器模塊輸出比較OMn:輸出模式選擇位;OLn:輸出電平選擇位這8對(duì)控制位是用來指定輸出比較的輸出動(dòng)作的,當(dāng)OMn和OLn二者任意一個(gè)為1時(shí),OCn對(duì)應(yīng)的端口會(huì)有相應(yīng)的輸出。如果需要用OMn和OLn來控制相應(yīng)定時(shí)器端口的輸出,那么OC7M中的對(duì)應(yīng)位必須清零。定時(shí)器控制存放器1/2:TCTL1、TCTL2OMn0011OLn0101動(dòng)作沒有輸出動(dòng)作翻轉(zhuǎn)OCx輸出引腳的輸出狀態(tài)(取反)將OCx引腳輸出0將OCx引腳輸出1voidECTInit(void)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論