一、简介
FX3 在所有数字 I/O 引脚上提供了由固件控制的内部上拉或下拉 电阻。50k的内部电阻上拉引脚的电平,而10k的电阻下拉 引脚的电平,以避免各个引脚进入悬空状态。I/O 引脚可以有下面状态:
· 三态 (高阻抗)
· 弱上拉(通过内部50k电阻)
· 下拉 (通过内部10k电阻)
· 低功耗模式下保持 (I/O 值不变)
· JTAG TDI、TMC和TRST#信号有固定的50k内部上拉电阻,TCK 信号有固定的10k下拉电阻。
应通过内部上拉电阻将所有未使用的 I/O 上拉为高电平。应保持所有未使用的输出为悬空状态。所有I/O的驱动强度可为全强度、四分之三的强度、半强度或四分之一的强度。为每个接口独立配置这些驱动强度。
EZ-USB在GPIF II和串行外设接口上均可实现灵活的引脚配置。GPIF II接口上任何未使用的控制引脚(CTL[15] 除外)都可作为 通用I/O使用。同样,串行外设接口上任何未使用的引脚均可配 置为通用 I/O。
图1.0 FX3 IO引脚列表
二、程序
GPIO时钟配置、中断回调函数配置函数
extern CyU3PReturnStatus_t
CyU3PGpioInit (
CyU3PGpioClock_t *clk_p, /**< Clock settings for the GPIO block. */
CyU3PGpioIntrCb_t irq /**< GPIO interrupt callback function. */
);
GPIO 驱动能力配置函数
extern CyU3PReturnStatus_t
CyU3PSetGpioDriveStrength (
CyU3PDriveStrengthState_t gpioDriveStrength /**< Desired GPIO Drive strength */
);
简单GPIO 配置函数
extern CyU3PReturnStatus_t
CyU3PGpioSetSimpleConfig (
uint8_t gpioId, /**< Id of the pin being selected as a GPIO. */
CyU3PGpioSimpleConfig_t *cfg_p /**< Desired GPIO configuration. */
);
复杂GPIO配置函数
extern CyU3PReturnStatus_t
CyU3PGpioSetComplexConfig (
uint8_t gpioId, /**< GPIO id to be modified */
CyU3PGpioComplexConfig_t *cfg_p /**< Desired GPIO configuration. */
);
重定向引脚为GPIO函数
extern CyU3PReturnStatus_t
CyU3PDeviceGpioOverride (
uint8_t gpioId, /**< The IO to be converted to GPIO. */
CyBool_t isSimple /**< CyTrue: simple GPIO, CyFalse: complex GPIO */
);
设置(一个)GPIO输出状态
extern CyU3PReturnStatus_t
CyU3PGpioSetValue (
uint8_t gpioId, /**< GPIO id to be modified. */
CyBool_t value /**< Value to set on the GPIO pin. */
);
设置(一个)简单GPIO输出状态
extern CyU3PReturnStatus_t
CyU3PGpioSimpleSetValue (
uint8_t gpioId, /**< GPIO id to be modified. */
CyBool_t value /**< Value to set on the GPIO pin. */
);
对地址操作设置(一个)GPIO输出状态
#define CyFx3GpioSetBit(GpioPin) ((*(uvint32_t *)&GPIO->lpp_gpio_simple[GpioPin]) |= CY_U3P_LPP_GPIO_OUT_VALUE)
#define CyFx3GpioResetBit(GpioPin) ((*(uvint32_t *)&GPIO->lpp_gpio_simple[GpioPin]) &= ~CY_U3P_LPP_GPIO_OUT_VALUE)
在CYUSB3KIT-003开发板上验证点灯
图2.1 CYUSB3KIT-003开发板LED2原理图
GPIO配置源文件
#include "cyfx3_gpio.h"
#include "cyu3error.h"
static CyU3PReturnStatus_t CyFx3GpioOutConfig(uint8_t gpioId,CyBool_t isHigh)
{
//GPIO配置为输出模式,不使能中断
CyU3PGpioSimpleConfig_t GpioOutputConfig = {
.outValue = isHigh,
.driveLowEn = CyTrue,
.driveHighEn = CyTrue,
.inputEn = CyFalse,
.intrMode = CY_U3P_GPIO_NO_INTR,
};
return CyU3PGpioSetSimpleConfig(gpioId,&GpioOutputConfig);
}
static CyU3PReturnStatus_t CyFx3GpioInConfig(uint8_t gpioId)
{
//GPIO配置为输入模式,不使能中断
CyU3PGpioSimpleConfig_t GpioInputConfig = {
.outValue = CyTrue,
.driveLowEn = CyFalse,
.driveHighEn = CyFalse,
.inputEn = CyTrue,
.intrMode = CY_U3P_GPIO_NO_INTR,
};
return CyU3PGpioSetSimpleConfig(gpioId,&GpioInputConfig);
}
CyU3PReturnStatus_t CyFx3GpioInit(void)
{
CyU3PReturnStatus_t CyFx3Status = CY_U3P_SUCCESS;
//GPIO时钟配置(整个工程中只需要初始化一次)
CyU3PGpioClock_t GpioClkConifg = {
.fastClkDiv = 2,
.slowClkDiv = 0,
.halfDiv = 0,
.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2,
.clkSrc = CY_U3P_SYS_CLK,
};
CyFx3Status = CyU3PGpioInit(&GpioClkConifg,NULL);
if(CyFx3Status != CY_U3P_SUCCESS)
{
return CyFx3Status;
}
//设置GPIO驱动强度
return CyU3PSetGpioDriveStrength(CY_U3P_DS_FULL_STRENGTH);
}
CyU3PReturnStatus_t CyFx3GpioConfig(void)
{
CyU3PReturnStatus_t CyFx3Status = CY_U3P_SUCCESS;
//UART_CTS 重定向为普通IO
CyFx3Status = CyU3PDeviceGpioOverride(LED_GPIO_PIN,CyTrue);
if(CyFx3Status != CY_U3P_SUCCESS)
{
return CyFx3Status;
}
CyFx3Status = CyFx3GpioOutConfig(LED_GPIO_PIN,CyFalse);
if(CyFx3Status != CY_U3P_SUCCESS)
{
return CyFx3Status;
}
CyFx3Status = CyFx3GpioInConfig(KEY_GPIO_PIN);
if(CyFx3Status != CY_U3P_SUCCESS)
{
return CyFx3Status;
}
return CyFx3Status;
}
GPIO配置头文件
#ifndef CYFX3_GPIO_H_
#define CYFX3_GPIO_H_
#include "cyu3gpio.h"
#include "gpio_regs.h"
#define KEY_GPIO_PIN 45
#define LED_GPIO_PIN 54
//直接对地址操作
#define CyFx3GpioReadBit(GpioPin) ((GPIO->lpp_gpio_simple[GpioPin]& CY_U3P_LPP_GPIO_IN_VALUE) >> 1)
#define CyFx3GpioSetBit(GpioPin) ((*(uvint32_t *)&GPIO->lpp_gpio_simple[GpioPin]) |= CY_U3P_LPP_GPIO_OUT_VALUE)
#define CyFx3GpioResetBit(GpioPin) ((*(uvint32_t *)&GPIO->lpp_gpio_simple[GpioPin]) &= ~CY_U3P_LPP_GPIO_OUT_VALUE)
#define LED_BRIGHT CyFx3GpioSetBit(LED_GPIO_PIN)
#define LED_EXTINGUISH CyFx3GpioResetBit(LED_GPIO_PIN)
#define LED_TOGGLE ((*(uvint32_t *)&GPIO->lpp_gpio_simple[LED_GPIO_PIN]) ^= CY_U3P_LPP_GPIO_OUT_VALUE)
//调用函数操作
//#define LED_BRIGHT CyU3PGpioSetValue(LED_GPIO_PIN,CyFalse)
//#define LED_EXTINGUISH CyU3PGpioSetValue(LED_GPIO_PIN,CyTrue)
#define KEY_INPUT CyFx3GpioReadBit(KEY_GPIO_PIN)
CyU3PReturnStatus_t CyFx3GpioInit(void);
CyU3PReturnStatus_t CyFx3GpioConfig(void);
#endif /* CYFX3_GPIO_H_ */
主函数
#include "cyfx3_gpio.h"
#include "cyu3os.h"
#include "cyu3error.h"
CyU3PThread LedThreadHandler;
#define LED_THREAD_PRIORITY 8
#define LED_THREAD_STACK_SIZE 512
void LedThread(uint32_t arg)
{
CyFx3GpioInit();
CyFx3GpioConfig();
while(1)
{
LED_BRIGHT;
CyU3PThreadSleep(500);
LED_EXTINGUISH;
CyU3PThreadSleep(500);
}
}
void CyFxApplicationDefine(void)
{
void *LedStackStart = CyU3PMemAlloc(LED_THREAD_STACK_SIZE);
if(LedStackStart != NULL)
{
CyU3PThreadCreate((CyU3PThread* ) &LedThreadHandler,
(char* ) "21:Led Thread 1",
(CyU3PThreadEntry_t) LedThread,
(uint32_t ) 0,
(void* ) LedStackStart,
(uint32_t ) LED_THREAD_STACK_SIZE,
(uint32_t ) LED_THREAD_PRIORITY,
(uint32_t ) LED_THREAD_PRIORITY,
(uint32_t ) CYU3P_NO_TIME_SLICE,
(uint32_t ) CYU3P_AUTO_START);
}
}
int main(void)
{
CyU3PReturnStatus_t CyFx3Status;
//初始化FX3设备
CyFx3Status = CyU3PDeviceInit(NULL);
if(CyFx3Status != CY_U3P_SUCCESS)
{
goto HandleFatalError;
}
//初始化FX3内核缓存
CyFx3Status = CyU3PDeviceCacheControl(CyTrue,CyTrue,CyTrue);
if(CyFx3Status != CY_U3P_SUCCESS)
{
goto HandleFatalError;
}
//配置IO矩阵(16位数据总线 + UART + GPIO)
CyU3PIoMatrixConfig_t MatrixcConfig = {
.isDQ32Bit = CyFalse,
.s0Mode = CY_U3P_SPORT_INACTIVE,
.s1Mode = CY_U3P_SPORT_INACTIVE,
.useUart = CyTrue,
.useI2C = CyFalse,
.useI2S = CyFalse,
.useSpi = CyFalse,
.lppMode = CY_U3P_IO_MATRIX_LPP_UART_ONLY,
.gpioSimpleEn[0] = 0, //GPIO0~GPIO31
.gpioSimpleEn[1] = (0x01 << (KEY_GPIO_PIN - 32)), //GPIO32~GPIO60 使能GPIO45引脚
/*GPIO54为串口的CTS引脚 所有不用配置*/
.gpioComplexEn[0] = 0,
.gpioComplexEn[1] = 0,
};
CyFx3Status = CyU3PDeviceConfigureIOMatrix(&MatrixcConfig);
if (CyFx3Status != CY_U3P_SUCCESS)
{
goto HandleFatalError;
}
//初始化RTOS内核
CyU3PKernelEntry();
HandleFatalError:
//复位
CyU3PDeviceReset(CyTrue);
}
三、验证
烧录验证 LED 500MS翻转一次