目录
前言
ESP32有个特点,它的IO管脚并不是统一供电的。它的供电来源非常多,本文就以我手中的一款微雪开发板ESP32-P4-Module-DEV-KITE为例,来统计一下这些引脚的供电来源。并完成LDO驱动。
一、IO管脚电源
编辑
1.1 VDD_LP / VDD_BAT
GPIO015的供电来源是VDD_LP,其中GPIO03还可以选择来源于VDD_BAT。CHIP_PU管脚电源来源于VDD_BAT。
VDD_LP电源由9序号管脚输入,是低功耗电源,输入电压在3.0~3.6V,典型值为3.3V,最大供电电流为100mA。一般直接接入给芯片供电的3.3V电源。当开发板进入深度睡眠状态,只能控制VDD_LP电源域的管脚。
VDD_BAT电源由102序号管脚输入,是模拟电源,输入电压在2.5~3.6V,典型值为3.3V,可接入电池,当主电源掉电继续给一些功能供电。不使用时直接接入给芯片供电的3.3V电源。
GPIO0~15除了作为普通引脚外还可作为低功耗引脚,CHIP_PU是芯片使能引脚,高电平使能芯片,低电平关闭芯片。
1.2 VDD_IO_0
GPIO16~23的供电来源是VDD_IO_0。
VDD_IO_0电源由21序号管脚输入,是数字电源0,输入电压为-0.3~3.6V,典型值为3.3V,最大供电电流为100mA。建议直接接入给芯片供电的3.3V电源。
GPIO16~23除了作为普通引脚外还具有ADC模拟功能
1.3 VDD_FLASHIO
序号为2729,3133的管脚的供电来源是VDD_FLASHIO。
VDD_FLASHIO电源由30序号管脚输入,是flash电源,输入电压为-0.3~3.6V,典型值为3.3V。该电源由内部电压稳压器输出的VDDO_FLASH提供。
71序号管脚作为内部电压稳压器输出引脚,输出VDDO_FLASH电压,也称VDDO_1,可输出1.8V或3.3V,最大输出50mA电流。默认输出3.3V,可以通过烧写EFUSE_0PXA_TIEH_SEL_0来输出1.8V。一般接入30序号管脚
序号为2729,3133的管脚是专用管脚,用来连接flash,所以VDD_FLASHIO的电压需要根据具体的flash芯片型号来定。
1.4 VDD_MIPI_DPHY
序号为3440,4248的管脚的供电来源是VDD_MIPI_DPHY。
VDD_MIPI_DPHY电源由41序号管脚输入,是MIPI电源,输入电压在2.25~2.75V,典型值为2.5V。最大输入电流为50mA,该电源推荐由内部电压稳压器提供。一般由VDDO_3提供
73序号管脚作为内部电压稳压器输出引脚,输出VDDO_3电压。可输出0.5~2.7V或3.3V,最大输出50mA电流。
序号为3440,4248的管脚是专用管脚,用来驱动MIPI接口,当不使用MIPI功能,VDD_MIPI_DPHY电源可悬空。
1.5 VDD_USBPHY
序号为49~50的管脚的供电来源是VDD_USBPHY。
VDD_USBPHY电源由51序号管脚输入,是USB电源,输入电压在2.97~3.63V,典型值为3.3V。最大输入电流为20mA,该电源推荐由内部电压稳压器提供。一般直接接入给芯片供电的3.3V电源。
序号为49~50的管脚为DM和DP,是USB专用管脚,用来驱动USB接口,当不使用DP和DM功能,VDD_USBPHY电源可悬空。
1.6 VDD_IO_4
GPIO24~38的供电来源是VDD_IO_4。
VDD_IO_4电源由62序号管脚输入,是数字电源4,输入电压为-0.3~3.6V,典型值为3.3V,最大供电电流为100mA。一般直接接入给芯片供电的3.3V电源。
GPIO2425除了作为普通引脚外还具有USB1P1_N0模拟功能,GPIO2838除了作为普通引脚外还具有SPI和GMAC模拟功能,其中GPIO37~38还具有UART0模拟功能。
1.7 VDD_IO_5
GPIO39~48的供电来源是VDD_IO_5。
VDD_IO_5电源由85序号管脚输入,是数字电源5,输入电压为-0.3~3.6V,典型值为3.3V,最大供电电流为100mA。可接入给芯片供电的3.3V电源,或接入VDDO_4。
74序号管脚作为内部电压稳压器输出引脚,输出VDDO_4电压。可输出0.5~2.7V或3.3V,最大输出50mA电流。
GPIO39~48除了作为普通引脚外还具有SD和GMAC模拟功能。
1.8 VDD_IO_6
GPIO49~54的供电来源是VDD_IO_6。
VDD_IO_6电源由96序号管脚输入,是数字电源6,输入电压为-0.3~3.6V,典型值为3.3V,最大供电电流为100mA。可接入给芯片供电的3.3V电源。
GPIO39~48除了作为普通引脚外还具有SD和GMAC模拟功能。
1.9 其他
还有一些引脚上面每涉及到。
1.9.1 VDD_PSRAM
59、67序号管脚为VDD_PSRAM管脚,用于内部的PSRAM供电,输入电压在1.65~1.95V,典型值为1.8V。一般由内部电压稳压器输出VDDO_PSRAM提供。
72序号管脚作为内部电压稳压器输出引脚,输出VDDO_PSRAM电压,也称VDDO_2。可输出1.9V电压,最大输出50mA电流。一般用于内部的PSRAM供电。
1.9.2 VDD_HP
这类电源共有4个,分别是VDD_HP_0(序号26)、VDD_HP_1(序号54)、VDD_HP_2(序号76)、VDD_HP_3(序号91)。是数字电源管脚,输入电压为0.99~1.3V,典型值为1.1V。一般由给芯片供电的3.3V电源经过DCDC降压后提供。
78序号管脚只能作为模拟管脚,用于接入外部DCDC的电压反馈管脚,用来调节VDD_HP电压
79序号管脚只能作为模拟管脚,用于接入外部DCDC的使能引脚。可由芯片控制
1.9.3 VDD_LDO
75序号管脚为VDD_LDO管脚,用于给内部电压稳压器供电,输入电压在3.0~3.6V,典型值为3.3V。一般直接接入给芯片供电的3.3V电源。
1.9.4 VDD_DCDCC / VDD_ANA
77序号管脚为VDD_DCDCC管脚,用于芯片内部HP LDO供电;101序号管脚为VDD_ANA管脚,用于芯片内部LP LDO供电。输入电压都在3.0~3.6V,典型值都为3.3V。一般直接接入给芯片供电的3.3V电源。
HP LDO和LP LDO是内部两个电压稳压器,均输出1.1V。用于芯片高性能状态和低功耗状态供电。
1.10 电源管理图
编辑
二、LDO使用
电源管理图左侧有4个LDO,其中有两个输出VDDO_3和VDDO_4,他们的电压大小是可编程调节的。上电时,我的开发板VDDO_4默认输出1.23V,我们来调节VDDO_4电压,使输出3.3V。VDDO_4供电管脚为GPIO39~48,这部分管脚没有接到敏感芯片,故可以调节。
#include "esp_ldo_regulator.h" // ESP32电源管理函数
/*--------------------------------------------------------------------------*/
/**
* @brief SET LDOV4 value
* @param[in] give need LDO4 set value
* @note
* @return void
*/
/*--------------------------------------------------------------------------*/
void ESP_LDOV4_SET(int mv)
{
esp_ldo_channel_handle_t channel_handle = NULL;
esp_ldo_channel_config_t channel_config = {
.chan_id = 4, // 设置的LDO通道为VDDO_4
.voltage_mv = mv, // 设置的电压,单位mv
.flags.adjustable = 1, // 设置为可调整
.flags.owned_by_hw = 1, // 设置为硬件控制可覆盖
.flags.bypass = 0, // 设置为不绕过调节器
};
ESP_ERROR_CHECK(esp_ldo_acquire_channel(&channel_config, &channel_handle));
esp_ldo_dump(stdout); // 打印LDO通道状态
//esp_ldo_release_channel(channel_handle); // 释放LDO通道,一旦释放电压将恢复默认值
}
#include <stdio.h>
#include "user.h"
void app_main(void)
{
CONSOLE_REPL_INIT(); // 初始化控制台REPL环境
ESP_LDOV4_SET(3300);
while(1)
{
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
写好代码后,只需要在mian函数里调用即可,注意不能释放LDO通道,否则电压值会恢复到默认值。注意可调节的电压范围为0.5~2.7V和3.3V。
esp_err_t esp_ldo_dump(FILE *stream)
{
char line[100];
fprintf(stream, "ESP LDO Channel State:\n");
fprintf(stream, "%-5s %-5s %-10s %-12s %-5s\n", "Index", "ID", "ref_cnt", "voltage_mv", "adjustable");
for (int i = 0; i < LDO_LL_NUM_UNITS; i++) {
char *buf = line;
size_t len = sizeof(line);
memset(line, 0x0, len);
snprintf(buf, len, "%-5d %-5d %-10d %-12d %-5s\n",
i,
s_ldo_channels[i].chan_id,
s_ldo_channels[i].ref_cnt,
s_ldo_channels[i].voltage_mv,
s_ldo_channels[i].flags.adjustable ? "yes" : "no");
vTaskDelay(pdMS_TO_TICKS(100));
fputs(line, stream);
}
return ESP_OK;
}
另外原本的esp_ldo_dump函数打印参数没有延时,会导致打印的参数排版错乱。所以我这给每条数据输出延时100ms。
三、结果展示
编辑
此时日志打印的LDO4通道也就是VDDO_4电压为3300mv,实际测量电压为3358mv,这是正常的,由于硬件限制,LDO 通道电压的精度可能会50mV左右的偏差。
另外voltage_mv为0代表的是默认值,VDDO_4默认输出1.23V,其他通道应该也差不多。不够我的ESP32P4芯片有金属壳封装,无法去测量验证。
总结
这部分内容虽然不难,但是很重要,因为很有可能有同学因为其他开发板的使用经验默认一个芯片的所有引脚电平是统一的。从而导致不同电平的引脚一同使用造成错误。我自己就碰见了这个问题,极难排查,还是机缘巧合下发现了这种情况。一个优秀的嵌入式开发者,经验和理论缺一不可。