[EZ-USB FX3] GPIO 테스트
[EX-USB FX3] 의 확장 테스트 보드에는 GPIO 25, 26에 LED가 연결되어 있다.
GPIO 초기화 함수
void CyFxGpioInit (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, CyFxGpioIntrCb);
if (apiRetStatus != 0)
{
/* Error Handling */
CyU3PDebugPrint (4, "CyU3PGpioInit failed, error code = %d\n", apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
/* Override GPIO 25 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 (25, CyTrue);
if (apiRetStatus != 0)
{
/* Error Handling */
CyU3PDebugPrint (4, "CyU3PDeviceGpioOverride failed, error code = %d\n",
apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
/* Configure GPIO 25 as output */
gpioConfig.outValue = CyFalse;
gpioConfig.driveLowEn = CyTrue;
gpioConfig.driveHighEn = CyTrue;
gpioConfig.inputEn = CyFalse;
gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR;
apiRetStatus = CyU3PGpioSetSimpleConfig(25, &gpioConfig);
if (apiRetStatus != CY_U3P_SUCCESS)
{
/* Error handling */
CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n", apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
}
FX3의 펌웨어는 RTOS로 구동이되고 main함수에서 실행될 Thread를 정의해 주고 CyU3PKernelEntry ()함수로 커널 실행하면 설정한 Thread가 구동 되도록 구성되어 있다.
아래 코드는 EZ-USB FX3의 GPIO를 이용하여 LED On/Off 하는 Task의 실행 예제이다.
/* Entry function for the gpioOutputThread */
void GpioOutputThread_Entry (uint32_t input)
{
CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
/* Initialize Debug module */
apiRetStatus = CyFxDebugInit();
if (apiRetStatus != CY_U3P_SUCCESS)
{
/* Error handling */
CyU3PDebugPrint (4, "Debug module initialization failed, error code = %d\n", apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
// Initialize GPIO module.
CyFxGpioInit ();
//LED 구동 테스트
for (;;)
{
//LED Off
apiRetStatus = CyU3PGpioSetValue (25, CyTrue);
Delay(500);
//LED On
apiRetStatus = CyU3PGpioSetValue (25, CyFalse);
Delay(500);
}
}
테스트 보드의 GPIO23, 27에는 스위치가 연결되어 있다.