ESP32-IDF学习笔记之GPIO点亮LED

官方API参考:​​​​​​https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/peripherals/gpio.html

使用谷歌浏览器可以在线翻译网页比较方便

1.GPIO头文件:

#include "driver/gpio.h"

2.gpio_config(const gpio_config_t *pGPIOConfig) 函数GPIO 通用配置。

    配置成功返回:ESP_OK

    配置失败返回:ESP_ERR_INVALID_ARG

    *pGPIOConfig:指向 GPIO 配置结构体的指针 

      gpio_config_t  结构体如下:

/*官方库 gpio_types.h 
   路径:<IDF的安装目录>\components\hal\include\hal */
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;

    pin_bit_mask每个GPIO引脚都都对应二进制的一个位,比如GPIO23对应二进制的第23位

    二进制的第0位对应的是GPIO0,官方的配置写法:

#define GPIO_OUTPUT_IO_0    18
#define GPIO_OUTPUT_IO_1    19
#define GPIO_OUTPUT_PIN_SEL  ((1ULL<<GPIO_OUTPUT_IO_0) | (1ULL<<GPIO_OUTPUT_IO_1))
 gpio_config_t io_conf;   //GPIO配置结构体
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;

//可以看出1ULL是一个64位的宏定义,值为 0x00000001

     gpio_mode_t mode:设置输入/输出模式,gpio_mode_t枚举 类型的定义:

typedef enum {
    GPIO_MODE_DISABLE = GPIO_MODE_DEF_DISABLE,                                                         /*!< 禁用输入和输出             */
    GPIO_MODE_INPUT = GPIO_MODE_DEF_INPUT,                                                             /*!< 仅输入                           */
    GPIO_MODE_OUTPUT = GPIO_MODE_DEF_OUTPUT,                                                           /*!< 仅输出模式                     */
    GPIO_MODE_OUTPUT_OD = ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)),                               /*!< 仅在开漏模式下输出     */
    GPIO_MODE_INPUT_OUTPUT_OD = ((GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)), /*!< 输出和输入开漏模式*/
    GPIO_MODE_INPUT_OUTPUT = ((GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT)),                         /*!< 输出和输入模式                */
} gpio_mode_t;

    官方写法

 gpio_config_t io_conf;   //GPIO配置结构体
io_conf.mode = GPIO_MODE_OUTPUT;    //为输出模式

LED_cof.mode = GPIO_MODE_DEF_OUTPUT;  //也可以这样写,GPIO_MODE_DEF_OUTPUT应该是个宏定义

    pull_up_en:  设置GPIO上拉    在GPIO为输入模式时使用,

typedef enum {
    GPIO_PULLUP_DISABLE = 0x0,     /*!< 禁止上拉 */
    GPIO_PULLUP_ENABLE = 0x1,      /*!< 启用上拉 */
} gpio_pullup_t;

    pull_down_en  设置GPIO下拉    在GPIO为输入模式时使用,

typedef enum {
    GPIO_PULLDOWN_DISABLE = 0x0,   /*!< 禁止下拉 */
    GPIO_PULLDOWN_ENABLE = 0x1,    /*!< 启用下拉  */
} gpio_pulldown_t;

    gpio_int_type_t intr_type   GPIO中断类型:

typedef enum {
    GPIO_INTR_DISABLE = 0,     /*!< 禁用GPIO中断                            */
    GPIO_INTR_POSEDGE = 1,     /*!< 启用GPIO上升沿中断                  */
    GPIO_INTR_NEGEDGE = 2,     /*!< 启用GPIO下降沿中断                 */
    GPIO_INTR_ANYEDGE = 3,     /*!< 启用GPIO上升沿和下降沿中断 */
    GPIO_INTR_LOW_LEVEL = 4,   /*!< 启用GPIO高电平触发中断      */
    GPIO_INTR_HIGH_LEVEL = 5,  /*!< 启用GPIO低电平触发中断     */
    GPIO_INTR_MAX,
} gpio_int_type_t;

    使用gpio_config(const gpio_config_t *pGPIOConfig)函数配置GPIO:

	#define LED1_IO 23
    #define LED1_IO_PIN (1ULL<<23)


    gpio_config_t LED_cof;                  //定义结构体
	LED_cof.pin_bit_mask = LED1_IO_PIN;     //需要配置的GPIO
	LED_cof.mode = GPIO_MODE_OUTPUT;        //GPIO输入输出模式 gpio推挽输出
	LED_cof.pull_up_en = 0;                 //禁用上拉
	LED_cof.pull_down_en = 0;               //禁用下拉
	LED_cof.intr_type = 0;                  //禁用GPIO中断 

	if (gpio_config(&LED_cof) == ESP_OK) {  //配置GPIO 这里配置函数传递的参数是结构体地址,而不是结构体本身
		printf("ESP_GPIO_COF_OK\n");
	}
	else {                                                                                                                                                          
		printf("ESP_ERR_INVALID_ARG\n");
		return 0;
	}

3.使用到的函数:

    gpio_set_level(gpio_num_t gpio_num, uint32_t level)  GPIO 设置输出

    参数:gpio_num  GPIO编号
               evel     =     0不输出, 1 输出
 gpio_get_level( gpio_num_t gpio_num )    获取GPIO电平
       参数:gpio_num   gpio编号
       返回:   0 GPIO为低电平,
                1 GPIO为高电平
gpio_set_direction(gpio_num_t gpio_num, gpio_mode_tmode)  为GPIO配置输入输出模式
              参数:        gpio_num   gpio编号
                            mode_tmode     gpio输入输出模式       
gpio_set_pull_mode( gpio_num_t gpio_num , gpio_pull_mode_t pull ) 设置GPIO的上下拉电阻
               参数:     gpio_num  GPIO编号
                          pull      上下拉模式


gpio_pull_mode_t 枚举定义
 typedef enum {
    GPIO_PULLUP_ONLY,               /*!< 上拉模式            */
    GPIO_PULLDOWN_ONLY,             /*!< 下拉模式          */
    GPIO_PULLUP_PULLDOWN,           /*!< 上拉和下拉模式*/
    GPIO_FLOATING,                  /*!< 禁用上拉和下拉 浮空输入模式           */
} gpio_pull_mode_t;

例如:gpio_set_pull_mode(22,GPIO_PULLUP_ONLY); //将gpio22设置为上拉模式

5.这次简单的使用GPIO来点亮LED,用的是外接MOS管模块来驱动24V的LED,主函数里的死循环里一定要加延时函数,并且延时时间不能太短(大概要10ms左右)太短会触发看门狗,并且ESP32会重启,串口1会有相应的报错打印。

6.驱动LED源代码:

/* Blink Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"


#define LED1_IO 23
#define LED1_IO_PIN (1ULL<<23)



void app_main(void){
/*--------------------------------- LED1的IO配置 ---------------------------------------------------------------*/
	gpio_config_t LED_cof;
	LED_cof.pin_bit_mask = LED1_IO_PIN;
	LED_cof.mode = GPIO_MODE_OUTPUT;      
	LED_cof.pull_up_en = 0;
	LED_cof.pull_down_en = 0;
	LED_cof.intr_type = 0;
	
	if(1ULL == 1)printf("1ULL = 1 \n");

	if (gpio_config(&LED_cof) == ESP_OK) {    //配置GPIO并判断是否配置成功,下载完程序之后打开串口助手,再按一下ESP32的重启键就可以看到打印信息了
		printf("ESP_GPIO_COF_OK\n");
	}
	else {                                                                                                                                                          
		printf("ESP_ERR_INVALID_ARG\n");
		return 0;
	}

/*-------------------------------------- 变量 ---------------------------------------------------------------------------*/
	int HZ1 = 5;
	int HZ2 = 50;


    while(1) {

		gpio_set_level(LED1_IO, 0);           //输出低电平

		vTaskDelay(HZ1 / portTICK_PERIOD_MS);   //延时函数
		gpio_set_level(LED1_IO, 1);               //输出高电平

		vTaskDelay(HZ2 / portTICK_PERIOD_MS);  

    }
}

                 ---------------------------------------------------------我的学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值