首页 > 其他分享 >在Arduino环境下对ESP32进行寄存器操作和区别比较

在Arduino环境下对ESP32进行寄存器操作和区别比较

时间:2023-12-11 16:12:53浏览次数:48  
标签:pin Arduino ESP32 寄存器 GPIO gpio 操作

在Arduino环境下对ESP32进行寄存器操作和区别比较

前言

这篇文章主要是对在Arduino环境下如何对ESP32进行寄存器操作进行了相关的说明。并且比较了在不同编程方式下GPIO口的电平翻转速度,这可以更加直观的不同编程方式下的代码运行效率。(平台是VScode,使用Platformio下的Arduino固件对ESP32进行编程)

寄存器操作

如果你在VScode上安装了ESP32的Arduino固件,你将会在下面的所示的文件路径中找到寄存器相关的头文件:
C:\Users\用户名\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\include\soc\esp32\include\soc
(将用户名修改为自己电脑的用户)

相关头文件

以GPIO相关的寄存器为例:

通过查看ESP32的参考手册,可以得到GPIO的相关寄存器,每个寄存器都对应有不同的地址:
GPIO寄存器

而在文件夹中有两个比较重要的头文件:
gpio_reg.h:将GPIO相关的寄存器地址通过宏定义定义了出来,可以对寄存器直接进行操作。
gpio_struct.h:将GPIO相关的寄存器通过结构体的方式定义了出来,可以通过结构体进行访问。

GPIO的寄存器操作

通过3种不同编程方式下GPIO口的电平翻转速度进行了测量:

方式一:通过库函数对GPIO进行操作

#include <Arduino.h>

const int gpio_pin = 14;
void setup() {
    pinMode(gpio_pin, OUTPUT);
    digitalWrite(gpio_pin, HIGH);
    delay(500);
}

void loop() {
    //1 通过库函数对GPIO进行操作
    digitalWrite(gpio_pin, LOW);    //set 0
    digitalWrite(gpio_pin, HIGH);   //set 1
}

通过逻辑分析仪测量引脚电平波形,可以看到低电平约为325ns,高电平约为439ns
方式一

方式二:通过定义的寄存器结构体对GPIO进行操作

#include <Arduino.h>

const int gpio_pin = 14;
void setup() {
    pinMode(gpio_pin, OUTPUT);
    digitalWrite(gpio_pin, HIGH);
    delay(500);
}

void loop() {
    //2 通过定义的寄存器结构体对GPIO进行操作
    GPIO.out_w1tc |= (1<<14);   //set 0
    GPIO.out_w1ts |= (1<<14);   //set 1
}

通过逻辑分析仪测量引脚电平波形,可以看到低电平约为125ns,高电平约为201ns
方式二

方式三:直接通过寄存器地址对GPIO进行操作

#include <Arduino.h>

const int gpio_pin = 14;
void setup() {
    pinMode(gpio_pin, OUTPUT);
    digitalWrite(gpio_pin, HIGH);
    delay(500);
}

void loop() {
    //3 直接通过寄存器地址对GPIO进行操作
    *(volatile unsigned int*)GPIO_OUT_W1TC_REG |= (1<<14);
    *(volatile unsigned int*)GPIO_OUT_W1TS_REG |= (1<<14);
}

通过逻辑分析仪测量引脚电平波形,可以看到低电平约为113ns,高电平约为199ns
方式三

通过对比发现,直接通过寄存器地址对GPIO进行操作的方式是最快的,但是和对寄存器结构体对GPIO进行操作的方式相差不大,库函数操作的方式效率最低。

标签:pin,Arduino,ESP32,寄存器,GPIO,gpio,操作
From: https://www.cnblogs.com/haostudio/p/17894658.html

相关文章

  • [Re221127周任务]认识寄存器
    1.分析逻辑 我们一个一个点进去看 我们这里是加密过程并且加密后直接与输入对比的,所以我们可以直接动调2.动调 下在这里就好了 点进去eax就有flag了 注意这个flag是不包括上面那个1的 ......
  • ESP32CAM介绍
    ESP32-CAM是安信可最新发布小尺寸的摄像头模组。该模块可以作为最小系统独立工作,尺寸仅为27*40.5*4.5mm,深度睡眠电流最低达到6mA。 ESP32-CAM可广泛应用于各种物联网场合,适用于家庭智能设备、工业无线控制、无线监控、QR无线识别,无线定位系统信号以及其它物联网应用,是物联网应......
  • ESP32简单实现新版HC-SR04超声波模块(MicroPython+Thonny)
    一、新版HC-SR04简介新版HC-SR04,性能远超老版HC-SR04,US-015;在测距精度高于老版HC-SR04和US-015的情况下,测距范围更远,可达6米,远超一般超声波测距模块。采用CS-100A超声波测距SOC芯片,高性能,工业级,宽电压、低价格,成本击穿底价,只有普通超声波测距模块一半的价格,而性能远超普通超声波......
  • 汇编-Lea将内存地址加载到寄存器
     它的功能主要是将一个有效地址加载到寄存器中,让程序通过寄存器来访问相应的内存地址 lea指令的应用场景在汇编语言中,lea指令应用广泛,它通常用来完成以下几个任务:1.计算地址偏移量:当程序需要访问数组、结构体等数据结构中的某个元素时,我们可以使用lea指令来计算该元素相对......
  • 如何在vscode环境下使用arduino?
    如何在vscode环境下使用arduino?下载Arduino软件在Arduino官网下载最新的Arduino软件(2.0版本以上)。在下载Arduino之后,电脑中会出现两个非常重要的文件夹:C:\Users\用户名\Documents\Arduino这个文件夹中会存放你安装的一些第三方库的文件等。C:\Users\用户名\AppData\Loca......
  • 寄存器分类
    寄存器分类通用寄存器(两个八位寄存器)AX(可分为)AL和AH是作为一个独立的8位寄存器来使用的,和AH没有关系,CPU在执行指令时不会将进位存储在AH中但是,如果执行addax,93H时会将进位存储到AH中(保证程序兼容性)AHAL(低位)BXBHBLCXCHCLDXDHDL......
  • 实用!Arduino平台最强大的“显卡”驱动:Adafruit GFX 图形库8000字详细使用指南
    实用!Arduino平台最强大的“显卡”驱动:AdafruitGFX图形库8000字详细使用指南光锥之外​昆明尚禾农业科技有限公司副总经理​关注他  概述Arduino的Adafruit_GFX库为我们所有的LCD和OLED显示屏提供了通用语法和图形功能集。这使得Arduino示例程序可......
  • 了解 ESP32 FreeRTOS:初学者指南
    原文:https://www.cnblogs.com/intomcu/p/17297020.html了解ESP32FreeRTOS:初学者指南ESP32FreeRTOS是什么?如何使用FreeRTOS?哪些常用的函数?xTaskCreate()vTaskDelete()vTaskDelay()xTicksToDelay()xSemaphoreCreateBinary()xSemaphoreGive()xSemaphore:要释放的信......
  • arduino基础语法
     ***通信***上位机与下位机通信管道Serial.begin(57600)设置波特率(通信速率)下位机-------->上位机Serial.print();//打印函数Serial.println();//换行打印函数上位机-------->下位机Serial.available();//获取传输的字节数 Serial.read();//一次读取一个字节**......
  • 学习ESP32——使用SquareLine_Studio自定义一个UI界面学习ESP32——使用SquareLine_St
    原文:https://blog.csdn.net/Jeremyrev/article/details/131854181打开SquareLine_Studio软件,先生成一个项目,这里我选择乐鑫官方的板子 选择File→ProjectSettings选择导出的地址,点击APPLYCHANGES 完成后,先下载字体和图标进入阿里矢量图标官网   注册登录之后点......