|
我看完GPIO的驱动程序后发现火哥对GPIO配置了以下功能,但是我在.c文件中并没有找到对于不同配置输入进行不同处理的地方,但是通过实验的确输入不同配置参数比如上拉下拉单片机都做出了不同的反应。火哥到底在哪里对他们进行了处理呢?求解释!
//定义管脚方向
typedef enum GPIO_CFG
{
//这里的值不能改!!!
GPI = 0, //定义管脚输入方向 GPIOx_PDDRn里,0表示输入,1表示输出
GPO = 1, //定义管脚输出方向
GPI_DOWN = 0x02, //输入下拉 PORTx_PCRn需要PE=1,PS=0
GPI_UP = 0x03, //输入上拉 PORTx_PCRn需要PE=1,PS=1
GPI_PF = 0x10, //输入,带无源滤波器,滤波范围:10 MHz ~ 30 MHz 。不支持高速接口(>=2MHz) 0b10000 Passive Filter Enable
GPI_DOWN_PF = GPI_DOWN | GPI_PF , //输入下拉,带无源滤波器
GPI_UP_PF = GPI_UP | GPI_PF , //输入上拉,带无源滤波器
GPO_HDS = 0x41, //输出高驱动能力 0b100 0001 High drive strength
GPO_SSR = 0x05, //输出慢变化率 0b101 Slow slew rate
GPO_HDS_SSR = GPO_HDS | GPO_SSR, //输出高驱动能力、慢变化率
} GPIO_CFG; //最低位为0,肯定是输入;GPI_UP 和 GPI_UP_PF的最低位为1,其他为输出
以下是gpio.c中的内容:
/******************** (C) COPYRIGHT 2011 野火嵌入式开发工作室 ********************
* 文件名 :gpio.c
* 描述 :gpio驱动函数
*
* 实验平台 :野火kinetis开发板
* 库版本 :
* 嵌入系统 :
*
* 作者 :野火嵌入式开发工作室
* 淘宝店 :http://firestm32.taobao.com
* 技术支持论坛 :http://www.ourdev.cn/bbs/bbs_list.jsp?bbs_id=1008
**********************************************************************************/
#include "common.h"
#include "gpio.h"
volatile struct GPIO_MemMap *GPIOx[5] = {PTA_BASE_PTR, PTB_BASE_PTR, PTC_BASE_PTR, PTD_BASE_PTR, PTE_BASE_PTR}; //定义五个指针数组保存 GPIOx 的地址
volatile struct PORT_MemMap *PORTX[5] = {PORTA_BASE_PTR, PORTB_BASE_PTR, PORTC_BASE_PTR, PORTD_BASE_PTR, PORTE_BASE_PTR};
/*************************************************************************
* 野火嵌入式开发工作室
*
* 函数名称:gpio_init
* 功能说明:初始化gpio
* 参数说明:PORTx 端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
* n 端口引脚
* IO 引脚方向,0=输入,1=输出
* data 输出初始状态,0=低电平,1=高电平 (对输入无效)
* 函数返回:无
* 修改时间:2012-1-15 已测试
* 备 注:
*************************************************************************/
void gpio_init (PORTx portx, u8 n, GPIO_CFG cfg, u8 data)
{
ASSERT( (n < 32u) && (data < 2u) ); //使用断言检查输入、电平 是否为1bit
//选择功能脚 PORTx_PCRx ,每个端口都有个寄存器 PORTx_PCRx
PORT_PCR_REG(PORTX[portx], n) = (0 | PORT_PCR_MUX(1) | cfg);
//端口方向控制输入还是输出
if( ( (cfg & 0x01) == GPI) || (cfg == GPI_UP) || (cfg == GPI_UP_PF) )
// 最低位为0则输入 || 输入上拉模式 || 输入上拉,带无源滤波器
{
GPIO_PDDR_REG(GPIOx[portx]) &= ~(1 << n); //设置端口方向为输入
}
else
{
GPIO_PDDR_REG(GPIOx[portx]) |= (1 << n); //设置端口方向为输出
if(data == 1)//output
{
GPIO_SET(portx, n, 1); //对端口输出控制,输出为1
}
else
{
GPIO_SET(portx, n, 0); //对端口输出控制,输出为0
}
}
}
/*************************************************************************
* 野火嵌入式开发工作室
*
* 函数名称:gpio_set
* 功能说明:设置引脚状态
* 参数说明:PORTx 端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
* n 端口引脚
* data 输出初始状态,0=低电平,1=高电平
* 函数返回:无
* 修改时间:2012-1-16 已测试
* 备 注:
*************************************************************************/
void gpio_set (PORTx portx, u8 n, u8 data)
{
ASSERT( (n < 32u) && (data < 2u) ); //使用断言检查输入、电平 是否为1bit
if(data == 1) //输出
GPIO_SET(portx, n, 1); //GPIO_PDOR_REG(PORTx) |= (1<<n);
else
GPIO_SET(portx, n, 0); //GPIO_PDOR_REG(PORTx) &= ~(1<<n);
}
/*************************************************************************
* 野火嵌入式开发工作室
*
* 函数名称:gpio_turn
* 功能说明:反转引脚状态
* 参数说明:PORTx 端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
* n 端口引脚
* 函数返回:无
* 修改时间:2012-1-15 已测试
* 备 注:
*************************************************************************/
void gpio_turn (PORTx portx, u8 n)
{
ASSERT( n < 32u ); //使用断言检查引脚号
GPIO_TURN(portx, n);
}
/*************************************************************************
* 野火嵌入式开发工作室
*
* 函数名称:gpio_get
* 功能说明:读取引脚输入状态
* 参数说明:PORTx 端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
* n 端口引脚
* 函数返回:无
* 修改时间:2012-1-15 已测试
* 备 注:
*************************************************************************/
u8 gpio_get(PORTx portx, u8 n) //读取引脚状态
{
ASSERT( n < 32u ); //使用断言检查引脚号
return GPIO_Get(portx, n);
}
|
|