Zynq中PS的MIO中斷

  • 2019 年 11 月 5 日
  • 筆記

Zynq中斷大致可分為三個部分

第一部分為SGI,軟體生成的中斷,共16個埠;

第二部分為PPI,CPU私有外設中斷,有5個;

第三部分為SPI,共享外設中斷,來自於44個PS端的IO外設以及16個PL端的中斷。中間部分為GIC,也即中斷控制器,用於對中斷進行使能、關閉、掩碼、設置優先等。

以下為中斷控制器框圖,主要的控制器部分為ICC和ICD,ICD連接SGI和PPI,ICD連接SPI,可配置兩者的暫存器來控制中斷。

SGI中斷(軟體產生中斷),共16個IRQ ID號

PPI中斷,CPU私有中斷,共5個IRQ ID號

SPI中斷部分,共60個IRQ ID號

接下來設置帶有中斷的GPIO

INT_MASK:中斷掩碼

INT_DIS: 中斷關閉

INT_EN: 中斷使能

INT_TYPE: 中斷類型,設置電平敏感還是邊沿敏感

INT_POLARITY:中斷極性,設置低電平或下降沿還是高電平或上升沿

INT_ANY: 邊沿觸發方式,需要INT_TYPE設置為邊沿敏感才能使用

GPIO初始化à設置按鍵和LED方向à設置產生中斷方式à設置中斷à打開中斷控制器à打開中斷異常à打開GPIO中斷à判斷KEY_FLAG值,是1,寫LED

GPIO_CONFIG =XGpioPs_LookupConfig(MIO_0_ID) ;

Status =XGpioPs_CfgInitialize(&GPIO_PTR, GPIO_CONFIG, PIO_CONFIG->BaseAddr) ;

//設置LED方向

XGpioPs_SetDirectionPin(&GPIO_PTR,0, GPIO_OUTPUT) ;

XGpioPs_SetDirectionPin(&GPIO_PTR,13, GPIO_OUTPUT) ;

//設置按鍵方向

XGpioPs_SetDirectionPin(&GPIO_PTR,PS_KEY1, GPIO_INPUT) ;

XGpioPs_SetDirectionPin(&GPIO_PTR,PS_KEY2, GPIO_INPUT) ;

//使能LED輸出

XGpioPs_SetOutputEnablePin(&GPIO_PTR,0, GPIO_OUTPUT) ;

XGpioPs_SetOutputEnablePin(&GPIO_PTR,13, GPIO_OUTPUT) ;

//設置中斷類型 0表示上升沿

XGpioPs_SetIntrTypePin(&GPIO_PTR,PS_KEY1, 0);//rising edge

XGpioPs_SetIntrTypePin(&GPIO_PTR,PS_KEY2, 0);//rising edge

//設置按鍵使能

XGpioPs_IntrEnablePin(&GPIO_PTR,PS_KEY1) ;

XGpioPs_IntrEnablePin(&GPIO_PTR,PS_KEY2) ;

//設置中斷

Status= IntrInitFuntion(&INTCInst, MIO_0_ID, &GPIO_PTR) ;

//產生按鍵的GPIO

while(1)

{

if (key_flag)

{

XGpioPs_WritePin(&GPIO_PTR,0, key_val) ;

XGpioPs_WritePin(&GPIO_PTR,13, key_val) ;

key_val= ~key_val ;

key_flag= 0 ;

}

}