新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > at91rm9200的io口電平中斷簡單理解

at91rm9200的io口電平中斷簡單理解

作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
對于PQFP封裝的9200的PIOA、PIOB和PIOC三組32*3=64個io口,他們的io中斷有這樣的特性PIO的中斷AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL和AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE都是電平中斷,對于PIO來說沒有區(qū)別,在PIO中斷處理函數(shù)里邊通過檢測發(fā)生io中斷的相應(yīng)io引腳輸入值為0還是為1,來判斷是高電平中斷還是低電平中斷,PIO的PIO_IER使能的相應(yīng)io口線上輸入變化中斷--注意是變化中斷,所以對于io電平中斷也必須存在電平變化之后才能被9200捕獲到,也才能引發(fā)中斷,執(zhí)行中斷處理函數(shù),io口線上無電平變化也就無電平中斷會被觸法,這和51單片機的io電平中斷機制不同,51單片機當(dāng)啟用外部電平中斷之后,51處理器每個clk都會檢測io的電平,如果符合中斷電平,那么立即觸發(fā)電平中斷,所以對于51單片機,只要io口上的電平為中斷電平值,那么就會不斷的觸法51的中斷處理程序,直到io口電平變?yōu)榉侵袛嚯娖街?1處理器才會停止觸法中斷,9200即便配置io為電平中斷,但是也需要io線上只有發(fā)上了電平變化,9200才會觸法電平變化中斷,至于這個變化中斷最終是變?yōu)榱说碗娖竭€是變?yōu)榱烁唠娖?那么需要在處理程序中讀取io值才可以進(jìn)一步判斷,不過如果存在其他irq中斷屏蔽I時間比較長,同時io電平中斷變化持續(xù)時間又比較短,那么很可能出現(xiàn),到執(zhí)行io電平中斷處理程序時,讀取到的io口數(shù)據(jù)已經(jīng)不是引發(fā)中斷的電平值了,所以io電平中斷不是很好用,可以使用AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED雙邊沿中斷或者AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE上升沿中斷來完成,對于io口最好使用AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE上升沿中斷機制,這不會出現(xiàn)誤數(shù)據(jù),最壞僅僅是可能會丟掉后面的1~2個上升沿[gliethttp_20080104]

以PIOB的PB0為例:
#defineLEVEL_IRQ_PIN(0x01<<0)
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,((unsignedint)1AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
AT91C_ID_PIOB,
1,
AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE,
//AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,//雙邊沿
//AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL,
//AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,//
(void(*)(void))piob_interrupt_proc);
{volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOB,LEVEL_IRQ_PIN);//使能PB0變化中斷
{volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_PIOB);//使能PIOB控制器中斷
以上就完成了PB0的上升沿中斷啟動,來看看中斷處理函數(shù)[ads1.2]
void__irq piob_interrupt_proc(void)
{
{volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
AT91C_BASE_AIC->AIC_EOICR=0;
if(AT91F_PIO_GetInput(AT91C_BASE_PIOB)&LEVEL_IRQ_PIN)
{
//...1電平
}else
{
//...0電平
}
}


關(guān)鍵詞: at91rm9200io口電平中

評論


技術(shù)專區(qū)

關(guān)閉