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外设编程

ESP-IDF编程指南

GPIO

GPIO & RTC 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);			//设置注册函数
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐