聊城做网站的公司新闻/长尾词优化外包

聊城做网站的公司新闻,长尾词优化外包,360浏览网页入口,做电容元器件的网站有哪些一、基础知识 本篇我们使用 BOOT 按键来学习一下 GPIO 功能,首先补充一下相关术语介绍。 1、GPIO(General Purpose Input/Output) GPIO 是微控制器上的通用引脚,既可以作为输入(读取外部信号)&#xff0…

一、基础知识

本篇我们使用 BOOT 按键来学习一下 GPIO 功能,首先补充一下相关术语介绍。

1、GPIO(General Purpose Input/Output)

  • GPIO 是微控制器上的通用引脚,既可以作为输入(读取外部信号),也可以作为输出(控制外部设备)。
  • 在 ESP32 中,GPIO 引脚可以灵活配置,用于多种用途,例如读取传感器数据、控制 LED、驱动电机等。

2、输入(Input)

  • 当 GPIO 配置为输入时,它可以读取外部信号的状态(高电平或低电平)。
  • 例如,读取按键是否被按下(按键按下时,引脚电平会发生变化)。

3、输出(Output)

  • 当 GPIO 配置为输出时,它可以控制外部设备的状态(例如点亮 LED 或驱动继电器)。
  • 例如,将 GPIO 设置为高电平(3.3V)来点亮 LED,或设置为低电平(0V)来关闭 LED。

4、内部上拉(Pull-up)和下拉(Pull-down)

  • 上拉电阻:将 GPIO 引脚通过内部电阻连接到电源(3.3V),使引脚在未连接外部信号时保持高电平。
  • 下拉电阻:将 GPIO 引脚通过内部电阻连接到地(GND),使引脚在未连接外部信号时保持低电平。
  • 这些电阻可以确保 GPIO 引脚在没有外部信号时处于确定的状态,避免悬空(floating)导致的不稳定。

5、中断引脚(Interrupt Pin)

  • 中断是一种硬件机制,当 GPIO 引脚的状态发生变化时(例如从高电平变为低电平),会触发一个中断信号。
  • 中断可以让微控制器立即响应外部事件,而不需要不断轮询(polling)引脚状态。
  • 例如,当按键按下时,GPIO 引脚的电平变化会触发中断,微控制器可以立即执行相应的处理程序。

6、BOOT 按键和 IO0 引脚

  • BOOT 按键:ESP32 开发板上通常有一个 BOOT 按键,用于进入下载模式或复位。
  • IO0 引脚:这是 ESP32 的一个 GPIO 引脚,编号为 GPIO0。它通常与 BOOT 按键连接。
  • 当 BOOT 按键按下时,IO0 引脚的电平会发生变化(例如从高电平变为低电平)。

7、设置为 GPIO 中断,接收按键请求

  • 将 IO0 引脚配置为中断引脚,用于检测 BOOT 按键的按下事件。
  • 当按键按下时,IO0 引脚的电平变化会触发中断,微控制器可以立即执行相应的代码(例如处理按键请求)。

二、设计图 

更多详细资料请查询官网 立创·实战派ESP32-S3开发板 - 立创开源硬件平台

三、实战操作

1、Copy 示例工程 sample_project

示例工程路径:$HOME/esp/esp-idf/tools/templates/sample_project

直接在 esp-idf 目录下搜索 sample_project 也可以找到,接着复制一份工程代码到自己的编码路径,然后修改文件夹名字为 boot_key。

可以看到模板工程下只有一个空函数 app_main,函数体还没有代码,我们需要参考官方提供的 gpio 示例进行编码,路径在:$HOME/esp/esp-idf/examples/peripherals/gpio/generic_gpio

2、引入头文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"// ...

使用 printf 函数,需要添加 stdio.h 头文件。string.h 和 stdlib.h 我们这里用不着,可以去掉。接下来是 3 个 freeRTOS 的头文件,最后一个头文件是用于 gpio 的配置。 

3、gpio 配置

3.1、官方示例

首先看一下官方源码示例是怎么写的,再来看看我们需要修改哪些地方,代码注释如下:

// 官方示例代码
void app_main(void)
{// Step1、定义了一个 gpio_config_t 结构体变量。gpio_config_t io_conf = {};// Step2、定义引脚中断类型,这里是 GPIO_INTR_DISABLE,表示中断关闭io_conf.intr_type = GPIO_INTR_DISABLE;// Step3、配置模式,这里是 GPIO_MODE_OUTPUT 表示输出模式io_conf.mode = GPIO_MODE_OUTPUT;// Step4、配置引脚io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;// Step5、配置是否打开下拉电阻io_conf.pull_down_en = 0;// Step6、配置是否打开上拉电阻io_conf.pull_up_en = 0;// Step7、使用 gpio_config 函数进行配置gpio_config(&io_conf);
}

3.2、对应改动点说明

改动点1、修改引脚中断类型

//falling edge interrupt
io_conf.intr_type = GPIO_INTR_NEGEDGE;

开发板上的按键没有按下的时候是高电平,按下去以后是低电平,因此定义成下降沿中断。这里原来是 GPIO_INTR_DISABLE,表示中断关闭,这里我们修改为 GPIO_INTR_NEGEDGE,即下降沿中断。这些宏定义在 gpio_types.h 文件中被定义,我们在 gpio_example_main.c 文件中的 GPIO_INTR_DISABLE 上单击右键,然后选择“转到定义”,就可以找到这几个宏定义,如下所示:

typedef enum {GPIO_INTR_DISABLE = 0,     /*!< Disable GPIO interrupt                             */GPIO_INTR_POSEDGE = 1,     /*!< GPIO interrupt type : rising edge                  */GPIO_INTR_NEGEDGE = 2,     /*!< GPIO interrupt type : falling edge                 */GPIO_INTR_ANYEDGE = 3,     /*!< GPIO interrupt type : both rising and falling edge */GPIO_INTR_LOW_LEVEL = 4,   /*!< GPIO interrupt type : input low level trigger      */GPIO_INTR_HIGH_LEVEL = 5,  /*!< GPIO interrupt type : input high level trigger     */GPIO_INTR_MAX,
} gpio_int_type_t;

改动点2、修改 gpio 模式

//set as input mode
io_conf.mode = GPIO_MODE_INPUT;

修改为输入模式,就可以读取外部信号的状态,按键按下时,捕获到引脚电平变化信号。

改动点3、修改引脚

//bit mask of the pins GPIO0
io_conf.pin_bit_mask = 1<<GPIO_NUM_0;

因为 BOOT 按键连接到了 GPIO0,所以这里我们把原来的 GPIO_OUTPUT_PIN_SEL 修改为 1<<GPIO_NUM_0,实际上 GPIO_NUM_0 是一个宏定义,值为 0。

改动点4、修改打开上下拉电阻

//disable pull-down mode
io_conf.pull_down_en = 0;
//enable pull-up mode
io_conf.pull_up_en = 1;

打开上拉电阻,将 GPIO 引脚通过内部电阻连接到电源,使引脚在未连接外部信号时保持高电平,从而避免引脚悬空导致的不稳定问题。

补充:为什么不用下拉电阻?

下拉电阻也可以用于避免引脚悬空,但它会将引脚在没有外部信号时拉低到地(0V)。在按键检测中,通常使用上拉电阻,因为按键按下时会将引脚拉低到地,这种设计更符合直觉和常见的硬件电路设计。

3.3、改动代码整合 

改动后的代码可以简化成这样子,

// ...void app_main(void)
{//zero-initialize the config structure.gpio_config_t io_conf = {.intr_type = GPIO_INTR_NEGEDGE,.mode = GPIO_MODE_DEF_INPUT,.pin_bit_mask = 1<<GPIO_NUM_0,.pull_down_en = 0,.pull_up_en = 1};//configure GPIO with the given settingsgpio_config(&io_conf);}

4、中断服务函数

4.1、官方示例

同样的,首先看一下官方源码示例是怎么写的,再来看看我们需要修改哪些地方,代码注释如下:

// 官方示例代码#define ESP_INTR_FLAG_DEFAULT 0static QueueHandle_t gpio_evt_queue = NULL;static void IRAM_ATTR gpio_isr_handler(void* arg)
{uint32_t gpio_num = (uint32_t) arg;xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}static void gpio_task_example(void* arg)
{uint32_t io_num;for (;;) {if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num));}}
}void app_main(void)
{// ...// Step1、创建了一个队列,队列消息数量为 10,gpio_evt_queue 是队列句柄gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));// Step2、创建了一个任务,任务名称为 gpio_task_examplexTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);// Step3、启动 GPIO 中断服务,其中 ESP_INTR_FLAG_DEFAULT 的值是 0gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);// Step4、添加某个 GPIO 的中断,第 1 个参数指定哪个 GPIO 产生中断,第 2 个参数是中断服务函数的名称,第 3 个参数是中断服务函数的参数gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);// ...
}

4.2、对应改动点说明

gpio_isr_handler_add(GPIO_NUM_0, gpio_isr_handler, (void*) GPIO_NUM_0);

这里我们只需要添加 GPIO0 的中断,因此修改了参数1、参数3。

4.3、改动代码整合

// ...void app_main(void)
{// ...//create a queue to handle gpio event from isrgpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));//start gpio taskxTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);//install gpio isr servicegpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);//hook isr handler for specific gpio pingpio_isr_handler_add(GPIO_NUM_0, gpio_isr_handler, (void*) GPIO_NUM_0);
}

5、完整代码

#include <stdio.h>
// #include <string.h>
// #include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"#define ESP_INTR_FLAG_DEFAULT 0static QueueHandle_t gpio_evt_queue = NULL;static void IRAM_ATTR gpio_isr_handler(void* arg)
{uint32_t gpio_num = (uint32_t) arg;xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}static void gpio_task_example(void* arg)
{uint32_t io_num;for (;;) {if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num));}}
}void app_main(void)
{//zero-initialize the config structure.gpio_config_t io_conf = {.intr_type = GPIO_INTR_NEGEDGE,.mode = GPIO_MODE_DEF_INPUT,.pin_bit_mask = 1<<GPIO_NUM_0,.pull_down_en = 0,.pull_up_en = 1};//configure GPIO with the given settingsgpio_config(&io_conf);//create a queue to handle gpio event from isrgpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));//start gpio taskxTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);//install gpio isr servicegpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);//hook isr handler for specific gpio pingpio_isr_handler_add(GPIO_NUM_0, gpio_isr_handler, (void*) GPIO_NUM_0);
}

四、编译下载

配置 menu config,设置 flash size 为 16 MB,

 一键烧录,

boot 按键效果,

可以看到,当我们按下 boot 键的时候,控制台输出 GPIO[0] intr, val: 0 符合预期。

五、生成默认配置

编译下载后,结果没有问题的话,使用 idf.py save-defconfig 命令生成 sdkconfig.defaults 文件。这个命令要打开“命令终端”执行,看结果的“串口终端”不行。

idf.py save-defconfig 

回车执行命令后,会看到工程中多了一个 sdkconfig.defaults 文件,点击打开 sdkconfig.defaults 文件,会看到里面的内容。这个文件里面包含了我们对 menuconfig 的修改。

这时候,我们可以把工程中配置和编译生成的文件夹全部去掉,最后的文件如下所示:

使用 VSCode 重新打开工程,在选择目标芯片后,sdkconfig.defaults 文件里面的配置就配置到 menuconfig 里面了,省去了手动配置 menucofig。如果 menuconfig 里面配置的内容很多,这个文件就显得很有必要了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初学者如何设置以及使用富文本编辑器[eclipse版]

手把手教你设置富文本编辑器 参考来源&#xff1a;UEditor Docs 初学者按我的步骤来就可以啦 一、设置ueditor编辑器 1.提取文件[文章最底部有链接提取方式] 2.解压文件并放到自己项目中&#xff0c;在WebContent目录下&#xff1a; 3. 修改jar包位置路径 到--> 注意&a…

25轻化工程研究生复试面试问题汇总 轻化工程专业知识问题很全! 轻化工程复试全流程攻略 轻化工程考研复试真题汇总

轻化工程复试心里没谱&#xff1f;学姐带你玩转面试准备&#xff01; 是不是总觉得老师会问些刁钻问题&#xff1f;别焦虑&#xff01;其实轻化工程复试套路就那些&#xff0c;看完这篇攻略直接掌握复试通关密码&#xff01;文中有重点面试题可直接背~ 目录 一、这些行为赶紧避…

企业数据集成:实现高效调拨出库自动化

调拨出库对接调出单-v&#xff1a;旺店通企业奇门数据集成到用友BIP 在企业信息化管理中&#xff0c;数据的高效流转和准确对接是实现业务流程自动化的关键。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将旺店通企业奇门的数据无缝集成到用…

如何调整CAN位宽容忍度?

CAN位宽容忍度是指在控制器局域网络&#xff08;CAN, Controller Area Network&#xff09;中允许时钟同步的误差范围。这是CAN网络正常通信时的关键因素之一&#xff0c;因为CAN协议依赖位同步来确保多个节点在总线上正确解码数据。CAN位宽容忍度确保节点之间由于时钟偏差或抖…

Django-Vue 学习-VUE

主组件中有多个Vue组件 是指在Vue.js框架中&#xff0c;主组件是一个父组件&#xff0c;它包含了多个子组件&#xff08;Vue组件&#xff09;。这种组件嵌套的方式可以用于构建复杂的前端应用程序&#xff0c;通过拆分功能和视图&#xff0c;使代码更加模块化、可复用和易于维…

MySql数据库运维学习笔记

数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL&#xff08;结构化查询语言&#xff09;中的四个重要类别&#xff0c;它们分别用于不同类型的数据库操作&#xff0c;下面为你简单明了地解释这四类语句&#xff1a; 1. DQL&#xff08;数据查询语言&#xff0c;Data Query Langu…

如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单

随着信息泄露和数据安全问题的日益突出&#xff0c;保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段&#xff0c;可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护&#xff0c;确保其安全性。 为…

UEFI Spec 学习笔记---9 - Protocols — EFI Loaded Image

本节定义EFI_LOADED_IMAGE_PROTOCOL和 EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL。这些协议分别描述了已加载到内存中的映像&#xff0c;并指定了PE/COFF映像通过EFI引导服务LoadImage()加载 时使用的设备路径。这些描述包括 load image 的源、映像在内存中的当前位置、为image分…

pycharm中配置PyQt6详细教程

PyQt6 是 Qt 框架的 Python 绑定库,基于 Qt 6 开发,专为创建跨平台图形用户界面(GUI)应用程序设计。 本章教程,主要记录在pycharm中配置使用PyQt6的流程。 一、安装基础环境 在此之前,你需要提前安装好Python解释器,推荐使用anaconda创建虚拟环境。 conda create -n pyt…

Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今社会&#xff0c;随着人们生活水平的不断提高和健康意识的日益增强&#xff0c;健…

【从0做项目】Java音缘心动(2)———登录、统一返回设计

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;登录模块设计 1&#xff1a;实体类 2&#xff1a;登录的请求和响应设计 二&#xff…

【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…

【个人开源】——从零开始在高通手机上部署sd(二)

代码&#xff1a;https://github.com/chenjun2hao/qualcomm.ai 推理耗时统计 单位/ms 硬件qnncpu_clipqnncpu_unetqnncpu_vaehtp_cliphtp_unethtp_vae骁龙8 gen124716.994133440.39723.215411.097696.327 1. 下载依赖 下载opencv_x64.tar,提取码: rrbp下载opencv_aarch64.t…

从混沌到有序:一个数据血缘分析的进化故事

从混沌到有序&#xff1a;一个数据血缘分析的进化故事 从混沌到有序的数据治理之路数据血缘的建设方法和实践路径数据血缘的实践场景和未来趋势。 数据就像流淌在企业血管中的血液&#xff0c;它的每一次流动、每一次转化都留下独特的印记。 作为数据工程师&#xff0c;我曾困惑…

图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF

将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中&#xff0c;我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题&#xff1a; Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…

【测试】⽤例篇

本节重点⽬标 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 基于需求的设计⽅法 具体的设计⽅法 等价类 边界值 判定表法 正交法 场景法 错误猜测法 1. 测试⽤例 1.1 概念 什么是测试⽤例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为…

C++17中std::chrono::duration和std::chrono::time_point的舍入函数

文章目录 1. std::chrono::duration的舍入函数1.1 floor1.2 ceil1.3 round 2. std::chrono::time_point的舍入函数2.1 示例 3. 舍入函数的应用场景3.1 时间测量3.2 数据记录3.3 时间同步 4. 总结 在C17中&#xff0c; std::chrono库提供了一组强大的时间处理工具&#xff0c;包…

linux之perf(17)PMU事件采集脚本

Linux之perf(17)PMU事件采集脚本 Author: Once Day Date: 2025年2月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Perf性能分析_Once_day的博…

兰州百合基因组(36.68 Gb)-文献精读113

The evolutionary tale of lilies: Giant genomes derived from transposon insertions and polyploidization 百合的进化故事&#xff1a;由转座子插入和多倍化导致的巨型基因组 百合&#xff08;Lilium spp.&#xff09;&#xff0c;被誉为“球根花卉之王”&#xff0c;因其…

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end