多路复用器与GPIO矩阵
ESP32芯片有34个物理 GPIO Pad,每个Pad可以当作通用IO,也可以当作外设的引脚,GPIO 引脚通过非常复杂的 GPIO 矩阵互连,这基本上就是是一个多路复用器,我们可以非常灵活的选择哪些GPIO引脚在内部路由到哪个外设的信号,大家可以看下图:
IO_MUX 中每个 GPIO pad 有一组寄存器。每个 pad 可以配置成 GPIO 功能(连接 GPIO 交换矩阵)或者 直连功能。
有一些高速信号如以太网、SDIO、SPI、JTAG、UART 等会旁路 GPIO 交换矩阵以实现更好的高频数字特性。所以高速信号会直接通过 IO_MUX 输入和输出,这样比使用 GPIO 交换矩阵的灵活度要低。
不同于STM32的简单复用,ESP32的多路复用器,使设计人员可以灵活地更改芯片内部的 GPIO 引脚连接并将其路由到任何信号,这样硬件设计上,布线也方便的多。
.png)
通过 IO_MUX、GPIO 交换矩阵的外设输入
通过 GPIO 交换矩阵输出信号
ESP32还有18个 GPIO 管脚具有低功耗(低功耗 RTC)和模拟功能,这个我们后面设计到具体案例再细说。
完整管脚说明需要去参考的乐鑫官方《ESP32 技术规格书》
特别提醒
ESP32的IO12上电时的电平会决定外部flash的工作电压,上电时该脚为高则认为flash工作于1.8V,为低则认为flash工作于3.3V。常用的模块该脚内部已下拉,即flash是工作于3.3V的,若外部使用强上拉模块就可能工作异常了。
硬件连接
代码示例
#define LED_GPIO 4
#define BTN_GPIO 2
int BTN_State = 0; //按键状态
void setup()
{
pinMode(LED_GPIO, OUTPUT);
pinMode(BTN_GPIO, INPUT);
}
void loop()
{
// 读取按键状态
BTN_State = digitalRead(BTN_GPIO);
// 把按键状态做为LED灯的输出
digitalWrite(LED_GPIO, BTN_State);
}
接下来我们用中断的方式实现一下:
attachInterrupt(uint8_t pin, void ()(void), int mode)函数用来配置中断功能:
- 参数一,GPIO引脚号
- 参数二,中断回调函数
- 参数三,中断触发模式(RISING、FALLING、CHANGE等)
参数三这个可以设置各种模式,例如上升沿触发,下降沿出发,任意沿触发,电平信号等等模式。
我们用上面的例子改一下:
#define LED_GPIO 4
#define BTN_GPIO 2
int BTN_State = 0; //按键状态
//中断回调函数
void bt_callBack(void)
{
BTN_State = digitalRead(BTN_GPIO); // 读取按键状态
digitalWrite(LED_GPIO, BTN_State); // 把按键状态做为LED灯的输出
}
void setup()
{
pinMode(LED_GPIO, OUTPUT); //LED输出模式
pinMode(BTN_GPIO, INPUT); //输入上拉模式
attachInterrupt(BTN_GPIO, bt_callBack, CHANGE); //使能中断
}
void loop()
{
}