⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpio.c

📁 K10的GPIO库函数之实现LED灯亮灭
💻 C
字号:
/***************************************************************************************
//文件名称:gpio.c
//功能概要:K10底层驱动程序文件
**************************************************************************************/

#include"gpio.h"

/*******************内部函数声明*****************************************************/
/************************************************************************************
//函数名称:gpio_get_port_addr
//函数返回:端口号对应的端口寄存器组指针
//参数说明:无
//功能概要:将端口号转换成端口寄存器组指针,内部调用
***********************************************************************************/
static PORT_MemMapPtr	gpio_get_port_addr(uint8 port);

/*********************************************************************************
//函数名称:gpio_get_pt_addr
//函数返回:端口号对应的GPIO端口寄存器组指针
//参数说明:无
//功能概要:将端口号转换成端口寄存器组指针,内部调用
*********************************************************************************/
static GPIO_MemMapPtr gpio_get_pt_addr(uint8 port);

/***********************************接口函数实现*********************************************/
/********************************************************************************************
//函数名称:gpio_init
//函数返回:函数执行状态,0=成功,其他为异常
//参数说明:port:端口号,由宏定义
//					pin:引脚号,0~31
//					dir:引脚方向,1=输出,0=输入
//					static:引脚初始状态,1=高电平,0=低电平
//功能概要:初始化端口作为GPIO引脚的功能
**********************************************************************************************/

uint8 gpio_init(uint8 port,uint8 pin,uint8 dir,uint8 state)
{
		//将GPIO端口号转换成端口寄存器组指针
		GPIO_MemMapPtr pt=gpio_get_pt_addr(port);
		PORT_MemMapPtr	p=gpio_get_port_addr(port);
	
		if(!p)
			return 1;//参数错误
		
		//设定通用端口引脚控制寄存器的值,设定为GPIO功能
		PORT_PCR_REG(p,pin)=(0|PORT_PCR_MUX(1));
		
		if(dir==1)//若引脚被定义为输出
		{
				GPIO_PDDR_REG(pt)|=(1<<pin);
				//设定引脚初始化状态
				if(state==1)
				{
							BSET(pin,GPIO_PDOR_REG(pt));
					
				}
				else
					BCLR(pin,GPIO_PDOR_REG(pt));
		}
		else //若引脚被定义为输入
		{
					BCLR(pin,GPIO_PDOR_REG(pt));
		}
		return 0;//成功返回
		
}

/*************************************************************************************
//函数名称:gpio_set
//函数返回:无
//参数说明:port:端口号,由宏定义
//				 pin:引脚号,0~31
//         state:引脚初始状态,1=高电平,0=低电平
//功能概要:获取指定引脚状态
*************************************************************************************/
void gpio_set(uint8 port,uint8 pin,uint8 state)
{
		//将GPIO端口号转换成端口寄存器组指针
		GPIO_MemMapPtr pt=gpio_get_pt_addr(port);
		if(state==0)//控制为低电平
			BCLR(pin,GPIO_PDOR_REG(pt));
		else
			BSET(pin,GPIO_PDOR_REG(pt));
}

/************************************************************************************
//函数名称:gpio_get
//函数返回:指定引脚状态,0=低电平,1=高电平
//参数说明:port:端口号,由宏定义
//					pin:引脚号,0~31
//功能概要:获取指定引脚状态
*************************************************************************************/
uint8 gpio_get(uint8 port,uint8 pin)
{
		uint8 i;
		//将GPIO端口号转换成端口寄存器组指针
		GPIO_MemMapPtr	pt=gpio_get_pt_addr(port);
		//查看引脚状态
		i=BGET(pin,GPIO_PDIR_REG(pt));
		return i;//返回引脚状态(0或1)
}
/*************************************************************************************
//函数名称:gpio_reverse
//函数返回:无
//参数说明:port:端口号,由宏定义
//					pin:引脚号,0~31
//功能概要:反转指定引脚状态
*************************************************************************************/
void gpio_reverse(uint8 port,uint8 pin)
{
			//将GPIO端口号转换成端口寄存器组指针
			GPIO_MemMapPtr pt=gpio_get_pt_addr(port);
			//设置输出取反寄存器的相应位为1,反转指定引脚状态
			BSET(pin,GPIO_PTOR_REG(pt));
}

/*******************内部函数实现****************************************************/
/************************************************************************************
//函数名称:gpio_get_port_addr
//函数返回:端口号对应的端口寄存器组指针
//参数说明:无
//功能概要:将端口号转换成端口寄存器组指针,内部调用
*************************************************************************************/
PORT_MemMapPtr	gpio_get_port_addr(uint8 port)
{
		PORT_MemMapPtr p;
		switch(port)
		{
					case PORT_A:
						p=PORTA_BASE_PTR;
						break;
					case PORT_B:
						p=PORTB_BASE_PTR;
						break;
					case PORT_C:
						p=PORTC_BASE_PTR;
						break;
					case PORT_D:
						p=PORTD_BASE_PTR;
						break;
					case PORT_E:
						p=PORTE_BASE_PTR;
						break;
					default:
						return 0;//输入参数无效返回
		}
		return p;
}
/**************************************************************************************
//函数名称:gpio_get_pt_addr
//函数返回:端口号对应的GPIO端口寄存器组指针
//参数说明:无
//功能概要:将端口号转换成端口寄存器组指针,内部调用
**************************************************************************************/
GPIO_MemMapPtr gpio_get_pt_addr(uint8 port)
{
		GPIO_MemMapPtr p;
		switch(port)
		{
				case PORT_A:
					p=PTA_BASE_PTR;
					break;
				case PORT_B:
					p=PTB_BASE_PTR;
					break;
				case PORT_C:
					p=PTC_BASE_PTR;
					break;
				case PORT_D:
					p=PTD_BASE_PTR;
					break;
				case PORT_E:
					p=PTE_BASE_PTR;
					break;
				default:
					return 0;//输出参数无效返回
		}
		return p;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -