文章目录

  • 一、前言
  • 二、VSCODE + ESP-IDF
  • 2.1、快速创建项目
  • 2.2、选择串口通道,ESP芯片型号
  • 三、代码
  • 3.1、main.c
  • 3.1.1、头文件
  • 3.1.2、全局变量
  • 3.1.3、app_main( )函数
  • 3.2、实验代码
  • 四、相关API
  • 4.1、gpio_reset_pin(gpio_num_t gpio_num)
  • 4.2、gpio_set_direction(gpio_num_t gpio_num,gpio_mode_t mode)
  • 4.3、gpio_set_level(gpio_num_t gpio_num, uint32_t level)
  • 4.4、vTaskDelay(const TickType_t xTicksToDelay)


一、前言


我使用的硬件:

STM32主机 ESP32C3 SPI esp32和stm32f1_esp32


嵌入式软件开发从来都不是从hello world开始,而是从GPIO驱动LED闪烁开始。

本次实验的目的是使用GPIO26与GPIO27各驱动一个LED灯,以300ms的时间间隔闪烁。

STM32主机 ESP32C3 SPI esp32和stm32f1_#include_02


ESP-IDF Monitor打印出来的调试信息:

STM32主机 ESP32C3 SPI esp32和stm32f1_STM32主机 ESP32C3 SPI_03


需要注意⚠️:

STM32主机 ESP32C3 SPI esp32和stm32f1_esp32_04

二、VSCODE + ESP-IDF


2.1、快速创建项目

STM32主机 ESP32C3 SPI esp32和stm32f1_c_05


STM32主机 ESP32C3 SPI esp32和stm32f1_esp32_06


STM32主机 ESP32C3 SPI esp32和stm32f1_esp-idf_07


STM32主机 ESP32C3 SPI esp32和stm32f1_STM32主机 ESP32C3 SPI_08

2.2、选择串口通道,ESP芯片型号

STM32主机 ESP32C3 SPI esp32和stm32f1_c_09


STM32主机 ESP32C3 SPI esp32和stm32f1_STM32主机 ESP32C3 SPI_10


创建项目模块成功,代码成功被编译。

三、代码


3.1、main.c

3.1.1、头文件

  • ESP-IDF是基于freertos的SDK,所以需要包含FreeRTOS.h头文件与task.h头文件。
  • 使用ESP_LOGI( )函数打印一些调试信息,所以包含esp_log.h头文件。
  • 使用GPIO,所以包含driver/gpio.h。

3.1.2、全局变量

STM32主机 ESP32C3 SPI esp32和stm32f1_STM32主机 ESP32C3 SPI_11

3.1.3、app_main( )函数

  • 第一步通过gpio_reset_pin( )函数初始化引脚。
  • 第二步通过gpio_set_direction( )函数将对应的GPIO口设置为输出。
  • 第三步通过gpio_set_level( )函数将电平输出到pin脚上。

3.2、实验代码

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"

static uint8_t s_led_state = 0;
static const char *TAG = "first_example";

void app_main(void)
{
    ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
    /* 复位GPIO的状态 */
    gpio_reset_pin(26);
    gpio_reset_pin(27);

    /* 设置GPIO为输出模式 */
    gpio_set_direction(26,GPIO_MODE_OUTPUT);
    gpio_set_direction(27,GPIO_MODE_OUTPUT);

    while(1)
    {
        ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");

        gpio_set_level(26,s_led_state);         /* GPIO26输出电平 */
        gpio_set_level(27,s_led_state);         /* GPIO27输出电平 */

        s_led_state = !s_led_state;             /* 取反LED的状态 */
        vTaskDelay(300 / portTICK_PERIOD_MS);   /* 延时300ms */

    }
}

四、相关API


esp官方网址:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/gpio.html

4.1、gpio_reset_pin(gpio_num_t gpio_num)

STM32主机 ESP32C3 SPI esp32和stm32f1_STM32主机 ESP32C3 SPI_12


这个函数用于重置mcu引脚的状态,值得注意的是引脚被重置后会使能“上拉”。

4.2、gpio_set_direction(gpio_num_t gpio_num,gpio_mode_t mode)

STM32主机 ESP32C3 SPI esp32和stm32f1_STM32主机 ESP32C3 SPI_13


这个函数用于设置mcu引脚的功能(输入或者输出,或者即是输入又是输出)。

4.3、gpio_set_level(gpio_num_t gpio_num, uint32_t level)

STM32主机 ESP32C3 SPI esp32和stm32f1_esp-idf_14

gpio_set_level(GPIO_NUM_16,0);  //gpio16输出低电平
gpio_set_level(GPIO_NUM_16,1);  //gpio16输出高电平

4.4、vTaskDelay(const TickType_t xTicksToDelay)

STM32主机 ESP32C3 SPI esp32和stm32f1_esp32_15


没有学习过rtos的同学可以认为它是一个延时函数。学过rtos的同学其实知道它会启动rtos的调度器,将CPU的执行权交给其他线程,等待一段时间后回来继续执行代码。

至于为什么以下代码会延时300ms,是因为freeRTOS的滴答定时器的频率被设置为1000Hz。

vTaskDelay(300 / portTICK_PERIOD_MS);   /* 延时300ms */

STM32主机 ESP32C3 SPI esp32和stm32f1_c_16