📄 gpio.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 + -