三、斯普拉斯EZ-USB FX3 GPIO点灯

一、简介

        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翻转一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值