GPIO协议
定义
- GPIO(General Purpose Input Output)通用输入输出口
- 可配置为8种输入输出模式
- 引脚电平:0V~3.3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
GPIO基本结构
GPIO位结构
GPIO模式
GPIO的模式一共有八个,就是四个输入四个输出。通过配置GPIO的端口配置寄存器。
- 浮空输入(Input floating)
- 上拉输入(Input pull-up)
- 下拉输入(Input-pull-down)
- 模拟输入(Analog)
- 开漏输出(Output open-drain)
- 推挽输出(Output push-pull)
- 复用开漏输出(Alternate function open-drain)
- 复用推挽输出(Alternate function pull-push)
端口可以配置成以下8种模式:
代码应用
- STM32
//开启时钟RCC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
- ESP32
ESP32主要是根据官方文档给出得用例,来完成GPIO驱动的。官方文档配置的结构体如下:
typedef struct
{
uint64_t pin_bit_mask; //要配置的GPIO引脚位码
gpio_mode_t mode; //GPIO输入输出模式
gpio_pullup_t pull_up_en; //设置上拉
gpio_pulldown_t pull_down_en; //设置下拉
gpio_int_type_t intr_type; //GPIO中断类型
}gpio_config_t;
#define GPIO_OUTPUT_IO_0 5 //设置输出引脚
#define GPIO_OUTPUT_PIN_SEL ((1ULL<<GPIO_OUTPUT_IO_0)) //
#define GPIO_INPUT_IO_0 34
#define GPIO_INPUT_PIN_SEL ((1ULL<<GPIO_INPUT_IO_0))
#define ESP_INTR_FLAG_DEFAULT 0
//初始化GPIO
void ds_touch_gpio_init(){
//初始化结构
gpio_config_t io_conf;
//禁止中断
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
//设置输出模式
io_conf.mode = GPIO_MODE_OUTPUT;
//设置引脚位码
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
//禁止下拉使能
io_conf.pull_down_en = 0;
//禁止上拉使能
io_conf.pull_up_en = 0;
//配置GPIO,返回ESP_OK success,或者ESP_ERR_INVALID_ARG Parameter error
gpio_config(&io_conf);
//GPIO的中断类型,上升沿或者下降沿
io_conf.intr_type = GPIO_INTR_ANYEDGE;
//设置引脚位码
io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
//设置输入模式
io_conf.mode = GPIO_MODE_INPUT;
//允许使能上拉
io_conf.pull_up_en = 1;
gpio_config(&io_conf);
//改变GPIO中断位引脚
// gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_NEGEDGE);
//create a queue to handle gpio event from isr
gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
//开始GPIO任务
xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);
//安装GPIO中断服务程序驱动,开启每个引脚GPIO中断处理程序
gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
//给GPIO引脚添加中断处理回调函数
gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
}
小结
GPIO的输出模式,选型的思考,推挽输出模式下,输出具有驱动能力,当CPU输出逻辑'0'时,I/O端口输出低电平,而
当CPU输出逻辑'1'时,输出高电平,一般用于驱动LED,数码管等电子元器件或输出控制某个信号;
开漏输出:适合做电流型的驱动,吸收电流能力较强。当CPU输出逻辑'0'时,I/O端口输出低电平,当CPU输出逻辑'1'时,该引脚处于开漏,也就是浮空状态(高阻态),如果想输出高电平必须接入上拉电阻,同时IO口,可以由外部电路改变位低电平或不变,即可读IO输入电平变化,实现IO口的双向功能;此外还可以将多路开漏输出的引脚连接到一条线上,通过一个上拉电阻,在不增加任何器件的情况下,形成“逻辑与”关系,这也是I2C等总线判断总线占用状态的原理;
复用推挽输出:在STM32中,一个引脚通常可作为普通GPIO来使用,但通常有多个复用模块对应着同一个引脚,那么当这个GPIO作为内置外设引脚时,就叫做复用模式。使用场合:常见片内外设(USART TX/SPI/PWM输出等等)
复用开漏输出:与开漏输出模式一致,不过引脚选择了复用功能。使用场合:常见片内外设(I2C/SMBus etc);
GPIO代码配置思路:
RCC时钟配置-> APB2 -> GPIO结构体 -> GPIO的各种模式,参数配置