搜索
bottom↓
回复: 0

《DNESP32S3使用指南-IDF版_V1.6》第十章 LED实验

[复制链接]

出0入234汤圆

发表于 2 小时前 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2024-7-16 10:33 编辑

2.jpg
1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
1.png
3.png


第十章 LED实验


       本章将通过一个经典的点灯实验,带大家开启ESP32-S3 IDF开发之旅。通过本章学习,我们将会学习到如何实现ESP32-S3的IO作为输出功能。
       本章分为如下几个小节:
       10.1 GPIO&LED简介
       10.2 硬件设计
       10.3 程序设计
       10.4 下载验证

       10.1 GPIO&LED简介

       10.1.1 GPIO简介
       GPIO是负责控制或采集外部器件信息的外设,主要负责输入输出功能。在第三章节中,作者详细阐述了ESP32-S3芯片具有45个物理GPIO管脚,涵盖GPIO0至GPIO21以及GPIO26至GPIO28的广泛范围。然而,相较于ESP32-S3芯片,ATK-MWS3S模组引出的GPIO管脚数量较少,仅有36个。尽管如此,这些管脚均具备通用IO功能,并且可以通过内部IO MUX(复用矩阵)灵活复用为其他功能,这充分展现了ESP32-S3芯片的强大和灵活性。关于ESP32-S3的IO MUX和GPIO交换矩阵的内容已在第三章详细阐述,为避免重复,此处不再赘述。以下是ATK-MWS3S模组的GPIO分布图。

第十章 LED实验478.png
图10.1.1.1 ATK-MWS3S模组GPIO分布图

       从上面的图示中可见,黄色区域的管脚均可作为普通的IO端口使用。因此,在控制LED灯时,我们可以自由选择任意一个管脚进行操作。但请注意,部分IO端口可能与Flash或PSRAM等元件的管脚相关联,这就需要开发者在操作过程中参考相关技术手册,以避免潜在的问题。在正点原子的DNESP32S3开发板中,模组的IO1被用来连接LED的负极,因此在本章的实验中,我们将主要对IO1进行操作。

       10.1.2 LED简介
       LED,即发光二极管,其发光原理基于半导体的特性。在半导体中,有两类重要的载流子:电子,主要存在于n型半导体中;而空穴,则主要存在于p型半导体中。当n型半导体与p型半导体材料接触时,它们的交界处会形成一个特殊的层结。当对这个层结施加适当的电压时,层结中的空穴与电子会发生重组,并释放出能量。这些能量会以光子的形式被释放出来,从而产生可见光。这就是LED发光的基本原理。

       1,LED 灯驱动原理
       LED驱动是指通过稳定的电源为LED提供适宜的电流和电压,确保其正常发光。LED驱动方式主要有恒流和恒压两种,其中,恒流驱动因其能限定电流而备受青睐。由于LED灯对电流变化极为敏感,一旦电流超过其额定值,可能导致损坏。因此,恒流驱动通过确保电流的稳定性,进而保障LED的安全运行。

       2,LED灯驱动方式
       下面,我们来看一下LED两种驱动方式。
       (1)灌入电流接法。指的是LED的供电电流是由外部提供电流,将电流灌入我们的MCU;风险是当外部电源出现变化时,会导致MCU的引脚烧坏。其接法如下图所示。

第十章 LED实验1160.png
图10.1.2.1 灌入电流接法

       (2)输出电流接法。指的是由MCU提供电压电流,将电流输出给LED;如果使用 MCU的GPIO 直接驱动 LED,则驱动能力较弱,可能无法提供足够的电流驱动 LED。其接法如下图所示。

第十章 LED实验1272.png
图10.1.2.2 输出电流接法

       DNESP32S3开发板上的LED采用灌入电流接法,这种方式避免了MCU直接提供电压电流来驱动LED,从而有效减轻了MCU的负载。这使得MCU能够更加专注于执行其他核心任务,进而提升了整体系统的性能和稳定性。

       10.2 硬件设计

       10.2.1 例程功能
       实验现象: LED灯以500ms的频率交替闪烁。

       10.2.2 硬件资源
       1.LED:
              LED-IO1

       10.2.3 原理图
       本章用到的硬件有 LED 灯。电路在开发板上已经连接好,所以在硬件上不需要动任何东西,直接下载代码就可以测试使用。其连接原理图如下图所示。

第十章 LED实验1551.png
图10.2.3.1 LED连接原理图

       从上图可知,若IO1输出低电平时,则LED亮起,反之,熄灭。

       10.3 程序设计
       了解了ESP32的GPIO结构以及我们的实验功能,下面开始设计程序。

       10.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

第十章 LED实验1748.png
图10.3.1.1 LED实验程序流程图

       10.3.2 GPIO函数解析        
       ESP-IDF提供了丰富的GPIO操作函数,开发者可以在esp-idf-v5.1.2\components\driver\gpio路径下找到相关的gpio.c和gpio.h文件。在gpio.h头文件中,你可以找到ESP32-S3的所有GPIO函数定义。接下来,作者将介绍一些常用的GPIO函数,这些函数的描述及其作用如下:

       1,GPIO配置函数
       该函数用来配置GPIO的模式、上下拉等功能,其函数原型如下所示:
       esp_err_t gpio_config(const gpio_config_t *pGPIOConfig)
       该函数的形参描述如下表所示:

1.png
表10.3.2.1 gpio_config函数形参描述

       返回值:ESP_OK表示配置成功,ESP_FAIL表示配置失败。
       pGPIOConfig为GPIO配置结构体指针,下面来看一下gpio_config_t结构体中的变量。
  1. /* GPIO配置参数 */
  2. typedef struct {
  3.     uint64_t pin_bit_mask;          /* 配置引脚位 */
  4.     gpio_mode_t mode;               /* 设置引脚模式 */
  5.     gpio_pullup_t pull_up_en;       /* 设置上拉 */
  6.     gpio_pulldown_t pull_down_en;   /* 设置下拉 */
  7.     gpio_int_type_t intr_type;      /* 中断配置 */
  8. } gpio_config_t;
复制代码

       关于各个参数有哪一些看下表说明:

2.png
表10.3.2.2 gpio_config_t结构体的参数描述

       在上表中,可填参数均可在gpio_types.h文件中找到。这些参数通常是通过枚举类型(enum)定义的,它们为特定的GPIO模式或配置提供了预定义的数值。当我们需要为结构体变量(如gpio_mode_t)设置参数时,我们可以查阅gpio_types.h文件,找到对应的枚举类型,并从中选择适当的数值。这样,我们可以确保为GPIO接口设置的模式或配置是准确和有效的。

       2,设置管脚输出电平
       该函数用于配置某个管脚输出电平,该函数原型如下所示:
       esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level);
       该函数的形参描述如下表所示:

3.png
表10.3.2.3 gpio_set_level函数形参描述

       返回值:ESP_OK表示设置成功,ESP_FAIL表示设置失败。

       3,获取管脚电平
       该函数用于获取某个管脚的电平,该函数原型如下所示:
       esp_err_t gpio_get_level(gpio_num_t gpio_num);
       该函数的形参描述如下表所示:

4.png
表10.3.2.4 gpio_get_level函数形参描述

       返回值:ESP_OK表示获取成功,ESP_FAIL表示获取失败。
       上述函数,便是本实验所需的核心GPIO函数。对于其他未提及的GPIO函数,我们用到了再去了解。

       10.3.3 LED驱动解析
       在IDF版的01_led例程中,作者在01_led\components\BSP路径下新增了一个LED文件夹,用于存放led.c和led.h这两个文件。其中,led.h文件负责声明LED相关的函数和变量,而led.c文件则实现了LED的驱动代码。下面,我们将详细解析这两个文件的实现内容。

       1,led.h文件
  1. /* 引脚定义 */
  2. #define LED_GPIO_PIN    GPIO_NUM_1  /* LED连接的GPIO端口 */

  3. /* 引脚的输出的电平状态 */
  4. enum GPIO_OUTPUT_STATE
  5. {
  6.     PIN_RESET,
  7.     PIN_SET
  8. };

  9. /* LED端口定义 */
  10. #define LED(x)          do { x ?                                      \
  11.                              gpio_set_level(LED_GPIO_PIN, PIN_SET) :  \
  12.                              gpio_set_level(LED_GPIO_PIN, PIN_RESET); \
  13.                         } while(0)  /* LED翻转 */

  14. /* LED取反定义 */
  15. #define LED_TOGGLE()    do {
  16. gpio_set_level(LED_GPIO_PIN, !gpio_get_level(LED_GPIO_PIN));
  17. } while(0)  /* LED翻转 */

  18. /* 函数声明*/
  19. void led_init(void);    /* 初始化LED */
复制代码

       作者巧妙地编写了LED(x)宏,用于控制IO1管脚的电平状态。当x为1时,该宏会设置IO1管脚输出高电平;反之,则输出低电平。此外,作者还定义了LED_TOGGLE()宏,它能够实现IO1管脚电平状态的快速翻转。这些宏的实现均基于之前小节所介绍的函数,使得对LED的控制变得简洁而高效。

       2,led.c文件
  1. /**
  2. * @brief       初始化LED
  3. * @param       无
  4. * @retval      无
  5. */
  6. void led_init(void)
  7. {
  8.     gpio_config_t gpio_init_struct = {0};

  9.     gpio_init_struct.intr_type = GPIO_INTR_DISABLE;         /* 失能引脚中断 */
  10.     gpio_init_struct.mode = GPIO_MODE_INPUT_OUTPUT;         /* 输入输出模式 */
  11.     gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;       /* 使能上拉 */
  12.     gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE;  /* 失能下拉 */
  13.     gpio_init_struct.pin_bit_mask = 1ull << LED_GPIO_PIN;   /* 设置的引脚的位掩码*/
  14.     gpio_config(&gpio_init_struct);                         /* 配置GPIO */

  15.     LED(1);                                                 /* 关闭LED */
  16. }
复制代码

       在.c文件中,作者首先对gpio_init_struct结构体变量进行了参数配置。接着,调用gpio_config函数,利用该配置变量完成了GPIO的初始化工作。最后,通过调用LED(x)宏定义,实现了LED灯的关闭操作,即输出了高电平信号。整个流程清晰、简洁,有效地实现了对LED灯的控制。

       10.3.4 CMakeLists.txt文件
       打开本章节的实验(01_LED),我们惊奇地发现,在components/BSP路径下定义了CMakeLists.txt文件(该文件的作用,作者已经在第四章中阐述过)。此文件的作用是将BSP文件夹下的驱动程序添加到构建系统中,确保在编译项目工程时能够调用这些驱动程序。下面展示了该驱动CMakeLists.txt文件的具体内容。

       ①源文件路径,指本目录下的所有代码驱动
       set(src_dirs
       LED)

       ②头文件路径,指本目录下的所有代码驱动
       set(include_dirs
                   LED)

       ③设置依赖库
       set(requires
                   driver)

       idf_component_register(SRC_DIRS ${src_dirs}
       INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})

       component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)

       从上述描述中,我们了解到①和②处均需要添加相应的驱动程序。以本章节实验为例,在BSP文件夹下仅有一个LED驱动,因此我们需要在①和②的位置引入该LED驱动。而③处所提到的,是LED驱动所依赖的ESP-IDF中的具体驱动库。本实验中的LED驱动调用io.c和gpio.h文件下的函数实现的,这些文件均位于esp-idf-v5.1.2\components\driver文件夹中,因此我们可以确定LED驱动所依赖的是driver库。通过这样的依赖关系,我们可以确保LED驱动的正确集成和调用。

       10.3.5 实验应用代码
       打开main/main.c文件,该文件定义了工程入口函数,名为app_main。该函数代码如下。
  1. /**
  2. * @brief       程序入口
  3. * @param       无
  4. * @retval      无
  5. */
  6. void app_main(void)
  7. {
  8.     esp_err_t ret;
  9.    
  10.     ret = nvs_flash_init();         /* 初始化NVS */
  11. if (ret == ESP_ERR_NVS_NO_FREE_PAGES
  12. || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
  13.     {
  14.         ESP_ERROR_CHECK(nvs_flash_erase());
  15.         ret = nvs_flash_init();
  16.     }
  17.     led_init();                     /* 初始化LED */

  18.     while(1)
  19.     {
  20.         LED_TOGGLE();
  21.         vTaskDelay(500);                   /* 延时500ms */
  22.     }
  23. }
复制代码

       上述应用代码中,作者首先通过调用nvs_flash_init函数来初始化NVS。若初始化时遇到没有足够空闲页面或检测到新版本的情况,代码会先擦除整个NVS分区,并随后重新进行初始化。这种处理方式旨在确保NVS在特定错误条件下能够被重置并重新使用。紧接着,代码调用led_init函数来初始化LED。在随后的while循环中,利用LED_TOGGLE()宏定义来定期翻转LED的电平状态,每次翻转间隔为500毫秒,从而实现了LED的闪烁效果。

       10.4 下载验证
       下载完之后,可以看到 LED以每次500ms闪烁。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-16 12:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表