#include "bsp_decode.h"
/* 4个IO口设置为边沿中断检测,再读取电平状态,从而解析格雷码*/
void BSP_IOInput_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
///< 打开GPIO外设时钟门控
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
///< 端口方向配置->输入
stcGpioCfg.enDir = GpioDirIn;
///< 端口驱动能力配置->高驱动能力
///stcGpioCfg.enDrv = GpioDrvL;
///< 端口上下拉配置->无
stcGpioCfg.enPu = GpioPuDisable;
stcGpioCfg.enPd = GpioPdDisable;
///< 端口开漏输出配置->开漏输出关闭
stcGpioCfg.enOD = GpioOdDisable;
///< 端口输入/输出值寄存器总线控制模式配置->AHB
stcGpioCfg.enCtrlMode = GpioAHB;
///< GPIO IO USER KEY初始化
Gpio_Init(GpioPortA, GpioPin0, &stcGpioCfg);
Gpio_Init(GpioPortA, GpioPin1, &stcGpioCfg);
Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
Gpio_Init(GpioPortA, GpioPin3, &stcGpioCfg);
/* 双边沿触发中断*/
Gpio_EnableIrq(GpioPortA, GpioPin0, GpioIrqFalling);
Gpio_EnableIrq(GpioPortA, GpioPin0, GpioIrqRising);
/* 双边沿触发中断*/
Gpio_EnableIrq(GpioPortA, GpioPin1, GpioIrqFalling);
Gpio_EnableIrq(GpioPortA, GpioPin1, GpioIrqRising);
/* 双边沿触发中断*/
Gpio_EnableIrq(GpioPortA, GpioPin2, GpioIrqFalling);
Gpio_EnableIrq(GpioPortA, GpioPin2, GpioIrqRising);
/* 双边沿触发中断*/
Gpio_EnableIrq(GpioPortA, GpioPin3, GpioIrqFalling);
Gpio_EnableIrq(GpioPortA, GpioPin3, GpioIrqRising);
///< 使能端口PORTA系统中断
EnableNvic(PORTA_IRQn, IrqLevel3, TRUE);
}
///< PortA中断服务函数
void PortA_IRQHandler(void)
{
if(TRUE == Gpio_GetIrqStatus(GpioPortA, GpioPin0))
{
if (FALSE == Gpio_GetInputIO(GpioPortA, GpioPin0))
{
///< LED点亮
Gpio_SetIO(EVB_LEDR_PORT, EVB_LEDR_PIN);
}
else
{
///< LED关闭
Gpio_ClrIO(EVB_LEDR_PORT, EVB_LEDR_PIN);
}
Gpio_ClearIrq(GpioPortA, GpioPin0);
}
if(TRUE == Gpio_GetIrqStatus(GpioPortA, GpioPin1))
{
if (FALSE == Gpio_GetInputIO(GpioPortA, GpioPin1))
{
///< LED点亮
Gpio_SetIO(EVB_LEDY_PORT, EVB_LEDY_PIN);
}
else
{
///< LED关闭
Gpio_ClrIO(EVB_LEDY_PORT, EVB_LEDY_PIN);
}
Gpio_ClearIrq(GpioPortA, GpioPin1);
}
if(TRUE == Gpio_GetIrqStatus(GpioPortA, GpioPin2))
{
if (FALSE == Gpio_GetInputIO(GpioPortA, GpioPin2))
{
///< LED点亮
Gpio_SetIO(EVB_LEDG_PORT, EVB_LEDG_PIN);
}
else
{
///< LED关闭
Gpio_ClrIO(EVB_LEDG_PORT, EVB_LEDG_PIN);
}
Gpio_ClearIrq(GpioPortA, GpioPin2);
}
if(TRUE == Gpio_GetIrqStatus(GpioPortA, GpioPin3))
{
if (FALSE == Gpio_GetInputIO(GpioPortA, GpioPin3))
{
///< LED点亮
Gpio_SetIO(EVB_LEDB_PORT, EVB_LEDB_PIN);
}
else
{
///< LED关闭
Gpio_ClrIO(EVB_LEDB_PORT, EVB_LEDB_PIN);
}
Gpio_ClearIrq(GpioPortA, GpioPin3);
}
}