1. 程式人生 > 其它 >ZYNQ的MIO與EMIO中斷設定流程——Vivado2018.3

ZYNQ的MIO與EMIO中斷設定流程——Vivado2018.3

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