ESP32入门 - 学习笔记 外设——基础GPIO
ESP32系列芯片由Espressif Systems推出,旨在满足不同应用场景的需求。
·
ESP32系列芯片由Espressif Systems推出,旨在满足不同应用场景的需求。以下是关于S系列、C系列、H系列、P系列以及D型号的概述及其异同点:
ESP32-D系列
- 核心架构:双核Xtensa LX6处理器,主频可达240MHz 。
- 通信能力:支持Wi-Fi和蓝牙(包括经典蓝牙和BLE)。
- 适用场景:适用于需要Wi-Fi和蓝牙功能的通用型物联网设备。
ESP32-S系列
- 核心架构:
- S2:单核Xtensa LX7处理器,主频高达240 MHz 。
- S3:双核Xtensa LX7处理器,主频同样高达240 MHz,且增加了AI加速指令集 。
- 通信能力:集成Wi-Fi和蓝牙5.0(仅S3支持Bluetooth LE远距离模式)。
- 适用场景:S2适合低功耗Wi-Fi设备,而S3则更适合需要高性能边缘计算的应用,如语音识别和图像处理 。
ESP32-C系列
- 核心架构:基于RISC-V架构,提供从单核到双核的不同配置,主频范围从120 MHz到160 MHz不等 。
- 通信能力:支持Wi-Fi 6(部分型号)、蓝牙5.0,并有部分型号支持Zigbee和Thread协议。
- 适用场景:C系列特别适合那些对功耗敏感且需要最新无线技术的应用,例如智能家居设备。
ESP32-H系列
- 核心架构:单核RISC-V处理器,工作频率为96 MHz 。
- 通信能力:主要支持蓝牙5.0。
- 适用场景:针对成本敏感型应用,尤其是那些只需要蓝牙连接的场合。
ESP32-P系列
- 核心架构:双核RISC-V处理器,最高工作频率可达400 MHz 。
- 通信能力:无内置Wi-Fi或蓝牙,但可通过附加模块实现无线连接。
- 适用场景:设计用于高性能计算任务,如边缘计算和复杂的人机界面应用。
选型建议
在进行项目选型时,应考虑以下因素:
- 性能需求:如果您的项目需要高处理能力和复杂的算法处理,则应选择具有更高主频和更多内核的型号,如ESP32-P4或ESP32-S3。
- 通信要求:根据是否需要Wi-Fi、蓝牙或其他无线协议来选择合适的系列。例如,若需Wi-Fi 6支持,则可考虑C6系列。
- 功耗考量:对于电池供电的产品,优先选择具备低功耗特性的型号,比如ESP32-S2或ESP32-C3。
- 安全特性:确保所选型号提供了足够的加密和安全启动机制,这对于涉及敏感数据的应用至关重要。
- 外设接口:根据所需连接的传感器和其他外围设备的数量及类型,挑选GPIO数量充足且支持必要接口的型号。
ESP32外设编程
GPIO
示例:点亮LED灯
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/ledc.h"
/* 定义变量 */
#define LED_GPIO GPIO_NUM_27
/* 函数声明 */
void led_gpio_init(void);
/* 任务函数 */
void led_run_task(void *param)
{
int gpio_level = 0;
while(1)
{
gpio_level = gpio_level?0:1;
gpio_set_level(LED_GPIO, gpio_level);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void app_main(void)
{
led_gpio_init();
xTaskCreatePinnedToCore(led_run_task, "led run task", 2048, NULL, 5, NULL, 1);
}
void led_gpio_init(void)
{
gpio_config_t led_cfg = {
.pin_bit_mask = (1<<LED_GPIO),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&led_cfg);
}
示例:使用事件组实现LED呼吸灯
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/ledc.h"
/* 定义变量 */
#define LED_GPIO GPIO_NUM_27
#define FULL_EV_BIT BIT0
#define EMPTY_EV_BIT BIT1
static EventGroupHandle_t ledc_event_handle;
/* 函数声明 */
void led_ledc_init(void);
/* 回调函数*/
/* 加了IRAM_ATTR说明是放在内存中执行的,而不是放在flash中执行 */
bool IRAM_ATTR led_ledc_cb(const ledc_cb_param_t *param, void *user_arg)
{
BaseType_t taskWoken;
if (param->event == LEDC_FADE_END_EVT) {
if(param->duty == 0)
{
xEventGroupSetBitsFromISR(ledc_event_handle, EMPTY_EV_BIT, &taskWoken);
}
else if(param->duty == 8191)
{
xEventGroupSetBitsFromISR(ledc_event_handle, FULL_EV_BIT, &taskWoken);
}
}
return taskWoken;
}
/* 任务函数 */
void led_ledc_task(void *param)
{
EventBits_t ev;
while(1)
{
ev = xEventGroupWaitBits(ledc_event_handle, FULL_EV_BIT | EMPTY_EV_BIT, pdTRUE, pdFALSE, pdMS_TO_TICKS(5000));
if(ev & FULL_EV_BIT)
{
ledc_set_fade_with_time(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 0, 2000);
ledc_fade_start(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT);
}
if(ev & EMPTY_EV_BIT)
{
ledc_set_fade_with_time(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 8191, 2000);
ledc_fade_start(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT);
}
}
}
void app_main(void)
{
led_ledc_init();
xTaskCreatePinnedToCore(led_ledc_task, "led ledc task", 2048, NULL, 5, NULL, 1);
}
void led_ledc_init(void)
{
ledc_timer_config_t led_ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE, //速度
.timer_num = LEDC_TIMER_0, //选择定时器
.clk_cfg = LEDC_AUTO_CLK, //选择时钟
.freq_hz = 5000, //PWM的频率
.duty_resolution = LEDC_TIMER_13_BIT,//PWM的分辨率 8191
};
ledc_timer_config(&led_ledc_timer);
ledc_channel_config_t led_ledc_channel = {
.hpoint = 0,
.flags = {0},
.speed_mode = LEDC_LOW_SPEED_MODE, //速度, S2及之后才有高速模式
.channel = LEDC_CHANNEL_0, //选择通道
.timer_sel = LEDC_TIMER_0, //选择定时器
.gpio_num = LED_GPIO, //选择输出引脚
.duty = 0, //设置占空比
.intr_type = LEDC_INTR_DISABLE, //中断
};
ledc_channel_config(&led_ledc_channel);
ledc_fade_func_install(0); //安装中断服务程序 0表示默认的中断分配方式
ledc_event_handle = xEventGroupCreate(); //创建事件组
ledc_set_fade_with_time(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 8191, 2000); //设置PWM在2s后渐变到达8191
ledc_fade_start(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT); //开启渐变
ledc_cbs_t cbs = {
.fade_cb = led_ledc_cb,
};
ledc_cb_register(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, &cbs, NULL); //设置注册函数
}
更多推荐



所有评论(0)