1. 程式人生 > 其它 >vxworks中斷的使用——GPIO中斷(附程式碼)

vxworks中斷的使用——GPIO中斷(附程式碼)

硬體環境:
zynq7010

軟體環境:
workbench6.9
vivado2018.3
petalinux2018.3

前言:
1.不知道怎麼把vxworks移植到zynq的,去看我的其他文章。
2.vxwokrs下,對GPIO的操作思路可能有很多,我提供一種我的思路,就是直接對暫存器進行操作。

第一步:
將vivado的sdk中關於GPIO和中斷操作的檔案全都複製到vxworks中。
這些檔案大多是c語言,少數有彙編。所以,你的編譯器要選好,編譯選項也要選好。
複製到vxworks中的檔案如下:
在這裡插入圖片描述

在這裡插入圖片描述
少數幾個檔案需要修改,比如使用了xil_printf的函式,debug函式等等。

第二步,
初始化GPIO,並初始化GPIO中斷。

注意,一定要初始化GPIO中斷。若不初始化,GPIO根本不知道自己要產生中斷。

第三步,
中斷回撥函式中一定要清除中斷標誌位。
使用xilinx的暫存器操作函式,即可清除中斷標誌位。

程式碼如下:

/**********************************************
 * GPIO初始化,GPIO中斷初始化
 * 驗證通過
 * *******************************************/
int myGPIO_interrupt_Init( void )
{
	STATUS sta = 0;
	XGpioPs_Config *ConfigPtr;
//PS 端GPIO配置資訊 //根據器件ID查詢配置資訊 ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID); if (ConfigPtr == NULL) { return ERROR; } //初始化Gpio driver XGpioPs_CfgInitialize(&gpio, ConfigPtr, ConfigPtr->BaseAddr); //設定KEY所連線的MIO引腳的方向為輸入 XGpioPs_SetDirectionPin(&gpio, EMIO_U12, 0); //設定LED為輸出
XGpioPs_SetDirectionPin(&gpio, EMIO_W13, 1); //使能輸出 XGpioPs_SetOutputEnablePin(&gpio, EMIO_W13, 1); //熄滅LED XGpioPs_WritePin(&gpio, EMIO_W13, LED_OFF); sta = intConnect( (VOIDFUNCPTR *)GPIO_INTERRUPT_ID , key_interrupt_handler , 0 ); printf("intConnect sta=%d\r\n",sta); sta = intEnable(GPIO_INTERRUPT_ID); printf("intEnable sta=%d\r\n",sta); //僅需初始化按鍵中斷,無需重新初始化GIC setup_interrupt_system( &intc, &gpio, GPIO_INTERRUPT_ID ); return OK; } /********************************************** * GPIO中斷回撥函式 * 驗證通過 * *******************************************/ int key_press_count = 0; void key_interrupt_handler( void * param ) { key_press_count ++; if(XGpioPs_IntrGetStatusPin(&gpio, EMIO_U12)) { //清除按鍵 KEY 中斷,必須清除中斷,否則會導致vxworks宕機 XGpioPs_IntrClearPin(&gpio, EMIO_U12); if( key_press_count % 2 ) { XGpioPs_WritePin(&gpio, EMIO_W13, LED_ON); } else { XGpioPs_WritePin(&gpio, EMIO_W13, LED_OFF); } } }