1. 程式人生 > >S5PV210外部中斷

S5PV210外部中斷

  • 210裡面有很多種中斷有內部中斷有外部中斷。
  • 什麼是內部中斷和外部中斷?
  • SoC支援的中斷型別中有一類叫外部中斷。內部中斷就是指的中斷源來自SoC內部(一般是內部外設),譬如串列埠、定時器等部件產生的中斷;外部中斷是SoC外部的裝置,通過外部中斷對應的GPIO引腳產生的中斷。(區別就是中斷源一個在內部,一個在外部)。

關鍵性的暫存器:EXT_CON, EXT_PEND, EXT_MASK.
EXT_CON:配製外部中斷的觸發方式。(例如高低電平觸發,上下沿觸發等方式。)
EXT_PEND暫存器是中斷掛起暫存器。當發生了中斷後,硬體會自動將這個暫存器中該中斷對應的位置1.我們處理完這個中斷後就會置0
EXT_MASK暫存器就是各個外部中斷的使能、禁止開關

電平觸發特點:只要電平滿足條件就會不停觸發中斷。(對於按鍵來說一般就是按著的那個過程。)
邊沿觸發特點:邊沿觸發不關心你原本的電平是搞還是低,只關心變化是從高到低還是從低到高的這個過程。(對於按鍵來說就是按下去的那一瞬間)

#define EXT_INT_0_CON 0XE0200E00
#define EXT_INT_2_CON 0XE0200E08
#define EXT_INT_0_PEND 0XE0200F40
#define EXT_INT_2_PEND 0XE0200F48
#define EXT_INT_0_MASK 0XE0200F00
#define EXT_INT_2_MASK  0XE0200F08


#define rEXT_INT_0_CON  (*(volatile unsigned int *)
EXT_INT_0_CON) #define rEXT_INT_2_CON (*(volatile unsigned int *)EXT_INT_2_CON) #define rEXT_INT_0_PEND (*(volatile unsigned int *)EXT_INT_0_PEND) #define rEXT_INT_2_PEND (*(volatile unsigned int *)EXT_INT_2_PEND) #define rEXT_INT_0_MASK (*(volatile unsigned int *)EXT_INT_0_MASK) #define rEXT_INT_2_MASK (*(volatile unsigned int *)
EXT_INT_2_MASK) //中斷方式處理按鍵 void keyy_init_interrupt(void) { //1.外部中斷對應的GPIO模式 rGPH0CON |= 0xFF<<8; //GPH0_2 GPH0_3設定為外部中斷模式 rGPH2CON |= 0xFFFF<<0 //GPH2_0123共4個引腳設定為外部中斷模式 //2.中斷觸發模式設定 rEXT_INIT_0_CON &= ~(0XFF<<8); //bit8~bie15全部清零 rEXT_INIT_0_CON |= ((2<<8)|(2<<12)); //EXT_INT2和EXT_INT3設定為下降沿觸發 rEXT_INIT_2_CON &= ~(0XFFFF<<0); //bit0~bie15全部清零 rEXT_INIT_2_CON |= ((2<<0)|(2<<4)|(2<<8)|(2<<12)); //EXT_INT20123設定為下降沿觸發 // 3.中斷允許、清掛起 rEXT_INT_0_MASK &= ~(3<<2); rEXT_INT_2_MASK &= ~(0X0F<<0); rEXT_INT_0_PEND |= (3<<2); rEXT_INT_2_PEND |= (0X0F<<0); } //EINT2通道對應的按鍵,就是GPH0_2引腳對應的按鍵。 void isr_eint2(void) { //真正的isr應該做2件事情。 //第一,中斷處理程式碼,就是真正幹活的程式碼 printf("isr_eint2_leaft.\n"); //第二,清除中斷掛起 rEXT_INT_0_PEND |= (1<<2); }

歡迎關注我的公眾號和我的知識星球。