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 ;
}
}