ESP32S3 开发笔记

GPIO

ESP32的GPIO(通用输入输出)引脚非常灵活,支持多种工作模式。这些模式可以通过编程来配置,以适应不同的应用需求。以下是ESP32 GPIO引脚的主要工作模式:

1. 输入模式

  • 普通输入模式:在这种模式下,GPIO可以读取外部信号的高(1)或低(0)状态。
  • 上拉输入模式:启用内部上拉电阻,当外部没有驱动信号时,GPIO引脚将读取为高电平。
  • 下拉输入模式:启用内部下拉电阻,当外部没有驱动信号时,GPIO引脚将读取为低电平。

2. 输出模式

  • 普通输出模式:GPIO可以输出高或低电平,直接控制外部设备。
  • 开漏输出模式:在这种模式下,GPIO可以只输出低电平;当输出高电平时,引脚处于高阻状态,通常需要外部上拉电阻。

3. 输入输出模式

  • 输入/输出模式:GPIO引脚可以配置为既可以输入也可以输出,这在需要双向通信的应用中非常有用。

4. 特殊功能模式

  • 替代功能模式:GPIO引脚可以配置为支持特定功能,如UART、I2C、SPI、PWM(脉冲宽度调制)、CAP(输入捕捉)等。这些模式使GPIO可以直接连接到内部外设,执行复杂的通信或控制任务。

5. 中断模式

  • 中断模式:在输入模式的基础上,GPIO可以配置为在信号变化时触发中断,如上升沿、下降沿或任意边沿触发。这允许微控制器在特定外部事件发生时立即作出响应,而不是不断地检查引脚状态。

示例代码(ESP-IDF)

配置GPIO作为输入,并启用上拉电阻,设置中断触发:

#include "driver/gpio.h"

#define GPIO_INPUT_PIN  4
#define GPIO_INPUT_PIN_SEL  (1ULL<<GPIO_INPUT_PIN)

void app_main() {
    gpio_config_t io_conf;
    // 禁用输出
    io_conf.mode = GPIO_MODE_INPUT;
    // 设置上拉
    io_conf.pull_up_en = 1;
    io_conf.pull_down_en = 0;
    // 设置GPIO的位掩码
    io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
    // 设置中断类型为任意边沿
    io_conf.intr_type = GPIO_INTR_ANYEDGE;
    // 配置GPIO
    gpio_config(&io_conf);

    // 初始化中断服务
    gpio_install_isr_service(0);
    // 添加中断处理函数(需额外定义处理函数)
    gpio_isr_handler_add(GPIO_INPUT_PIN, gpio_isr, (void*) GPIO_INPUT_PIN);
}

通过配置和使用ESP32的GPIO工作模式,可以灵活地设计和实现各种硬件交互功能。如果您需要关于特定工作模式或配置的更多详细信息,我很乐意进一步提供帮助。


头文件.h 添加 (加入构建系统进行编译)

set(LV_UI_DIR ./ui)
set(UTILS_DIR ./utils)
set(LV_INC_DIR ../components/lvgl__lvgl  ../components/lvgl__lvgl/src/core)

file(GLOB_RECURSE LV_UI_SOURCES  ${LV_UI_DIR}/custom/*.c   ${LV_UI_DIR}/generated/*.c  ${LV_UI_DIR}/generated/guider_customer_fonts/*.c
     ${LV_UI_DIR}/generated/images/*.c
     ${LV_UI_DIR}/generated/guider_fonts/*.c)
     
idf_component_register(
    SRCS  
    "taskStackMonitor.c"
    # "tool.c" 

    ${LV_UI_SOURCES}
    INCLUDE_DIRS "." ${LV_UI_DIR}/custom ${UTILS_DIR}  ${LV_UI_DIR}/generated ${LV_INC_DIR})

set_source_files_properties(
    ${LV_UI_SOURCES}
    PROPERTIES COMPILE_OPTIONS
    -DLV_LVGL_H_INCLUDE_SIMPLE)     
            
               

目录结构
在这里插入图片描述

把头文件的路劲加入到INCLUDE_DIRS 后面

查看分区偏移地址

获取ESP32分区的起始偏移地址可以通过以下几种方法:

1. 使用ESP-IDF的Partition Table工具

在ESP-IDF中,分区的起始偏移地址通常在分区表(partition table)中定义。你可以使用ESP-IDF提供的partition_table工具来查看分区的起始偏移地址。
以下是在ESP-IDF环境中查看分区信息的步骤:

  1. 打开终端,进入到你的ESP-IDF项目目录。
  2. 使用idf.py partition-table命令来生成或者查看分区表。
    idf.py partition-table
    
  3. 生成的分区表通常在项目的build目录下,名为partition_table.bin
  4. 使用partition_table工具来查看具体的分区信息:
    python ${IDF_PATH}/components/partition_table/parttool.py --partition-table build/partition_table.bin list
    

这个命令会输出所有分区的信息,包括分区的名称、类型、子类型、偏移地址、大小等。

2. 查看Partition Table CSV文件

在ESP-IDF项目中,分区的定义通常在一个CSV文件中(例如partitions.csv),你可以直接查看这个文件来获取分区的起始偏移地址。
例如,一个典型的分区定义可能如下所示:

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x6000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 1M,

在这个例子中,factory分区的起始偏移地址是0x10000

3. 在程序运行时获取

你还可以在程序运行时,使用ESP-IDF提供的API来获取分区的起始偏移地址。以下是一个示例代码:

#include "esp_partition.h"
// 获取特定名称分区的起始地址
esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_ANY, "factory");
if (partition != NULL) {
    printf("Partition '%s' starts at offset 0x%x\n", partition->label, partition->address);
}

在上述代码中,我们使用esp_partition_find_first函数来查找名为"factory"的分区,并打印出其起始地址。
确保在尝试上述任何方法之前,你已经正确设置了ESP-IDF环境,并且你的项目配置正确无误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值