ZYNQ的MIO與EMIO中斷設定流程——Vivado2018.3
阿新 • • 發佈:2022-11-29
MIO與EMIO在各bank的分佈
根據官方手冊可以看到MIO分佈在BANK0與BANK1有54個,而EMIO分佈在BANK2與BANK3有64個。
中斷系統的介紹
根據官方手冊的GIC中斷控制器的系統級塊圖可以看出中斷源有:軟體中斷SGI、兩個CPU的私有中斷PPI、共享外設中斷SPI(包括PS端的IOP和PL端)。
根據這張圖就更清晰的看出各中斷源如何與GIC連線的。
一、MIO和EMIO的設定
1.初始化MIO與EMIO
XGpioPs_Config *ConfigPtr; /*為GPIO的裝置資訊建立一個指標*/ ConfigPtr = XGpioPs_LookupConfig(XPAR_AXI_GPIO_0_DEVICE_ID);/*根據裝置ID查詢到GPIO的配置資訊*/ XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);/*根據查詢到的GPIO的配置資訊進行初始化*/
2.MIO與EMIO的輸入輸出設定
//設定IO方向函式 XGpioPs_SetDirectionPin(&Gpio, PL_LED, 1);/*(函式指標,IO管腳編號,0設定為輸入 1設定為輸出)*/ XGpioPs_SetDirectionPin(&Gpio, PL_KEY, 0x0); //設定IO輸出使能函式 XGpioPs_SetOutputEnablePin(&Gpio, PL_LED, 1);/*(函式指標,IO管腳編號,0設定為禁止 1設定為使能)*/ //設定IO輸出資料函式 XGpioPs_WritePin(&Gpio, PL_LED, 0x0);/*(函式指標,IO管腳編號,0設定為輸出為0 1設定輸出為1)*/
二、中斷的設定
1.初始化Scugic驅動
XScuGic_Config *IntcConfig; /* 為中斷設定配置一個例項指標 */
//根據裝置ID查詢到Scugic的配置資訊,並進行初始化,這裡只需要注意填下ID號,其他的不需要關心
IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
XScuGic_CfgInitialize(&GicInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);
1.配置中斷服務
//註冊異常處理函式(不需要關心) Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &GicInstancePtr); //註冊/繫結具體外設的中斷服務函式(需要使用者去關心) XScuGic_Connect(&GicInstancePtr, XPS_GPIO_INT_ID, (Xil_ExceptionHandler)XGpioPs_IntrHandler, &Gpio); //(指標,中斷ID號,中斷函式地址,回撥參考指標) //設定具體外設的中斷相關的暫存器(使能、禁止、中斷檢測型別)(需要使用者去關心) XGpioPs_SetIntrType(&Gpio, XGPIOPS_BANK2 , 0xFFFFFFFF, 0x00000000, 0x00);/*(例項指標,bank號,中斷觸發型別_0電平觸發_1邊沿觸發, 中斷觸發極性_0低電平或下降沿_1高電平或上升沿,中斷觸發敏感度_0單邊緣觸發_1雙邊緣觸發)*/ /* 設定回撥函式. */ XGpioPs_SetCallbackHandler(&Gpio, &Gpio, IntrHandler);//(例項指標,回撥指標,中斷函式指標) //設定某位的中斷使能(需要使用者去關心) XGpioPs_IntrEnable(&Gpio, XGPIOPS_BANK2, (1 << (PL_KEY - 54)));//(例項指標,BANK號,32位_位1為使能_位0為禁止) //在GIC中允許該外設的中斷源向Cpu發出中斷 XScuGic_Enable(&GicInstancePtr, XPS_GPIO_INT_ID); //開啟總中斷 Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);