第一步是GPIO初始化,需要调用CyU3PGpioInit函数设置gpio模块的时钟以及回调函数。
其中复用的GPIO口需要调用CyU3PDeviceGpioOverride。
设置高低电平的函数为:
CyU3PGpioSetValue (45, CyFalse);//低电平
CyU3PGpioSetValue (45, CyTrue);//高电平
代码如下:
#ifdef MY_GPIO
io_cfg.gpioSimpleEn[1] = 0x00002000; /* GPIO 45 0x2000 = 1<<(45-32)*/
//GPIO 50,51,52: 0x1C0000 = 1<<(50-32) | 1<<(51-32) | 1<<(52-32);
#else
io_cfg.gpioSimpleEn[1] = 0;
#endif
#ifdef MY_GPIO
CyU3PReturnStatus_t
my_gpio_init(void)
{
CyU3PGpioClock_t gpioClock;
CyU3PGpioSimpleConfig_t gpioConfig;
CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
/* Init the GPIO module */
gpioClock.fastClkDiv = 2;
gpioClock.slowClkDiv = 0;
gpioClock.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2;
gpioClock.clkSrc = CY_U3P_SYS_CLK;
gpioClock.halfDiv = 0;
apiRetStatus = CyU3PGpioInit(&gpioClock, NULL);
if (apiRetStatus != 0)
{
CyU3PDebugPrint (4, "CyU3PGpioInit failed, error code = %d\n", apiRetStatus);
return apiRetStatus;
}
//Init GPIO 45 as output
gpioConfig.outValue = CyFalse;//默认输出低电平
gpioConfig.driveLowEn = CyTrue;//允许输出低
gpioConfig.driveHighEn = CyTrue;//允许输出高
gpioConfig.inputEn = CyFalse;//不是输入,则是输出
gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR;
apiRetStatus = CyU3PGpioSetSimpleConfig(45, &gpioConfig);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n",
apiRetStatus);
return apiRetStatus;
}
CyU3PGpioSetValue (45, CyFalse);
CyU3PBusyWait(10);
CyU3PGpioSetValue (45, CyTrue);
//Init GPIO 21
/* Override GPIO 21 as this pin is associated with GPIF Control signal.
* The IO cannot be selected as GPIO by CyU3PDeviceConfigureIOMatrix call
* as it is part of the GPIF IOs. Override API call must be made with
* caution as this will change the functionality of the pin. If the IO
* line is used as part of GPIF and is connected to some external device,
* then the line will no longer behave as a GPIF IO.. Here CTL4 line is
* not used and so it is safe to override. */
apiRetStatus = CyU3PDeviceGpioOverride (21, CyTrue);
if (apiRetStatus != 0)
{
CyU3PDebugPrint (4, "CyU3PDeviceGpioOverride failed, error code = %d\n",
apiRetStatus);
return apiRetStatus;
}
/* Configure GPIO 21 as output */
gpioConfig.outValue = CyFalse;
gpioConfig.driveLowEn = CyTrue;
gpioConfig.driveHighEn = CyTrue;
gpioConfig.inputEn = CyFalse;
gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR;
apiRetStatus = CyU3PGpioSetSimpleConfig(21, &gpioConfig);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n",
apiRetStatus);
return apiRetStatus;
}
CyU3PGpioSetValue (21, CyFalse);
//CyU3PThreadSleep(200);
CyU3PBusyWait(10);
CyU3PGpioSetValue (21, CyTrue);
return apiRetStatus;
}
#endif
输入模式,参考demo cyfxgpioapp.
gpioConfig.outValue = CyTrue;
gpioConfig.inputEn = CyTrue;
gpioConfig.driveLowEn = CyFalse;
gpioConfig.driveHighEn = CyFalse;