1、如何在VSCode和ESP-IDF的环境下创建工程

说实话,这是我用ESP-IDF在VSCode环境下最不喜欢的事情,在一顿CSDN和百度之后,很多大佬博主都推荐使用VSCode,通过官方示例来进行工程创建,好处是所需要的头文件都已经准备好了,同时很有可能会以及写好你所需要的外设的驱动头文件,看似非常省力。
但是!坑又非常非常的多!当我在example示例文件夹中看到了关于矩阵键盘的示例,我满心欢喜的打开,想着不是从零敲矩阵键盘扫描了,结果在一次次编译失败中我逐渐抓狂,一个.c文件可以高达9个报错,而且还完全没法修复。后来在拜读大佬博主——夏虫不可与之言冰的文章后,询问到为何矩阵键盘的示例工程无法编译通过,大佬的回答为:“底层上好像依赖S2的硬件,如果你是esp32是编译不了的”。所以,如果我以该官方示例作为创建工程的参考,那有可能会一直出现问题,毕竟报错的不是main函数,而是功能.c文件。
在这要非常感谢夏虫不可与之言冰,各位也可以看看他的文章,对于ESP32的初学者的我来讲,受益匪浅。从0学起的esp-idf之旅——外设篇gpio
坑多归坑多,但对于一些简单的执行器外设,像LED、蜂鸣器、数码管什么的,从官方例程进行创建项目还是很便捷的,步骤可以大大省略。

1.1 使用VSCode命令行创建新工程

  1. Ctrl + Shift + P唤出命令行,并输入New Project
  2. 点击ESP-IDF:新建项目后会让你输入工程名(不要有中文)、工程路径(不要有中文)、开发板型号以及对应的COM口
  3. 输入完毕后点击右下角“Choose Template”,会进入选择官方例程界面,记住选择“ESP-IDF”
  4. 挑选你要依赖的官方例程
  5. 创建新工程并打开新工程界面
    点击红色框内的按钮后,右下角会有弹出提示是否要在新窗口打开工程,点击“yes”即可
  6. 更改.c文件名,同时删除一些对你没用的文件
    以blink例程为例,在完成上述创建后,进入main文件夹中直接将blink.c改成你想要的文件名,同时别忘了,在工程目录中的Makefile文件中的PROJECT_NAME := 后面的字符串该为修改后的文件名。
    接下来就是删除对我们没什么作用的内容,下图中框起来的,想删就删,不删也不影响。
  7. 修改.c文件,编写自己所要的代码

1.2 使用ESP-IDF CMD创建工程

如果说用VSCode以官方例程为依赖创建新工程是为了便利,那通过ESP-IDF CMD创建工程就是为了简洁。
在ESP32学习笔记( VSCode + ESP-IDF环境) 1 中我们可以通过ESP-IDF 的CMD命令框,通过idf.py命令进行工程编译和烧录,那我们同样用idf.py可以创建新工程。
步骤如下:

  1. 创建新工程文件夹(不要有中文)
  2. 打开ESP-IDF CMD窗口 cd到刚刚创建的工程文件目录
  3. 键入命令:idf.py create-project 工程名(不要是中文)
  4. 在VSCode中打开刚刚的工程文件夹就会看到如下的文件
  5. 继续回到CMD命令窗口,先cd到工程文件夹内,再通过命令:idf.py set-target esp32设置目标开发板为esp32,再看VSCode就会发现多出来几个文件,在设置目标开发板后会进行编译,同时会将对应SDKConfig加入。

  6. 在.c文件中开始进行编码,引入需要的头文件即可

使用ESP-IDF CMD命令进行工程创建,工程会变得非常简洁,但这需要你对ESP32所用的头文件非常熟悉,不然有限功能函数你无法调用,或者你无法得知哪个头文件是你所需要的。
综合考虑下来,如果是小白,对头文件还不熟悉,你可以使用例程为依托创建新工程,如果是大佬,那您随意!!!

2、ESP-IDF环境下的简单外设驱动

之前在Arduino IDE的环境中我写了很多单独模块的测试函数,既然现在开始使用VSCode以及ESP-IDF进行ESP32的开发了,那单独的模块测试也少不了,但由于使用ESP-IDF进行开发较为复杂,导致很多模块的开发还未完成,我会在后面慢慢的补上。
因为电路原理图和所用的单片机与嵌入式系统竞赛实训平台在之前的Arduino环境中都已经介绍过了,这里就不多浪费篇幅,直接上代码、接线说明和效果

2.1 一灯大师——点亮LED

只要是使用IO口输出,第一件事就是点亮LED灯
接线:GPIO19 -------- LED_IO

实验效果:LED间隔1S亮灭

代码:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"#define BLINK_GPIO 19void app_main(void)
{gpio_reset_pin(BLINK_GPIO);gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);while(1) {printf("Turning off the LED\n");gpio_set_level(BLINK_GPIO, 0);vTaskDelay(1000 / portTICK_PERIOD_MS);printf("Turning on the LED\n");gpio_set_level(BLINK_GPIO, 1);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}

2.2 蜂鸣器

接线:
GPIO 5 -------- LED_IO
GPIO 17 -------- BEEP_IO

实验效果:LED间隔1S亮灭,同时蜂鸣器间隔1S鸣叫和停止

代码:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"#define BLINK_GPIO 5
#define BEEP_GPIO 17void app_main(void)
{gpio_reset_pin(BLINK_GPIO);gpio_reset_pin(BEEP_GPIO);gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);gpio_set_direction(BEEP_GPIO, GPIO_MODE_OUTPUT);while(1) {printf("关闭\n");gpio_set_level(BLINK_GPIO, 0);gpio_set_level(BEEP_GPIO, 0);vTaskDelay(1000 / portTICK_PERIOD_MS);printf("打开\n");gpio_set_level(BLINK_GPIO, 1);gpio_set_level(BEEP_GPIO, 1);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}

2.3 数码管显示

接线:
GPIO 21 -------- SMG_245_A
GPIO 19 -------- SMG_245_B
GPIO 18 -------- SMG_245_C
GPIO 05 -------- SMG_245_D
GPIO 17 -------- SMG_245_E
GPIO 16 -------- SMG_245_F
GPIO 04 -------- SMG_245_G
GPIO 02 -------- SMG_245_DP
GPIO 27 -------- SMG_138_A
GPIO 14 -------- SMG_138_B
GPIO 12 -------- SMG_138_C

实验效果:8个数码管依次显示0~7

代码:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"#define LSA_GPIO 27
#define LSB_GPIO 14
#define LSC_GPIO 12const int shumaguanPins[8] = {21, 19, 18, 5, 17, 16, 4, 2};//显示1-10 高电平有效
unsigned char smgduan[10][8] =
{{1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 0, 0, 0, 0, 0},   //0 1{1, 1, 0, 1, 1, 0, 1, 0}, {1, 1, 1, 1, 0, 0, 1, 0},   //2 3{0, 1, 1, 0, 0, 1, 1, 0}, {1, 0, 1, 1, 0, 1, 1, 0},   //4 5{1, 0, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 0, 0, 0, 0, 0},   //6 7{1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 0, 1, 1, 1}    //8 9
};void app_main(void)
{gpio_reset_pin(LSA_GPIO);gpio_reset_pin(LSB_GPIO);gpio_reset_pin(LSC_GPIO);for(int i = 0; i < 8; i++){gpio_reset_pin(shumaguanPins[i]);}gpio_set_direction(LSA_GPIO, GPIO_MODE_OUTPUT);gpio_set_direction(LSB_GPIO, GPIO_MODE_OUTPUT);gpio_set_direction(LSC_GPIO, GPIO_MODE_OUTPUT);for(int i = 0; i < 8; i++){gpio_set_direction(shumaguanPins[i], GPIO_MODE_OUTPUT);}while(1) {unsigned char i, j;for (i = 0; i < 8; i++){switch (i){case(0):gpio_set_level(LSA_GPIO, 0);gpio_set_level(LSB_GPIO, 0);gpio_set_level(LSC_GPIO, 0);break;case(1):gpio_set_level(LSA_GPIO, 1);gpio_set_level(LSB_GPIO, 0);gpio_set_level(LSC_GPIO, 0);break;case(2):gpio_set_level(LSA_GPIO, 0);gpio_set_level(LSB_GPIO, 1);gpio_set_level(LSC_GPIO, 0);break;case(3):gpio_set_level(LSA_GPIO, 1);gpio_set_level(LSB_GPIO, 1);gpio_set_level(LSC_GPIO, 0);break;case(4):gpio_set_level(LSA_GPIO, 0);gpio_set_level(LSB_GPIO, 0);gpio_set_level(LSC_GPIO, 1);break;case(5):gpio_set_level(LSA_GPIO, 1);gpio_set_level(LSB_GPIO, 0);gpio_set_level(LSC_GPIO, 1);break;case(6):gpio_set_level(LSA_GPIO, 0);gpio_set_level(LSB_GPIO, 1);gpio_set_level(LSC_GPIO, 1);break;case(7):gpio_set_level(LSA_GPIO, 1);gpio_set_level(LSB_GPIO, 1);gpio_set_level(LSC_GPIO, 1);break;default:break;}for(j = 0; j < 8 ; j++){gpio_set_level(shumaguanPins[j], smgduan[i][j]);}vTaskDelay(1000 / portTICK_PERIOD_MS);for(j = 0; j< 8; j++) //消隐{gpio_set_level(shumaguanPins[j], 0);}}}
}

2.4 红外对射+继电器

接线:
GPIO 04 -------- RL_IO
GPIO 16 -------- IRF_IO

实验效果:
手遮住红外对射,继电器吸合,手放开,继电器断开

红外继电器演示

代码:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"#define RELAY_GPIO 4
#define IRF_GPIO 16void app_main(void)
{gpio_reset_pin(RELAY_GPIO);gpio_reset_pin(IRF_GPIO);gpio_set_direction(RELAY_GPIO, GPIO_MODE_OUTPUT);gpio_set_direction(IRF_GPIO, GPIO_MODE_INPUT);while(1) {if (gpio_get_level(IRF_GPIO) == 1){gpio_set_level(RELAY_GPIO, 0);  //低电平继电器断开}else{gpio_set_level(RELAY_GPIO, 1);}vTaskDelay(200 / portTICK_PERIOD_MS);}
}

持续更新中…

ESP32学习笔记( VSCode + ESP-IDF环境) 3 ——GPIO相关的简单外设驱动相关推荐

  1. 《ESP32 学习笔记》 之Arduino环境下 使用DAC模拟输出(是真的DAC哦!)完成两路呼吸灯

    在 Arduino 环境下经常使用的 analogWrite(PIN, arg) 语法并不是真正的DAC模拟输出,也只是1kHZ的PWM 波模拟而成! 支持DAC功能的引脚请查看:引脚定义 本次ESP ...

  2. ESP32学习笔记(1)——搭建环境、编译烧写(Windows+VS Code)

    Espressif-IDE 环境搭建参看 ESP32学习笔记(50)--搭建环境.编译烧写(Windows+Espressif-IDE) 一.搭建环境 1.1 官方资料 ESP-IDF 编程指南 1. ...

  3. ESP32学习笔记(51)——搭建环境、编译烧写(Windows+Espressif-IDE)

    VS Code 环境搭建参看 ESP32学习笔记(1)--搭建环境.编译烧写(Windows+VS Code) 一.搭建环境 1.1 官方资料 ESP-IDF 编程指南 1.2 下载Espressif ...

  4. [ESP32]学习笔记01

    [ESP32]学习笔记01 学习笔记01 本开发工具使用ESP-IDF 工具链,非Arduino,关于ESP32-IDF工具链的安装方法可直接查看乐鑫官官方文档,CSDN上也有很多相关搭建开发环境的文 ...

  5. ESP32学习笔记(七) 复位和时钟

    ESP32学习笔记(七) 复位和时钟 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介绍 ...

  6. ESP32学习笔记(一) 芯片型号介绍

    ESP32学习笔记(一) 芯片型号介绍 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介 ...

  7. 关于esp32蓝牙模块的使用——esp32学习笔记

    关于esp32蓝牙模块的使用--esp32学习笔记 关于esp32蓝牙模块的使用--esp32学习笔记 关于esp32蓝牙模块的使用--esp32学习笔记 零.前言 一.经典蓝牙BT 二.低功耗蓝牙B ...

  8. ESP32学习笔记(19)——SPI(主机)接口使用

    一.SPI简介 SPI(Serial Peripheral Interface) 协议是由摩托罗拉公司提出的通讯协议,即串行外围设备接口,是一种高速全双工的通信总线.它被广泛地使用在 ADC.LCD ...

  9. ESP32学习笔记(14)——HTTP服务器

    一.HTTP简介 HTTP(Hyper Text Transfer Protocol) 超文本传输协议,是一种建立在 TCP 上的无状态连接,整个基本的工作流程是客户端发送一个 HTTP 请求,说明客 ...

最新文章

  1. 6位图灵奖得主,10多位院士,19个分论坛:北京智源大会邀你共同探索AI下一个十年...
  2. php关闭warning
  3. C语言实现-双链表练习
  4. tfw文件如何导入cad_教你三维家3d设计软件如何导入cad文件
  5. java游戏暂停_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...
  6. 【华为云技术分享】测试微课堂 | 有的放矢制定测试计划
  7. jsp中实现文件下载   两种方法
  8. 团队项目需求分析——NABCD
  9. Abaqus怎么切换中英文界面
  10. 基于Web的仓库管理系统的设计与实现
  11. 8uftp链接linux,8UFTP工具,FTP工具连接的办法,配置方式
  12. Iometer存储测试工具参数说明- 2 Access Specifications
  13. 360安全浏览器安装插件源文件存放位置
  14. C语言中lwr是谁的缩写,C语言中关于字符串的操作(转)
  15. ITEXT处理pdf详解
  16. python调用百度AI接口实现人像分割
  17. 永恒python奇美拉_利用USearch去除嵌合体(chimeras)
  18. C语言之文件打开模式
  19. UML-----包图
  20. 信号完整性分析---串扰和反射

热门文章

  1. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
  2. Lucene sort 排序
  3. zip4j的正确使用方式
  4. mysql ora01031_本地以sysdba 身份登录数据库实例时,报错ORA-01031 权限不足
  5. 学习方法 whiteboard
  6. Java SE 基础一
  7. KUKA机器人备份与还原的具体方法演示
  8. 上汽大通:有了C2B的【我行@MAXUS】平台,我就是您个人的造车工厂
  9. Intermediate-SQL
  10. 【软件分析/静态分析】学习笔记02——中间表示Intermediate Representation