通用输入输出(GPIO)¶
简介¶
GPIO(通用IO端口)每个GPIO端口都有相应的控制寄存器和配置寄存器。API分为两类:一类是单独操作一个pin,另一类是可同时操作一个或多个pin。提供IO输入输出状态查询接口、中断屏蔽接口、中断状态查询接口、中断清除接口、中断触发方式配置接口(可配置为:低电平触发、高电平触发、上升沿触发、下降沿触发、双边沿触发)等,以满足不同应用的要求。
CI14LP系列芯片有PA、PB、PC共3组GPIO,每组8个pin脚(pin_0~pin_7),管脚复用功能详见 driver\ci14lp_chip_driver\inc\ci3422.h(或对应封装头文件 ci140xx.h / ci14642.h)中的 pad_name_t 枚举注释。
API¶
- 以下API可配置PAD复用功能
| 函数名 | 描述 |
|---|---|
| gpio_set_pad_reuse | 配置管脚复用对应功能 |
| gpio_set_ad_pad_reuse | 配置管脚数字/模拟功能选择 |
| gpio_set_pad_open_drain | 配置管脚开漏功能(例如IIC需要引脚配置成此功能) |
| gpio_set_pad_pull | 配置管脚上下拉功能 |
- 以下API可同时操作一个或多个pin脚
| 函数名 | 描述 |
|---|---|
| gpio_set_output_mode | 管脚配置为输出模式 |
| gpio_set_input_mode | 管脚配置为输入模式 |
| gpio_get_direction_status | 获取管脚输入输出方向 |
| gpio_irq_mask_config | 管脚中断屏蔽配置 |
| gpio_irq_trigger_config | 管脚中断触发方式配置 |
| gpio_set_output_level | 控制管脚输出电平 |
| gpio_set_output_high_level | 管脚输出高电平 |
| gpio_set_output_low_level | 管脚输出低电平 |
| gpio_get_input_level | 获取管脚输入电平 |
| gpio_irq_enable | 管脚中断使能 |
- 以下API一次只操作一个pin脚
| 函数名 | 描述 |
|---|---|
| gpio_get_direction_single_status | 获取一个管脚输入输出方向 |
| gpio_get_irq_raw_single_status | 获取一个管脚中断屏蔽前状态 |
| gpio_get_irq_mask_single_status | 获取一个管脚中断屏蔽后状态 |
| gpio_clear_single_irq | 清除一个管脚中断 |
| gpio_set_output_single_level | 控制一个管脚输出电平 |
| gpio_get_input_single_level | 获取一个管脚输入电平 |
- 以下API为中断处理相关
| 函数名 | 描述 |
|---|---|
| registe_gpio_callback | 注册GPIO中断回调函数 |
| pa_irq_handler / pb_irq_handler / pc_irq_handler | GPIO组中断处理函数 |
关键类型¶
| 类型/宏 | 说明 |
|---|---|
| gpio_base_t | GPIO组基地址:PA、PB、PC |
| gpio_pin_t | 管脚位掩码:PIN_0~PIN_7、PIN_ALL(可组合) |
| gpio_direction_t | GPIO_DIRECTION_INPUT(输入)、GPIO_DIRECTION_OUTPUT(输出) |
| gpio_trigger_t | 中断触发方式:HIGH_LEVEL_TRIGGER、LOW_LEVEL_TRIGGER、UP_EDGES_TRIGGER、DOWB_EDGES_TRIGGER、BOTH_EDGES_TRIGGER |
| pad_name_t | 管脚名枚举:PA0PC3,每项注释带完整复用功能表(模拟功能/1st9th复用) |
| pad_resue_function_t | FIRST_FUNCTIONNINTH_FUNCTION(第19复用功能) |
| ad_pad_reuse_mode_t | DIGITAL_MODE(数字功能)、ANALOG_MODE(模拟功能) |
| scu_pad_pull_t | SCU_PAD_PULL_DISABLE / SCU_PAD_PULL_UP / SCU_PAD_PULL_DOWN |
特别说明¶
- 使用GPIO前需要先开启对应外设时钟并配置引脚复用,本SDK使用
scu_set_device_clock_en()+scu_set_pad_reuse()组合(旧SDK的scu_set_device_gate()/dpmu_set_io_reuse()在本SDK中不存在)。 - 部分引脚为模拟功能复用(如MADC PDM、DCODEC PDM/DAC引脚),配置为GPIO时需先调用
scu_set_ad_pad_reuse()切为数字模式。
普通IO示例¶
以下代码配置PB5为PWM2功能复用并关闭上下拉(projects\offline_asr_sample\src\system_init.c):
scu_set_device_clock_en(HAL_PWM2_BASE, ENABLE); //开启PWM2时钟
scu_set_pad_reuse(PB5, SIXTH_FUNCTION); //设置引脚功能复用
scu_set_pad_pull(PB5, SCU_PAD_PULL_DISABLE); //设置关闭上下拉
以下代码控制PA组pin_7输出模式并输出电平:
scu_set_device_clock_en((unsigned int)PA, ENABLE); //开启GPIOA时钟
scu_set_pad_reuse(PA7, FIRST_FUNCTION); //设置引脚功能复用为GPIO
scu_set_pad_pull(PA7, SCU_PAD_PULL_DISABLE); //设置关闭上下拉
gpio_set_output_mode(PA, PIN_7); //pin脚配置成输出模式
gpio_set_output_single_level(PA, PIN_7, 0); //输出低电平
gpio_set_output_single_level(PA, PIN_7, 1); //输出高电平
以下代码配置PA组pin_7为输入模式并读取电平:
scu_set_device_clock_en((unsigned int)PA, ENABLE); //开启GPIOA时钟
scu_set_pad_reuse(PA7, FIRST_FUNCTION); //设置引脚功能复用为GPIO
scu_set_pad_pull(PA7, SCU_PAD_PULL_DISABLE); //设置关闭上下拉
gpio_set_input_mode(PA, PIN_7); //pin脚配置成输入模式
if(0 == gpio_get_input_single_level(PA, PIN_7)) //获取IO电平
{
//INFO:输入为低电平
}
else
{
//INFO:输入为高电平
}
以下代码配置PA组pin_7的中断为双边沿触发:
scu_set_device_clock_en((unsigned int)PA, ENABLE); //开启GPIOA时钟
scu_set_pad_reuse(PA7, FIRST_FUNCTION); //设置引脚功能复用为GPIO
gpio_set_input_mode(PA, PIN_7); //pin脚配置成输入模式
gpio_irq_trigger_config(PA, PIN_7, BOTH_EDGES_TRIGGER); //中断触发方式
eclic_irq_enable(PA_IRQn); //使能中断
开漏输出示例¶
以下代码配置IIC引脚为开漏输出模式(支持外部上拉5V):
scu_set_pad_reuse(PA2, THIRD_FUNCTION); //设置引脚功能复用为IIC
scu_set_pad_reuse(PA3, THIRD_FUNCTION); //设置引脚功能复用为IIC
gpio_set_pad_open_drain(PA2, ENABLE); //配置引脚开漏功能
gpio_set_pad_open_drain(PA3, ENABLE); //配置引脚开漏功能
scu_set_pad_pull(PA2, SCU_PAD_PULL_DISABLE); //关闭上拉,使用外部上拉
scu_set_pad_pull(PA3, SCU_PAD_PULL_DISABLE); //关闭上拉,使用外部上拉
GPIO中断回调注册示例¶
#include "ci_gpio.h"
//中断回调函数链表节点
static gpio_irq_callback_list_t key_callback_node;
static void key_irq_callback(gpio_base_t base, gpio_pin_t pin)
{
//中断处理逻辑
}
void key_gpio_init(void)
{
scu_set_device_clock_en((unsigned int)PA, ENABLE);
scu_set_pad_reuse(PA3, FIRST_FUNCTION);
gpio_set_input_mode(PA, PIN_3);
gpio_irq_trigger_config(PA, PIN_3, HIGH_LEVEL_TRIGGER);
key_callback_node.base = PA;
key_callback_node.pins = PIN_3;
key_callback_node.callback = key_irq_callback;
registe_gpio_callback(PA, &key_callback_node); //注册中断回调
eclic_irq_enable(PA_IRQn);
}
低功耗唤醒IO示例¶
以下为板级配置(driver\boards\CI-L0XGS01D-V10.h)中GPIO中断退出低功耗的配置宏:
/* GPIO中断退出低功耗配置 */
#define EXIT_DEEP_LOWPOWER_PIN PA3
#define EXIT_DEEP_LOWPOWER_GPIO_TRIGGER HIGH_LEVEL_TRIGGER
API 参考¶
本模块接口声明于 driver\ci14lp_chip_driver\inc\ci14lp_gpio.h,实现位于 driver\ci14lp_chip_driver\src\ci14lp_gpio.c。
管脚复用枚举定义于 driver\ci14lp_chip_driver\inc\ci3422.h(ci140xx.h / ci14642.h / ci342xx.h 按封装型号)。