旅游公司网站模板,做企业网站有哪些好处,网站建设服务费的税率,查询域名备案信息本博文内容导读#x1f4d5;#x1f389;#x1f525; ESP32系统的基础外设开发#xff1a;IO_MUX和GPIO矩阵 IO_MUX和GPIO矩阵
ESP32的I/O组成了与外部世界交互的基础#xff0c;ESP32芯片有34个物理GPIO引脚。每个引脚都可用作一个通用I/O#xff0c;或者连接一个内部… 本博文内容导读 ESP32系统的基础外设开发IO_MUX和GPIO矩阵 IO_MUX和GPIO矩阵
ESP32的I/O组成了与外部世界交互的基础ESP32芯片有34个物理GPIO引脚。每个引脚都可用作一个通用I/O或者连接一个内部的外设信号。
数字引脚控制信号FUN_SEL、IE、OE、WPU、WDU等、162个外设输入和176个外设输出信号控制信号SIG_IN_SEL、SIG_OUT_SEL、IE、OE等、快速外设输入/输出信号控制信号IE、OE等以及RTC IO_MUX之间的信号选择和连接关系构成了ESP32的I/O复用和GPIO交换矩阵。
IO_MUX、RTC、IO_MUX和GPIO交换矩阵用于将信号从外设传输至GPIO引脚这些模块共同组成了芯片的I/O控制。ESP32芯片的34个物理GPIO引脚编号为0~19、21~23、25~27、32~39。其中GPIO 34~39仅用作输入引脚其他的既可以作为输入又可作为输出引脚。 1. IO_MUX中每个GPIO引脚有一组寄存器 可以配置成GPIO功能连接GPIO交换矩阵。 也可以直连功能旁路了GPIO交换矩阵快速信号如以太网、SDIO、SPI、JTAG、UART等会旁路GPIO交换矩阵以实现更好的高频数字特性所以高速信号会直接通过IO_MUX输入/输出。 2. GPIO交换矩阵是外设输入/输出信号和引脚之间的全交换矩阵 芯片输入方向162个外设输入信号都可以选择任意一个GPIO引脚的输入信号。 芯片输出方向每个GPIO引脚输出信号可为176个外设输出信号中的任意一个。 3. RTC IO_MUX用于控制GPIO引脚的低功耗和模拟功能 只有部分GPIO引脚具有这些功能包括引脚0、2、4、12~15、25~27、32~39。 因此输入和输出的方式有如下几种通过GPIO交换矩阵的外设输入/输出、IO_MUX的直接I/O功能、RTC IO_MUX的I/O功能。 通过GPIO矩阵的外设输入
为实现通过GPIO交换矩阵接收外设输入信号需要配置GPIO交换矩阵从34个GPIO0~19、21~23、25~27、32~39中获取外设输入信号的索引号0~18、23~36、39~58、61~90、95~124、140~155、164~181、190~195、198~206。输入信号通过IO_MUX从GPIO引脚中读取。IO_MUX必须设置相应引脚为GPIO功能这样GPIO引脚的输入信号就可进入GPIO交换矩阵然后通过GPIO交换矩阵进入选择的外设输入。 把某个外设信号Y绑定到某个GPIO引脚X的配置过程为 1在GPIO交换矩阵中配置外设信号Y的GPIO_FUNCy_IN_SEL_CFG寄存器设置GPIO_FUNCy_IN_SEL字段为要读取的GPIO引脚X的值清空GPIO引脚的其他字段。 2在GPIO交换矩阵中配置GPIO引脚X的GPIO_FUNCx_OUT_SEL_CFG寄存器、清空GPIO_ENABLE_DATA[x]字段。要强制引脚的输出状态始终由GPIO_ENABLE_DATA[x]字段决定则将GPIO_FUNCx_OUT_SEL_CFG寄存器的GPIO_FUNCx_OEN_SEL字段位置为1。GPIO_ENABLE_DATA[x]字段在GPIO_ENABLE_REG(GPIOs 0~31)或GPIO_ENABLE1_REG(GPIOs 32-39)中清空此位可以关闭GPIO引脚的输出。 3配置IO_MUX寄存器来选择GPIO交换矩阵。配置GPIO引脚X的IO_MUX_x_REG。设置功能字段(MCU_SEL)为GPIO X的IO_MUX功能引脚功能3数值为2。置位FUN_IE使能输入。置位或清空FUN_WPU和FUN_WPD位使能或关闭内部上拉/下拉电阻器。 4GPIO输入情况GPIO_IN_REG/GPIO_IN1_REG寄存器存储着每一个GPIO引脚的输入值。任意GPIO引脚的输入值都可以随时读取而无须为某一个外设信号配置GPIO交换矩阵。但是需要为引脚X的IO_MUX_x_REG寄存器配置FUN_IE位以使能输入。 通过GPIO矩阵的外设输出
为实现通过GPIO交换矩阵输出外设信号需要配置GPIO交换矩阵将输出索引号为0~18、23~37、61~121、140~215、224~228的外设信号输出到28个GPIO (0~19、21~23、25~27、32~33)。输出信号从外设输出到GPIO交换矩阵然后到达IO_MUX。IO_MUX必须设置相应引脚为GPIO功能这样输出GPIO信号就能连接到相应引脚如图所示。
其中输出索引号为224~228的外设信号可配置从一个GPIO引脚输入后直接由另一个GPIO引脚输出。176个输出信号中的某一个信号通过GPIO交换矩阵到达IO_MUX然后连接到某个引脚。 输出外设信号Y到某一GPIO引脚X的步骤如下 1在GPIO交换矩阵里配置GPIO引脚X的GPIO_FUNCx_OUT_SEL_CFG寄存器和GPIO_ENABLE_DATA[x]字段。设置GPIO_FUNCx_OUT_SEL_CFG寄存器的GPIO_FUNCx_OUT_SEL字段为外设输出信号Y的索引号(Y)。要将信号强制使能为输出模式把GPIO引脚X的GPIO_FUNCx_OUT_SEL_CFG寄存器的GPIO_FUNCx_OEN_SEL置位并且在GPIO_ENABLE_REG寄存器的GPIO_ENABLE_DATA[x]字段置位。或者对GPIO_FUNCx_OEN_SEL清零此时输出使能信号由内部逻辑功能决定。GPIO_ENABLE_DATA[x]字段在GPIO_ENABLE_REG(GPIOs0~31)或GPIO_ENABLE1_REG (GPIOs 32~39)中清空此位可以关闭GPIO引脚的输出。 2选择以开漏方式输出可以设置GPIO引脚X的GPIO_PINx寄存器中的GPIO_PINx_PAD_DRIVER位。 3配置IO_MUX寄存器选择GPIO的交换矩阵。配置GPIO引脚X的IO_MUX_x_REG。设置功能字段(MCU_SEL)为GPIO X的IO_MUX功能引脚功能3数值为2。设置FUN_DRV字段为特定的输出强度值(0~3)值越大输出驱动能力越强。在开漏模式下通过置位/清零FUN_WPU和FUN_WPD使能或关闭上拉/下拉电阻器。 GPIO交换矩阵也可以用于简单GPIO输出设置GPIO_OUT_DATA寄存器中某一位的值可以写入对应的GPIO引脚。为实现某一引脚的GPIO输出设置GPIO交换矩阵GPIO_FUNCx_OUT_SEL寄存器为特定的外设索引值2560x100。 IO_MUX的直接I/O功能
对于ESP32系统与外设交互的快速信号例如以太网、SDIO、SPI、JTAG、UART等会旁路GPIO交换矩阵以实现更好的高频数字特性也就是说高速信号会直接通过IO_MUX输入/输出。
这种模式比使用GPIO交换矩阵的灵活度要低即每个GPIO引脚的IO_MUX寄存器只有较少的功能选择但可以实现更好的高频数字特性。为实现外设I/O旁路GPIO交换矩阵必须配置两个寄存器 1GPIO引脚的IO_MUX必须设置为相应的引脚功能请扫描二维码获取不同引脚能够实现的功能不同可以实现多达6个功能。 2对于输入信号必须清零SIG_IN_SEL寄存器直接将输入信号输出到外设。 复位配置如下复位一栏是每个引脚复位后的默认配置。 •0-IE0输入关闭。•1-IE1输入使能。•2-IE1,WPD1输入使能下拉电阻。•3-IE1,WPU1输入使能上拉电阻。•R-引脚通过RTC_MUX具有RTC/模拟功能。•I-引脚只能配置为输入GPIO。
RTC IO_MUX的I/O功能 18个GPIO引脚具有低功耗低功耗RTC性能和模拟功能由ESP32的RTC子系统控制。这些功能不使用IO_MUX和GPIO交换矩阵而是使用RTC_MUX将I/O指向RTC子系统。当这些引脚被配置为RTC GPIO引脚作为输出引脚时仍然能够在芯片处于深度睡眠模式下保持输出电平值或者作为输入引脚使用时可以将芯片从深度睡眠中唤醒。 每个引脚的模拟和RTC功能是由RTC_GPIO_PINx寄存器中的RTC_IO_TOUCH_PADx_TO_GPIO 位控制的。此位默认置为1通过IO_MUX子系统输入输出信号。 如果清零RTC_IO_TOUCH_PADx_TO_GPIO位则输入/输出信号会经过RTC子系统。这种模式下RTC_GPIO_PINx寄存器用于数字I/O引脚模拟功能也可以实现。 GPIO引脚与相应的RTC引脚及模拟功能的映射关系。 请注意RTC_IO_PINx寄存器使用的是RTC GPIO引脚的序号不是GPIO引脚的序号。 GPIO类型定义 ESP32开发环境定义了自身的常量、变量和函数这些构成了ESP32编程开发的基础下面简单介绍一下ESP32的GPIO编程基础知识。在esp_err.h、gpio_types.h和gpio.h头文件中定义了基于C语言的一些预定义。
1.esp_err_t类型定义
定义了esp_err_t类型也就是int32类型在ESP32开发环境中的名称很多函数和方法的返回值都是这个类型定义如下
typedef int32_t esp_err_t;
主要定义的错误常量类型如下
#define ESP_OK 0 /*成功*/
#define ESP_FAIL -1 /*失败*/
#define ESP_ERR_NO_MEM 0x101 /*内存溢出*/
#define ESP_ERR_INVALID_ARG 0x102 /*无效参数*/
#define ESP_ERR_INVALID_STATE 0x103 /*无效状态*/
#define ESP_ERR_INVALID_SIZE 0x104 /*无效大小*/
#define ESP_ERR_NOT_FOUND 0x105 /*未发现请求资源*/
#define ESP_ERR_NOT_SUPPORTED 0x106 /*不支持操作或功能*/
#define ESP_ERR_TIMEOUT 0x107 /*操作超时*/
#define ESP_ERR_INVALID_RESPONSE 0x108 /*收到的回应无效 */
#define ESP_ERR_INVALID_CRC 0x109 /*! CRC或校验和无效*/
#define ESP_ERR_INVALID_VERSION 0x10A /*无效的版本*/
#define ESP_ERR_INVALID_MAC 0x10B /*无效的MAC地址*/
#define ESP_ERR_WIFI_BASE 0x3000 /*WiFi错误代码的起始编号*/
#define ESP_ERR_MESH_BASE 0x4000 /*MESH错误代码的起始编号*/
#define ESP_ERR_FLASH_BASE 0x6000 /*闪存错误代码的起始编号*/
2.gpio_num_t类型
gpio_num_t是ESP32引脚的定义是枚举类型。
3.gpio_int_type_t中断类型
gpio_int_type_t是ESP32中断类型的定义是枚举类型。
4.gpio_mode_t类型
gpio_mode_t类型定义了ESP32的GPIO模式是枚举类型。
5.gpio_pullup_t类型
gpio_pullup_t类型定义了ESP32的GPIO的上拉类型是枚举类型。
6.gpio_pulldown_t类型
gpio_pulldown_t类型定义了ESP32的GPIO的下拉类型是枚举类型。
7.gpio_config_t结构体定义
gpio_config_t函数简要配置GPIO引脚的参数定义
8.gpio_pull_mode_t类型
gpio_pull_mode_t定义输入/输出接口Pad的拉取模式类型是枚举类型
9.gpio_drive_cap_t
gpio_drive_cap_t为GPIO的接口驱动能力的定义是枚举类型 GPIO示例程序
本部分包括基于ESP IDF的VS Code、Arduino和MicroPython环境的三种代码实现。采用经典的LED每隔1s闪烁实验实验硬件连接方式在ESP32开发板的GPIO18上连接LED正极再连接1KΩ电阻开发板的GND引脚连接LED负极如图4-4所示。
电阻的选择以不超过LED的驱动电压为准一般情况下白色LED3.0~3.3V红色LED1.8~2.2V蓝色LED3.0~3.2V绿色LED2.9~3.1V黄色LED1.8~2.0V。