ESP32 IDF SDK编程学习笔记

环境搭建

编译下载

  • idf.py build
  • idf.py -p (PORT) flash

在第一次烧写过后,你可能只想构建并烧写你的应用程序,不包括引导程序和分区表:

  • idf.py app 仅构建应用程序。
  • idf.py app-flash 仅烧写应用程序。
  • idf.py -p (PORT) flash monitor

打印输出

ESP_LOGX日志

日志库有两种管理日志详细程度的方法:编译阶段,通过菜单设置;运行阶段,使用esp_log_level_set()函数设置。

日志等级有:错误,警告,信息,调试和详细(详细度从最低到最高)

  • ESP_LOGE - 错误(最低)
  • ESP_LOGW - 警告
  • ESP_LOGI - 信息
  • ESP_LOGD - 调试
  • ESP_LOGV - 详细(最高)

考虑到线程安全,在FREERTOS中尽量使用ESP_LOGX来输出调试信息和打印消息

获取芯片信息

  • esp_chip_info_t chip_info;
  • esp_chip_info(&chip_info);

esp_chip_info_t有4个成员,分别是:

  • .model 芯片类型:ESP32

  • .features 芯片特性:嵌入式闪存/2.4G WiFi/低功耗蓝牙/经典蓝牙

  • .cores 核心数:单核/双核

  • .revision 版本号

Strapping 管脚

ESP32 共有5 个Strapping 管脚。Strapping 管脚与模组管脚对应关系如下,可参考章节5 电路原理图:

  • MTDI = IO12
  • GPIO0 = BOOT/IO0
  • GPIO2 = IO2
  • MTDO = IO15
  • GPIO5 = IO5

由于模组内置了3.3 V SPI flash,所以上电时不能将MTDI 置1。
在这里插入图片描述

外设功能

仅输入的管脚

GPIO34到39是GPIs–仅输入的管脚。这些引脚没有内部上拉或下拉电阻。它们不能用作输出,因此只能将这些管脚用作输入:

  • GPIO 34
  • GPIO 35
  • GPIO 36
  • GPIO 39

集成在ESP-WROOM-32上的SPI闪存

GPIO 6到GPIO 11在一些ESP32开发板中是公开的。但是,这些引脚连接到ESP-WROOM-32芯片上的集成SPI闪存,不建议用于其他用途。所以,不要在项目中使用这些管脚:

  • GPIO 6(SCK/CLK)
  • GPIO 7(SDO/SD0)
  • GPIO 8(SDI/SD1)
  • GPIO 9(SHD/SD2)
  • GPIO 10(SWP/SD3)
  • GPIO 11(CSC/CMD)

电容式触摸GPIO

ESP32有10个内部电容式触摸传感器。它们能感应到任何带电物质的变化,比如人类皮肤。因此,他们可以检测到当用手指触摸gpio时引起的变化。这些引脚可以很容易地集成到电容垫,并取代机械按钮。电容式触针也可以用来唤醒ESP32的深度睡眠。

这些内部触摸传感器连接到这些GPIO:

  • T0 (GPIO 4)
  • T1 (GPIO 0)
  • T2 (GPIO 2)
  • T3 (GPIO 15)
  • T4 (GPIO 13)
  • T5 (GPIO 12)
  • T6 (GPIO 14)
  • T7 (GPIO 27)
  • T8 (GPIO 33)
  • T9 (GPIO 32)

模数转换器(ADC)

ESP32有18 x 12位ADC输入通道(而ESP8266只有1 x 10位ADC)。这些是可用作ADC和相应通道的GPIO:

  • ADC1_CH0 (GPIO 36)
  • ADC1_CH1 (GPIO 37)
  • ADC1_CH2 (GPIO 38)
  • ADC1_CH3 (GPIO 39)
  • ADC1_CH4 (GPIO 32)
  • ADC1_CH5 (GPIO 33)
  • ADC1_CH6 (GPIO 34)
  • ADC1_CH7 (GPIO 35)
  • ADC2_CH0 (GPIO 4)
  • ADC2_CH1 (GPIO 0)
  • ADC2_CH2 (GPIO 2)
  • ADC2_CH3 (GPIO 15)
  • ADC2_CH4 (GPIO 13)
  • ADC2_CH5 (GPIO 12)
  • ADC2_CH6 (GPIO 14)
  • ADC2_CH7 (GPIO 27)
  • ADC2_CH8 (GPIO 25)
  • ADC2_CH9 (GPIO 26)

注意:使用Wi-Fi时不能使用ADC2管脚。因此,如果您使用Wi-Fi,并且无法从ADC2 GPIO获取值,则可以考虑改用ADC1 GPIO,这应该可以解决您的问题。

ADC输入通道具有12位分辨率。这意味着您可以获得0到4095之间的模拟读数,其中0对应于0V,4095对应于3.3V。您还可以在代码上设置通道的分辨率以及ADC范围。

数模转换器(DAC)

ESP32上有2 x 8位DAC通道,用于将数字信号转换为模拟电压信号输出。这些是DAC通道:

  • DAC1 (GPIO25)
  • DAC2 (GPIO26)

RTC GPIOs

ESP32支持RTC GPIO。当ESP32处于深度睡眠状态时,可以使用路由到RTC低功耗子系统的GPIO。这些RTC gpio可用于在超低功耗(ULP)协处理器运行时将ESP32从深度睡眠中唤醒。以下GPIO可以用作外部唤醒源。

  • RTC_GPIO0 (GPIO36)
  • RTC_GPIO3 (GPIO39)
  • RTC_GPIO4 (GPIO34)
  • RTC_GPIO5 (GPIO35)
  • RTC_GPIO6 (GPIO25)
  • RTC_GPIO7 (GPIO26)
  • RTC_GPIO8 (GPIO33)
  • RTC_GPIO9 (GPIO32)
  • RTC_GPIO10 (GPIO4)
  • RTC_GPIO11 (GPIO0)
  • RTC_GPIO12 (GPIO2)
  • RTC_GPIO13 (GPIO15)
  • RTC_GPIO14 (GPIO13)
  • RTC_GPIO15 (GPIO12)
  • RTC_GPIO16 (GPIO14)
  • RTC_GPIO17 (GPIO27)

脉冲宽度调制

ESP32 LED PWM控制器有16个独立通道,可以配置为生成具有不同特性的PWM信号。所有可以作为输出的管脚都可以用作PWM管脚(GPIOs 34到39不能产生PWM)。

要设置脉冲宽度调制信号,需要在代码中定义这些参数:

  • 信号频率;
  • 占空比;
  • 脉宽调制通道;
  • 要输出信号的GPIO。

I2C

ESP32有两个I2C通道,任何管脚都可以设置为SDA或SCL。将ESP32与Arduino IDE一起使用时,默认I2C引脚为:

  • GPIO 21(SDA)
  • GPIO 22(SCL)

如果要使用其他管脚,在使用导线库时,只需调用:

  • Wire.begin(SDA, SCL);

SPI

默认情况下,SPI的pin映射为:
在这里插入图片描述

中断

所有GPIO都可以配置为中断。

Strapping pins

ESP32芯片具有以下Strapping pins:

  • GPIO 0
  • GPIO 2
  • GPIO 4
  • GPIO 5(启动期间必须为高)
  • GPIO 12(启动期间必须低)
  • GPIO 15(启动期间必须为高)

Pins HIGH at Boot

一些GPIO在启动或重置时将其状态更改为高或输出PWM信号。这意味着,如果输出连接到这些gpio,则在ESP32重置或引导时可能会得到意外的结果。

  • GPIO 1
  • GPIO 3
  • GPIO 5
  • GPIO 6 to GPIO 11 (connected to the ESP32 integrated SPI flash memory – not recommended to use).
  • GPIO 14
  • GPIO 15

启用(EN)

高电平:芯片使能;
低电平:芯片关闭;
注意:不能让EN 管脚浮空。

GPIO电流消耗

根据ESP32数据表中的“推荐操作条件”部分,每个GPIO的绝对最大电流为40毫安。

ESP32内置霍尔效应传感器

ESP32还具有内置霍尔效应传感器,可检测周围磁场的变化。

获取MAC地址

uint8_t MAC[6];
esp_base_mac_addr_get(MAC);
ESP_LOGI("Base MAC Addr :  %02X.%02X.%02X.%02X.%02X.%02X",MAC[0],MAC[1],MAC[2],MAC[3],MAC[4],MAC[5]);

外设编程

ESP32 GPIO控制
ESP32 LEDC/PWM

API

  • esp_chip_info() 作用是获取芯片的信息
  • spi_flash_get_chip_size() 作用是获取 flash 的大小
  • esp_restart()对芯片进行软重启
  • esp_base_mac_addr_get(MAC); 获取MAC地址存到数组(uint8_t MAC[6])

注意事项

  • app_main 函数不能返回,否则会删除 main task 导致 crash。

  • GPIO6 至GPIO11 用于连接模组上集成的SPI flash,不再拉出至模组管脚。

  • 由于模组内置了3.3 V SPI flash,所以上电时不能将MTDI 置1。

  • 使用Wi-Fi时不能使用ADC2管脚。

  • 不能让EN 管脚浮空。

  • 建议不要在 app_main() 中添加一直阻塞的代码
    因为 app_main() 是在 uiT task 之中,uiT task 调用完 app_main() 后,会自动删除 task, 可为系统腾出约 3KB+ 内存

  • 建议应用代码尽量不要使用硬件定时器
    因为硬件定时器 callback 阻塞而导致 WiFi 底层接收包受影响

  • 用户创建的 task 优先级建议 1-9 之间
    task 优先级过低,可能会影响一点数据吞吐。task 优先级过高,可能会打破系统稳定性。建议用户深入了解后合理设置。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值