日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZYNQ7000-GPIO EMIO中断实验 程序烧写后自动进一次中断的怪现象

發布時間:2025/3/13 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZYNQ7000-GPIO EMIO中断实验 程序烧写后自动进一次中断的怪现象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

試驗硬件:正點原子領航者ZYNQ開發板(芯片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);// 打開系統的中斷處理功能Xil_ExceptionInit(); // 初始化異常句柄,只在很早版本的bsp中需要,此處為了兼容性保留Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler,&scuGic); // 為IRQ注冊中斷處理程序Xil_ExceptionEnable(); // 使能系統中斷功能// 初始化中斷控制器XScuGic_Config *scuGic_config;scuGic_config = XScuGic_LookupConfig(XPAR_XSCUTIMER_0_DEVICE_ID); // 根據器件ID查找配置XScuGic_CfgInitialize(&scuGic, scuGic_config, scuGic_config->CpuBaseAddress);// 關聯中斷處理函數XScuGic_Connect(&scuGic, XPAR_XGPIOPS_0_INTR, (Xil_ExceptionHandler)psGpio_Handler, (void *)&psGpio);// 啟用對應中斷ID的中斷源XScuGic_Enable(&scuGic, XPAR_XGPIOPS_0_INTR);// 注意psGPIO中斷不需要設置中斷優先級// 設置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);} }

試驗現象:

)

此時ZYNQ的啟動方式為QSPI,也就是從FLASH啟動。

可以看到第一次燒寫打印了"This is EMIO Interrupt",這表示燒寫后自動進了一次中斷,而第二次燒寫則未打印,表明燒寫未進入此中斷。不進中斷才是對的。

當設置啟動方式為JTAG,從JTAG啟動后,看一下這種情況會不會消失。

從上圖可見,設置為JTAG啟動后,燒寫后不會自動觸發一次EMIO中斷了。

還有一種更通用的辦法是在GPIO PIN中斷使能之前,先清除一次中斷狀態,也可以防止燒寫自動進一次EMIO中斷,即加入一行代碼:

XGpioPs_IntrClearPin(&psGpio, EMIO0);

如下:

// 設置psGPIO中斷類型XGpioPs_SetIntrTypePin(&psGpio, EMIO0, XGPIOPS_IRQ_TYPE_EDGE_RISING);// 使能之前先清除中斷狀態!XGpioPs_IntrClearPin(&psGpio, EMIO0);// 使能psGPIO中斷XGpioPs_IntrEnablePin(&psGpio, EMIO0);

推測造成這種現象的原因是燒寫前EMIO被FLASH中的程序控制著,可能中斷狀態就是1,而燒寫也沒有清除中斷狀態寄存器,所以燒寫后自動進了一次中斷,所以QSPI模式出現此問題,而JTAG模式不出現。

總結

以上是生活随笔為你收集整理的ZYNQ7000-GPIO EMIO中断实验 程序烧写后自动进一次中断的怪现象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。