vxworks中斷的使用——GPIO中斷(附程式碼)
阿新 • • 發佈:2021-02-18
硬體環境:
zynq7010
軟體環境:
workbench6.9
vivado2018.3
petalinux2018.3
前言:
1.不知道怎麼把vxworks移植到zynq的,去看我的其他文章。
2.vxwokrs下,對GPIO的操作思路可能有很多,我提供一種我的思路,就是直接對暫存器進行操作。
第一步:
將vivado的sdk中關於GPIO和中斷操作的檔案全都複製到vxworks中。
這些檔案大多是c語言,少數有彙編。所以,你的編譯器要選好,編譯選項也要選好。
複製到vxworks中的檔案如下:
少數幾個檔案需要修改,比如使用了xil_printf的函式,debug函式等等。
第二步,
初始化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);
}
}
}