ZYNQ7000-GPIO EMIO中断实验 程序烧写后自动进一次中断的怪现象
試驗硬件:正點原子領航者ZYNQ開發(fā)板(芯片xc7z020clg400-2)
試驗軟件:Vivado 2020.2與Vitis 2020.2
Vivado中的Block Design:
打開UART0,打開MIO與EMIO,EMIO位寬為1,正確設置DDR型號,設置FCLK為50MHz,VIO輸出與EMIO輸入對接,此時無需指定EMIO引腳,VIO輸出默認為0。
Vitis中的代碼:
#include "xil_printf.h" #include "xgpiops.h" #include "sleep.h" #include "xparameters.h" #include "xscugic.h"#define EMIO0 54UXGpioPs psGpio;XScuGic scuGic;void psGpio_Handler(void *CallBackRef);int main(void) {xil_printf("begin!\r\n");// 初始化psGpioXGpioPs_Config *psGpio_configPtr;psGpio_configPtr = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);XGpioPs_CfgInitialize(&psGpio, psGpio_configPtr, psGpio_configPtr->BaseAddr);// 打開系統(tǒng)的中斷處理功能Xil_ExceptionInit(); // 初始化異常句柄,只在很早版本的bsp中需要,此處為了兼容性保留Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler,&scuGic); // 為IRQ注冊中斷處理程序Xil_ExceptionEnable(); // 使能系統(tǒng)中斷功能// 初始化中斷控制器XScuGic_Config *scuGic_config;scuGic_config = XScuGic_LookupConfig(XPAR_XSCUTIMER_0_DEVICE_ID); // 根據(jù)器件ID查找配置XScuGic_CfgInitialize(&scuGic, scuGic_config, scuGic_config->CpuBaseAddress);// 關(guān)聯(lián)中斷處理函數(shù)XScuGic_Connect(&scuGic, XPAR_XGPIOPS_0_INTR, (Xil_ExceptionHandler)psGpio_Handler, (void *)&psGpio);// 啟用對應中斷ID的中斷源XScuGic_Enable(&scuGic, XPAR_XGPIOPS_0_INTR);// 注意psGPIO中斷不需要設置中斷優(yōu)先級// 設置psGPIO中斷類型XGpioPs_SetIntrTypePin(&psGpio, EMIO0, XGPIOPS_IRQ_TYPE_EDGE_RISING);// 使能psGPIO中斷XGpioPs_IntrEnablePin(&psGpio, EMIO0);while(1){}return 0; }void psGpio_Handler(void *CallBackRef) {XGpioPs *psGpioPtr = (XGpioPs *)CallBackRef;if (XGpioPs_IntrGetStatusPin(psGpioPtr, EMIO0) == TRUE){xil_printf("This is EMIO0 Interrupt!\r\n");XGpioPs_IntrClearPin(psGpioPtr, EMIO0);} }試驗現(xiàn)象:
)
此時ZYNQ的啟動方式為QSPI,也就是從FLASH啟動。
可以看到第一次燒寫打印了"This is EMIO Interrupt",這表示燒寫后自動進了一次中斷,而第二次燒寫則未打印,表明燒寫未進入此中斷。不進中斷才是對的。
當設置啟動方式為JTAG,從JTAG啟動后,看一下這種情況會不會消失。
從上圖可見,設置為JTAG啟動后,燒寫后不會自動觸發(fā)一次EMIO中斷了。
還有一種更通用的辦法是在GPIO PIN中斷使能之前,先清除一次中斷狀態(tài),也可以防止燒寫自動進一次EMIO中斷,即加入一行代碼:
XGpioPs_IntrClearPin(&psGpio, EMIO0);
如下:
// 設置psGPIO中斷類型XGpioPs_SetIntrTypePin(&psGpio, EMIO0, XGPIOPS_IRQ_TYPE_EDGE_RISING);// 使能之前先清除中斷狀態(tài)!XGpioPs_IntrClearPin(&psGpio, EMIO0);// 使能psGPIO中斷XGpioPs_IntrEnablePin(&psGpio, EMIO0);推測造成這種現(xiàn)象的原因是燒寫前EMIO被FLASH中的程序控制著,可能中斷狀態(tài)就是1,而燒寫也沒有清除中斷狀態(tài)寄存器,所以燒寫后自動進了一次中斷,所以QSPI模式出現(xiàn)此問題,而JTAG模式不出現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的ZYNQ7000-GPIO EMIO中断实验 程序烧写后自动进一次中断的怪现象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZYNQ7000-AXI GPIO详解
- 下一篇: ZYNQ7000-GPIO详解