GPIO协议

GPIO协议

定义

  • GPIO(General Purpose Input Output)通用输入输出口
  • 可配置为8种输入输出模式
  • 引脚电平:0V~3.3V,部分引脚可容忍5V
  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

GPIO基本结构

img

GPIO位结构
img

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种模式:
img

代码应用

  • 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的各种模式,参数配置

posted @ 2023-07-11 11:29  JaydenHuan  阅读(294)  评论(0编辑  收藏  举报