高通方案gpio

 Gpio

1.1.1   GPIO的作用

GPIO 作为QSC60X5 与外界沟通的桥梁,主要有四个作用:
1. 通过GPIO 向外部输出一个高/低电平,控制外部的器件或者通知外部器件某事件的发生。
例如我们可以通过GPIO 输出一个高电平点亮一个LED, 或者输出低电平关掉一个LED。
2. 通过GPIO 读入一个外界的高低电平输入,检测外部器件的当前状态。例如键盘按键是否
按下的探测。
3. 将GPIO 口作为外部中断信号的一个输入口,实时检测外部事件的发生。
4. 将GPIO 用作其他特定用途。例如用作I2C 通信、数据线、地址线等。
1.1.2   GPIO的用法

1. 配置一个GPIO 口。通常一个GPIO 有多种功能,我们可以将GPIO 配置为符合我们当前需要的功能;同时我们也可以将GPIO配置为内部具有上拉电阻、下拉电阻或者没有任何上下拉电阻。文件GPIO_60x5.c 中定义了配置GPIO 的函数接口
void gpio_tlmm_config(GPIO_SignalType  gpio_signal)
{


}
gpio_signal 指定要配置成的功能,文件GPIO_60x5.h 枚举出了每个GPIO 的可配置的功能选项:
typedef enum
{


GPIO_OUTPUT_3          = GPIO_OUT(3,0),
GPIO_INPUT_3           = GPIO_IN(3,0,GPIO_PULL_DOWN),
SDCC_DATA0             = GPIO_ALT(3,0,1,GPIO_PULL_UP),
DBG_BUS_IN_7           = GPIO_ALT(3,0,2,GPIO_PULL_DOWN),…

}
例子:
SDCC_DATA0 = GPIO_ALT(3,0,1,GPIO_PULL_UP)   gpio_tlmm_config(SDCC_DATA); /* 将GPIO3 配置为SD卡 的数据线1*/ gpio_tlmm_config(GPIO_INTPUT_3); /* 将GPIO3 配置为通用的有下拉电阻的输入端口*/
2. 从GPIO 输出高/低电平。首先应该通过函数接口gpio_out来确定GPIO输出高电平或者低电平,然后通过函数接口gpio_tlmm_config把该GPIO配置为通用功能(非特定功能),在该配置函数中调用一个宏函数接口BIO_TRISTATE 打开GPIO 使能,将此电平输出出去。
void gpio_out(GPIO_SignalType  gpio_signal,GPIO_ValueType   gpio_value) /*将GPIO 寄存器设置输出的电平*/ BIO_TRISTATE(io, mask, val) /*GPIO 寄存器中的值输出出去:输出使能*/
例子:使GPIO 31 输出低电平
gpio_out(GPIO_OUTPUT_31, GPIO_LOW_VALUE);
gpio_tlmm_config(GPIO_OUTPUT_31);    
3. 从GPIO 读入外部器件输入的高/低电平,检测外部的事件或者状态。只能从一个输出已被disable 的GPIO 读入输入的高/低电平,也就是说只能从一个已被设置为输入模式的GPIO 读入高/低电平。从GPIO 读入外部输入的高/低电平的宏函数接口:
GPIO_ValueType gpio_in
(
GPIO_SignalType  gpio_signal
),
gpio_signal解释见上面的说明,而返回值
typedef enum
{
    GPIO_LOW_VALUE  = 0,
    GPIO_HIGH_VALUE = 1
} GPIO_ValueType;
例:判断GPIO3的当前状态
gpio_tlmm_config(GPIO_INTPUT_3);
if (gpio_in(GPIO_INTPUT_3) == GPIO_LOW_VALUE)
{
…..
}
4. 将GPIO 设置为某个中断信号的输入口。这样外部器件一旦有中断信号(高电平或者低电平)输入到此GPIO 端口,将直接触发一个中断,指定的ISR 将被调用,处理中断事件。中断的好处在于中断事件可以实时得到处理,无论系统是否处于睡眠状态。接口函数有两个:
A)gpio_int_set_detect(gpio_int_type which_group_int, gpio_int_detect_type detect) /*指定边沿触发还是电平触发*/
B) boolean gpio_int_set_handler
(
gpio_int_type which_group_int,
gpio_int_polarity_type polarity,
gpio_int_handler_type handler
) /*指定ISR 以及触发极性*/
typedef enum
{
/* GPIO_GROUP 1*/
GPIO_INT_0 = 0,
GPIO_INT_1,
GPIO_INT_2,
GPIO_INT_3,
GPIO_INT_4,


} gpio_int_type;
typedef enum
{
DETECT_LEVEL = 0,
DETECT_EDGE
} gpio_int_detect_type;
typedef enum
{
ACTIVE_LOW = 0,
ACTIVE_HIGH
} gpio_int_polarity_type;
A) 参数which_group_int 指定GPIO , detect 指定中断是电平触发方式还是边沿触发方式。
B) 参数which_group_int 指定GPIO, polarity 与gpio_int_set_detect 中指定的detect 值相关, 若detect 指定电平触发方式,polarity 就表示指定中断是高电平触发还是低电平触发;若detect 指定边沿触发方式,polarity 就表示指定中断是上升沿触发还是下降沿触发。handler 指定该中断的ISR,若handle 为NULL 则表示取消此GPIO 的中断处理,
也就是说以后此GPIO 输入任何信号都不会触发中断了。
例子:/*将GPIO 3 设置为中断高电平触发*/
gpio_int_set_detect (GPIO_INT_3, DETECT_LEVEL );
gpio_int_set_handler(GPIO_INT_3, ACTIVE_HIGH, &GPIO_3_isr);
1.1.3   GPIO注意事项

1. 必须保证我们要用的GPIO 没有已被其他地方用作其它用途,否则可能会出现一些莫名其妙的现象。
2. 确保GPIO 已被正确配置。每个GPIO 都有缺省的配置,如果缺省的配置不符合我们的要求,我们就需要对GPIO 进行重新配置。
3. 注意GPIO 的上拉电阻或者下拉电阻的设置情况。例如:将GPIO 设置为有下来电阻输入口,若外部输入的高电平电压不够高,就可能导致读入电平介于高低电平电压之间,从而无法准确辨别出高电平还是低电平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值