【PC电脑windows-学习样例generic_gpio-ESP32的GPIO程序-基础样例学习】

news2024/11/23 3:19:13

【PC电脑windows-学习样例generic_gpio-ESP32的GPIO程序-基础样例学习】

  • 1、概述
  • 2、实验环境
  • 3、 物品说明
  • 4、自我总结
  • 5、本次实验说明
  • 6、实验过程
      • (1)复制目录到桌面
      • (2)手动敲写
      • (3)反复改错
      • (4)串口验证
      • (5)逻辑分析仪验证
  • 7-1、代码解读
  • 7-2、代码连接
  • 8、相关细节
      • (1)编译环境配置
      • (2)逻辑错误
      • (3)样例代码目录
      • (4)IO定义
      • (5)打印连续输出
      • (6)报错:包含文件
      • (7)输入IO 4 和 5 有点差异
  • 9、总结

1、概述

最为新手,想要快速入门相关设备,比如ESP32,可能最好的方式就是直接手动去敲一遍代码,而控制IO上下拉和输入捕获,算是基础了,官方已有相关样例代码,今天我们就是学习这个样例。

2、实验环境

硬件信息:开发板 ESP32-S3-DevKitM-1(EPS32-S3-wroom-1模块)
在这里插入图片描述

其它硬件:杜邦线,两个usb-type-c连接线。

3、 物品说明

ESP32对自己来说还是比较新的,最近也是刚刚接触,这里对自己使用ESP32进行简单说明。
博文链接:【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】
在这里插入图片描述

另外如果对ESP32相关型号比较感兴趣,可以去官网查看,或者找些资。
官网文档:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitm-1.html
在这里插入图片描述

4、自我总结

(1)练习代码是你更快入门
练习代码比实际看代码要快些,这属于个人见解了,练习敲写代码过程汇总,就是帮助你熟悉相关代码结构,当你从一个固有套路结构代码中,切换到另一套方式时,可能直接手敲,更能让你理解。

(2)IO相关测试,手动更改
自己练习的代码,手动敲完,可能会报错,可能会有逻辑错误,在改的过程中,其实也是熟悉。

5、本次实验说明

本次实验是使用样例generic_gpio,直接复制一份在桌面,然后手动敲写一遍。

这个样例,是使用ESP32的GPIO 18,GPIO 19 , GPIO 4 GPIO 5.
其中 GPIO18,和GPIO19是输出, GPIO 4和GPIO 5是输入.如下,代码中也说明了,但是开始的时候,自己作为新手,可不敢说自己就和知道了,试过之后才能准确确定的。

在这里插入图片描述

6、实验过程

(1)复制目录到桌面

在这里插入图片描述

(2)手动敲写

我们只是删除如下文件内容,
在这里插入图片描述
然后自己手都敲写一遍。
在这里插入图片描述

(3)反复改错

可以看到,首次编译还是有很多错误的,拼写错误,都还好,逻辑错误有点难找。
在这里插入图片描述
就是根据原版,反复对照,可以看到原版有很多注释的,我们可以不用打。
在这里插入图片描述

(4)串口验证

在这里插入图片描述
下载成功后验证

在这里插入图片描述

(5)逻辑分析仪验证

在这里插入图片描述

7-1、代码解读

一般来说你要是自己敲写一遍,基本就明白了。按照自己理解写了一点解读,样例已有,只不过是英文的。

/* GPIO Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#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"

/**
 * Brief:
 * This test code shows how to configure gpio and how to use gpio interrupt.
 *
 * GPIO status:
 * GPIO18: output (ESP32C2/ESP32H2 uses GPIO8 as the second output pin)
 * GPIO19: output (ESP32C2/ESP32H2 uses GPIO9 as the second output pin)
 * GPIO4:  input, pulled up, interrupt from rising edge and falling edge
 * GPIO5:  input, pulled up, interrupt from rising edge.
 *
 * Note. These are the default GPIO pins to be used in the example. You can
 * change IO pins in menuconfig.
 *
 * Test:
 * Connect GPIO18(8) with GPIO4
 * Connect GPIO19(9) with GPIO5
 * Generate pulses on GPIO18(8)/19(9), that triggers interrupt on GPIO4/5
 *
 */


#define GPIO_OUTPUT_IO_0 CONFIG_GPIO_OUTPUT_0
#define GPIO_OUTPUT_IO_1 CONFIG_GPIO_OUTPUT_1
#define GPIO_OUTPUT_PIN_SEL ((1ULL<<GPIO_OUTPUT_IO_0)|(1ULL<<GPIO_OUTPUT_IO_1))

#define GPIO_INPUT_IO_0 CONFIG_GPIO_INPUT_0
#define GPIO_INPUT_IO_1 CONFIG_GPIO_INPUT_1
#define GPIO_INPUT_PIN_SEL ((1ULL<<GPIO_INPUT_IO_0) | (1ULL<<GPIO_INPUT_IO_1))


#define ESP_INTR_FLAG_DEFAULT 0
static 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("my_DATA_GPIO[%"PRIu32"] intr,val:%d\n",io_num,gpio_get_level(io_num));
        }
    }
}

void app_main(void)
{
    //IO初始化配置 
    gpio_config_t io_conf={};
    io_conf.intr_type=GPIO_INTR_DISABLE;
    io_conf.mode=GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask=GPIO_OUTPUT_PIN_SEL;
    io_conf.pull_down_en=0;
    io_conf.pull_up_en=0;
    gpio_config(&io_conf);

    io_conf.intr_type=GPIO_INTR_POSEDGE;
    io_conf.pin_bit_mask=GPIO_INPUT_PIN_SEL;
    io_conf.mode=GPIO_MODE_INPUT;
    io_conf.pull_up_en=1;
    gpio_config(&io_conf);
    //初始化
    gpio_set_intr_type(GPIO_INPUT_IO_0,GPIO_INTR_ANYEDGE);

    gpio_evt_queue=xQueueCreate(10,sizeof(uint32_t));
    //开一个任务
    xTaskCreate(gpio_task_example,"gpio_task_example",2048,NULL,10,NULL);
    //输出中断
    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
    gpio_isr_handler_add(GPIO_INPUT_IO_0,gpio_isr_handler,(void * )GPIO_INPUT_IO_0);
    //gpio_isr_handler_remove(GPIO_INPUT_IO_0);
    gpio_isr_handler_add(GPIO_INPUT_IO_1,gpio_isr_handler,(void * )GPIO_INPUT_IO_1);
    gpio_isr_handler_remove(GPIO_INPUT_IO_0);

    gpio_isr_handler_add(GPIO_INPUT_IO_0,gpio_isr_handler,(void * )GPIO_INPUT_IO_0);
    printf("Minmu free heap_size:%"PRIu32" bytes\n",esp_get_minimum_free_heap_size());

    int cnt=0;
    
    while (1)
    {
        printf("<<<my_learing_GPIO_cnt:%d>>>\n",cnt++);
        vTaskDelay(1000/portTICK_PERIOD_MS);
        gpio_set_level(GPIO_OUTPUT_IO_0,cnt%2);
        gpio_set_level(GPIO_OUTPUT_IO_1,cnt%2);
    }
    

}

7-2、代码连接

代码链接:https://download.csdn.net/download/qq_22146161/88483114

8、相关细节

(1)编译环境配置

相关配置情况自己的其他文章:【ESP32-PC电脑windows-环境搭建-记录-hello-world-运行基础样例学习】

(2)逻辑错误

一般来说逻辑错误比较难以发现。
在这里插入图片描述

(3)样例代码目录

如果是默认安装,找如下目录

C:\Espressif\frameworks\esp-idf-v5.0.2\examples\peripherals\gpio

在这里插入图片描述

(4)IO定义

自己打代码的时候,比较疑惑,没有看到GPIO18相关的信息,怎么就是GPIO19,GPIO4,等等,后来看到配置文件。
在这里插入图片描述

(5)打印连续输出

如下图,可以开电脑有一串1,那是因为手抖了,没有去除抖动。
在这里插入图片描述

(6)报错:包含文件

开始的时候是在Linux环境
在这里插入图片描述
在windows环境后,知道了原因
在这里插入图片描述

(7)输入IO 4 和 5 有点差异

实验过程中,发现4是可以检验高低的,但是5只能检测高。一直以为自己敲代码敲错了,后来,拿样例对比才知道,5就只检测高。

如下,如果不是抖动的话,5一直检测高
在这里插入图片描述
如下,如果不是抖动的话,GPIO4高低都检测
在这里插入图片描述

9、总结

一步一步

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

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

相关文章

将知识图谱结合到地铁客流预测中:一个分散注意力关系图卷积网络

导读 论文题目《Combining knowledge graph into metro passenger flow prediction: A split-attention relational graph convolutional network 》。该论文于2023年发表于《Expert Systems With Applications》&#xff0c;文章基于知识图谱&#xff0c;提出了一种分割注意力…

【操作系统】考研真题攻克与重点知识点剖析 - 第 1 篇:操作系统概述

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

数组元素逆序交换

数组元素逆序交换 例如&#xff1a; 输入&#xff1a; 1,2,3,4,5 输出&#xff1a; 5,4,3,2,1 代码&#xff1a; #include<stdio.h> #define N 5 int main() {int a[N], i, temp;for (i 0; i < N; i) {scanf("%d", &a[i]);}for (i 0; i < N…

FL Studio 21.2 升级,支持 Stem 分离和可以发布音乐的 FL Cloud

FL Studio 21.2 带有 stem 分离和 FL Cloud&#xff0c;这是一项专为 FL Studio 打造的具有里程碑意义的新服务。其他新功能包括 FL Studio Fruity Edition 的 Audio Clips&#xff08;音频剪辑&#xff09;和一个新的模拟建模合成器 Kepler。 fl studio 21直装版: https://pan…

JavaEE-cookie和session

本部分内容包括 cookie基本概念&#xff0c;sendcookies和getcookies代码&#xff1b; session基本概念&#xff0c;session实现登陆界面&#xff1b; 上述过程中涉及的代码如下&#xff1a; 1 import javax.servlet.ServletException; import javax.servlet.annotation.WebSe…

2318.不同骰子序列的数目

经典的DP题目&#xff0c;求方案数 从序列中最后一个数字往前考虑 当前状态取决于前一个的状态和再前一个的状态所以dp&#xff08;n&#xff0c;last&#xff0c;last1&#xff09;为当前考虑的是第n个并且前一个数字是last 再前一个数字是last1的所有方案数&#xff0c;递归的…

Leetcode—21.合并两个有序链表【简单】

2023每日刷题&#xff08;十三&#xff09; Leetcode—21.合并两个有序链表 直接法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* mergeTwoLists(struct ListNode* list1, struct…

0033Java程序设计-基于java的NBA球队运营管理系统的的设计与实现论文

文章目录 摘 要目 录系统设计开发环境 摘 要 本NBA球队运营管理系统设计目标是实现NBA球队运营管理的信息化管理&#xff0c;提高管理效率&#xff0c;使得NBA球队运营管理工作规范化、科学化、高效化。 本文研究的NBA球队运营管理系统基于SSM架构&#xff0c;采用JSP技术、J…

python爬虫selenium和ddddocr使用

python爬虫selenium和ddddocr使用 selenium使用 selenium实际上是web自动化测试工具&#xff0c;能够通过代码完全模拟人使用浏览器自动访问目标站点并操作来进行web测试。 通过pythonselenium结合来实现爬虫十分巧妙。 由于是模拟人的点击来操作&#xff0c;所以实际上被反…

一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium

大家好&#xff0c;我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战 以及1小时掌握Python操作Mysql数据库之pymysql模块技术 近日锋哥又卷了一波课程&#xff0c;python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium&#xff0c;文字版视频版。1…

[java/力扣110]平衡二叉树——优化前后的两种方法

分析 根据平衡二叉树的定义&#xff0c;只需要满足&#xff1a;1、根节点两个子树的高度差不超过1&#xff1b;2、左右子树都为平衡二叉树 代码 public class BalancedBinaryTree {public class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(){}TreeNode(int va…

基于SSM的n省出口基地公共信息服务平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

软考下午第一题 案列分析

期待分值 10&#xff0c;前三问12左右分&#xff0c;最后一题2、3分左右&#xff0c;重点在于拿下前面三题。 小心谨慎&#xff0c;不要大意。 数据流图 外部系统 数据存储 加工&#xff08;&#xff09;process 数据流 第二小题 说明给出存储名称&#xff0c;就使用该名称&…

C# Socket通信从入门到精通(6)——单个同步TCP服务器监听多个客户端C#代码实现

前言: 我们在C# Socket通信从入门到精通(5)——单个同步TCP服务器监听一个客户端C#代码实现这篇文章中讲述了一个服务器如何与一个客户端进行交互,但是有时候我们需要一个服务器与多个客户端进行交互,这时候上一篇文章介绍的方法就不足以实现这个功能,本篇文章就是介绍如…

基于Qt 文本读写(QFile/QTextStream/QDataStream)实现

​ 在很多时候我们需要读写文本文件进行读写,比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本,比如修改了一个 txt 文件后保存,就需要对这个文件进行读写操作。本章介绍简单的文本文件读写,内容精简,让大家了解文本读写的基本操作。 ## QFile 读写文本 QFile 类提供了读…

[2021]不确定成本下的处理分配

英文题目&#xff1a;Treatment Allocation under Uncertain Costs 中文题目&#xff1a;不确定成本下的处理分配 单位&#xff1a;swager、uber 时间&#xff1a;2021 论文链接&#xff1a;https://arxiv.org/pdf/2103.11066.pdf 代码&#xff1a; 摘要&#xff1a; 我…

一个基于Excel模板快速生成Excel文档的小工具

介绍 DocumentGenerator是一个Excel快速生成工具&#xff0c;目标以后还能实现Word、pdf等的文件的生成。该程序独立运行&#xff0c;可通过HTTP接口调用其生成接口。 典型使用场景为如下&#xff1a; 使用者编写模板文件使用者准备模板文件的填充JSON数据内容使用者通过网络…

STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据

一.串口轮询模式底层机制&#xff1a; 在STM32每个串口的内部都有两个寄存器&#xff1a;发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时&#xff0c;CPU会将数据依次将数据发送到数据寄存器中&#xff0c;移位寄存器中的数据会根据我们设置…

leetcode做题笔记206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&am…

k8s replicaSet,deployment 学习笔记

文章目录 replicaSet 和 deployment 两者的关系。创建滚动更新回滚 replicaSet 和 deployment 两者的关系。 在 Kubernetes 中&#xff0c;ReplicaSet 和 Deployment 都是用来确保某种 Pod 的副本数目。但是&#xff0c;ReplicaSet 和 Deployment 是有差别的&#xff0c;二者的…