Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ESP32DEVKIT V1引脚(刨根问底版)

ESP32DEVKIT V1引脚(刨根问底版)

作者头像
云深无际
发布于 2020-12-15 10:03:27
发布于 2020-12-15 10:03:27
1.5K00
代码可运行
举报
文章被收录于专栏:云深之无迹云深之无迹
运行总次数:0
代码可运行

裸机芯片的引脚,可以直接使用

我们下载一份ESP32 Arduino core

我这里开发板是这个,选择

缩进起来的样子

里面包括这个头文件

在这个里面

我们看一眼内容

里面都是大量的宏定义

dint.h是c99中引进的一个标准C库的头文件.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://blog.csdn.net/fangwei1235/article/details/6771117

  stdint.h中定义了一些整数类型,规则如下(其中N可以为8,16,32,64)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  intN_t, int_leastN_t, int_fastN_t表示长度为N位的整型数;
  uintN_t, uint_leastN_t, uint_fastN_t表示长度为N位的无符号整型数 ;

stdint.h中的常量,定义以上各类型数的最大最小值(其中N可以为8,16,32,64)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  INTN_MIN, UINTN_MIN, INTN_MAX, UINTN_MAX ;
  INT_LEASEN_MIN, INT_LEASEN_MAX ;
  INT_FASTN_MIN, INT_FASTN_MAX ;

  以上类型的C++类型定义等

  大数输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  int64_t数的输出:%lld ;
  uint64_t数的输出:%llu ;
  uint64_t数十六进制输出:%llx ;
  uint64_t数八进制输出:%llo ;

按照posix标准,一般整型对应的*_t类型为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1字节     uint8_t
2字节     uint16_t
4字节     uint32_t
8字节     uint64_t

此处是引脚的头文件的一开始的内容

这个地方的这段代码,在每一种开发板上面都有.

这个地方的定义,有点像传统的Arduino里面的int led = 13

这里是三个通用的传输接口,串口,I2C,SPI

数字接口

Timer接口

DAC的接口

多次出现uint8_t类型

这个地方是定义所在

unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。

在实际使用过程种有什么区别呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html

主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。

但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?

首先我们通常意义上理解,byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。

如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)

而如果是unsigned char,那么不会扩展。

这就是二者的最大区别。

同理可以推导到其它的类型,比如short, unsigned short。等等

unsigned不会进行“符号扩展”,这个我不知道是不是对的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c++算术运算和位运算中类型转换和类型提升规则和方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
 
void main()
{
  /************************************************************************/
  /* 结论:
    Memory中存储的是补码,是根据存入的具体数据的值进行转换为二进制
    后的形式,如果超过该数据类型范围则不知道存的形式是什么了,这个
    应该是编译器相关的,对越界数的处理方式;(无论存入的时候是用什
    么进制表示的,在这里注意+/-单目运算符的作用)
    无论要做什么运算都要先看这个数存入内存是什么样子的;
    类型提升/截断的时候都是对内存中数据的操作,提升的时候就是需要
    进行扩位:对无符号数扩位的时候直接把扩出的位上补零即可(因为unsigned都是正数);有符号
    数进行扩位,则进行符号位扩展(sign extension)如果是整数即原最高位
    是零则补零,如果是负数即原最高位是1则全补1;进行数据截断的时候是
    从低位开始数位数然后截断,这里注意我们使用的一般都是小端机(little Endian)
    
    类型强制转换其实也是对内存中存储的数据的一种呈现方式而已,如:内存
    中是8000的时候(即1000 0000 0000 0000),如果用unsigned short int则打印出
    来的是2的15次方,如果用short int则打印出来是负2的16次方
    
    在进行算术运算和双目的位运算的时候如果操作数数据类型不一致,首先进
    行数据 Arithmetical Conversion类型提升(其实提升就是进行扩位,然后把扩位后的内存二进制代码强制转为某种数据类型之后进行打印),然后    才开始运算
    
    在进行单目位运算的时候,首先进行整型提升,然后开始运算Integer Promotion*/
  /************************************************************************/
  //目的:计算机内部存储形式(无符号数、有符号正数、有符号负数、直接十六进制;及其
  //扩位后规则及其扩位后的存储形式)
  unsigned char uch1 = 0x80; //80
  unsigned char uch2 = 128;  //80  
 
  //注意+/-作为单目运算符的作用和意义,就是让存入内存的时候,最高位写为1
  //同时要注意各个数据类型的表示范围
  char sch1 = -0x7f; //Memory中应该是81
  char sch2 = 0x80; 
  cout << (short int)sch1 << endl;//-127
  cout << (short int)sch2 << endl;//-128
 
  unsigned usch3 = 0x7f;
  unsigned ushc4 = 0x80;
  cout << (short int)usch3 << endl;//127
  cout << (short int)ushc4 << endl;//128
 
  char sch3 = 127;
  char sch4 = -128;
  cout << (short int)sch3 << endl;//127
  cout << (short int)sch4 << endl;//-128
  unsigned uch3 = 0;
  unsigned uch4 = 255;
  cout << (short int)uch3 << endl;//0
  cout << (short int)uch4 << endl;//255
  char a = -0x80;
  short int b = 0x7f80;
  short int result = a&b;//0111 1111 1000 0000
  cout << result <<endl;
}

结论:

Memory中存储的是补码,是根据存入的具体数据的值进行转换为二进制后的形式,如果超过该数据类型范围则不知道存的形式是什么了,这个应该是编译器相关的,对越界数的处理方式;(无论存入的时候是用什么进制表示的,在这里注意+/-单目运算符的作用)无论要做什么运算都要先看这个数存入内存是什么样子的;类型提升/截断的时候都是对内存中数据的操作,提升的时候就是需要进行扩位:对无符号数扩位的时候直接把扩出的位上补零即可(因为unsigned都是正数);有符号数进行扩位,则进行符号位扩展(sign extension)如果是整数即原最高位是零则补零,如果是负数即原最高位是1则全补1;进行数据截断的时候是从低位开始数位数然后截断,这里注意我们使用的一般都是小端机(little Endian)类型强制转换其实也是对内存中存储的数据的一种呈现方式而已,如:内存中是8000的时候(即1000 0000 0000 0000),如果用unsigned short int则打印出来的是2的15次方,如果用short int则打印出来是负2的16次方在进行算术运算和双目的位运算的时候如果操作数数据类型不一致,首先进行数据 Arithmetical Conversion类型提升(其实提升就是进行扩位,然后把扩位后的内存二进制代码强制转为某种数据类型之后进行打印),然后 才开始运算在进行单目位运算的时候,首先进行整型提升,然后开始运算Integer Promotion

这个叫做宏内嵌入表达式,写法上面值得商榷


在gun c中,用括号将符合语句的括起来形成了表达式,在一个表达式使用循环,跳转和局部变量.

对这里的写法迷惑不解,寻找一下根源

就是这个引脚的配置选项,以上的选项出现在所有的引脚配置文件内

我们换个名字进行搜索,看第一个

打开以后,看写的名字是esp32 hal逻辑层(gpio部分)。c文件

先不看具体实现,先看看头文件

头文件的框架

开始看,是不是看见这些Arduino的宏定义了。我简单的写了一些注释

中断模式,中断使能是什么的。都在这里了,以后具体的再来分析

这个是一个esp32 gpio 转换矩阵的结构体。具体的寄存器,有格600多页的文档,需要看哪个。这个电脑也没有,我也不讲解了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.espressif.com/zh-hans/support/documents/technical-documents
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_cn.pdf

《ESP32 技术参考手册》的目标读者群体是使用 ESP32 芯片的应用开发工程师。本手册提供了关于 ESP32 的具 体信息,包括各个功能模块的内部架构、功能描述和寄存器配置等。

我们之后会对这个地方详细的解答

一些外设的叫法


ESP32 芯片有 34 个物理 GPIO pad。

每个 pad 都可用作一个通用 IO,或连接一个内部的外设信号。

IO_MUX、RTC IO_MUX 和 GPIO 交换矩阵用于将信号从外设传输至 GPIO pad。

这些模块共同组成了芯片的 IO 控制。

注意:

这 34 个物理 GPIO pad 的序列号为:

0-19, 21-23, 25-27, 32-39。

其中 GPIO 34-39 仅用作输入管脚,其 他的既可以作为输入又可以作为输出管脚。

IO_MUX、RTC IO_MUX 和 GPIO 交换矩阵结构框图

按钮的电路图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/Nicholas3388/LuaNode/tree/master/LuaNode_Esp32

四年前的一个资料,不知道有没有用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/espressif/arduino-esp32/blob/master/variants/doitESP32devkitV1/pins_arduino.h

这个是对应文章里面的头文件的GitHub地址

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VsCode设置ESP32工具链+刨根问底点灯
ESP-IDF扩展使您可以轻松开发,构建,刷新,监视和调试ESP-IDF代码,其中一些功能包括:
云深无际
2021/01/20
4.1K0
VsCode设置ESP32工具链+刨根问底点灯
代码质量分析-整数处理问题
问:C语言中的uint8_t\uint_16_t\uint32_t\uint64_t是什么?
Cloudox
2022/08/07
1.2K0
启明云端分享:ESP32C3简单IO及串口小贴士
io_conf.intr_type = GPIO_INTR_DISABLE; //禁用中断
启明云端
2021/09/06
1.2K0
c++中按位取反_取反和按位取反
转载于:https://www.cnblogs.com/xrcun/archive/2012/12/01/2797061.html
全栈程序员站长
2022/09/21
1.7K0
萌新不看会后悔的C++基本类型总结(一)
c++的基本类型包括char,short,int,long,lang lang(C++新增的),double,float,bool,其中除了double,folat两种浮点数类型之外都有有符号和无符号两种类型,也就是说一共12种基本类型,至于为什么浮点数没有无符号类型,后面会说。
花狗Fdog
2020/10/28
1.7K0
萌新不看会后悔的C++基本类型总结(一)
【☠️️社死现场の老板来了☠️️】小伙,搞C语言嵌入式开发这么久了,还不知道u8、u16、u32、s8、s16、s32是什么意思啊?
糖糖小伙,你搞C语言嵌入式开发这么久了,我来考考你u8、u16、u32、s8、s16、s32是什么意思啊?你要是回答的让我满意了,给你升职加薪,从此走上人生巅峰呦~
全栈程序员站长
2022/11/03
5.1K0
【☠️️社死现场の老板来了☠️️】小伙,搞C语言嵌入式开发这么久了,还不知道u8、u16、u32、s8、s16、s32是什么意思啊?
Java移位运算符
移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。   在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。 三种移位运算符的移动规则和使用如下所示: <<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。 语法格式:   需要移位的数字 << 移位的次数   例如: 3 << 2,则是将数字3左移2位 计算过程:   3 << 2   首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12.数学意义:   在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。 >>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1. 语法格式:   需要移位的数字 >> 移位的次数   例如11 >> 2,则是将数字11右移2位 计算过程:11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010.转换为十进制是3.数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。 >>>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。   其他结构和>>相似。   小结   二进制运算符,包括位运算符和移位运算符,使程序员可以在二进制基础上操作数字,可以更有效的进行运算,并且可以以二进制的形式存储和转换数据,是实现网络协议解析以及加密等算法的基础。 实例操作:   public class URShift {   public static void main(String[] args) {   int i = -1;   i >>>= 10;   //System.out.println(i);   mTest();   }   public static void mTest(){   //左移   int i = 12; //二进制为:0000000000000000000000000001100   i <<= 2; //i左移2位,把高位的两位数字(左侧开始)抛弃,低位的空位补0,二进制码就为0000000000000000000000000110000   System.out.println(i); //二进制110000值为48;   System.out.println("<br>");   //右移   i >>=2; //i右移2为,把低位的两个数字(右侧开始)抛弃,高位整数补0,负数补1,二进制码就为0000000000000000000000000001100   System.out.println(i); //二进制码为1100值为12   System.out.println("<br>");   //右移example   int j = 11;//二进制码为00000000000000000000000000001011   j >>= 2; //右移两位,抛弃最后两位,整数补0,二进制码为:00000000000000000000000000000010   System.out.println(j); //二进制码为10值为2   System.out.println("<br>");   byte k = -2; //转为int,二进制码为:0000000000000000000000000000010   k >>= 2; //右移2位,抛弃最后2位,负数补1,二进制吗为:11000000000000000000000000000   System.out.println(j); //二进制吗为11值为2   }   }   在Thinking in Java第三章中的一段话:   移位运算符面向的运算对象也是   二进制
大道七哥
2019/09/10
1.6K0
Java中的位运算
在阅读原码的过程中会看到大量的>>, <<, ^, &, |等运算操作符,我们必须先明白这些运算符的意思才能继续读原码。当然,这些都属于基础知识,基本都学过,这里也就属于复习一下。
科技新语
2024/12/31
1470
Java中的位运算
机器人控制器编程实践指导书旧版-实践一 LED灯(数字量)
适用于UNO/2560/DUE/ESP8266/ESP32,2021年之前使用版本。
zhangrelay
2022/08/10
1.2K0
机器人控制器编程实践指导书旧版-实践一 LED灯(数字量)
Arduino1.8.13+ESP32初体验
设备就是个surface pro3 ,也没有安装arduino所以就连安装的过程也写一下
云深无际
2020/11/19
2.5K0
Arduino1.8.13+ESP32初体验
ESP32 DEVKILTv1(devkitv1)开发板全解析!!!(搭载芯片为ESP32D0WDQ6)
平时去淘宝买ESP32的开发板,20出头大概率是这个板子,那我们这篇就来完完整整的将芯片进行挖掘,解决我们的引脚配置,硬件设置等等相关的问题,以后不再纠缠相关的问题.
云深无际
2021/07/23
16.9K5
ESP32 DEVKILTv1(devkitv1)开发板全解析!!!(搭载芯片为ESP32D0WDQ6)
unsigned int数据范围16位_unsigned int几个字节
提到unsigned,大家应该都了解,有朋友问c语言中unsigned什么意思,还有人想问c语言中的unsigned是什么意思,这到底是咋回事?事实上unsigned呢,下面是小编推荐给大家的unsigned int,下面我们一起来看看吧!
全栈程序员站长
2022/11/05
6.7K0
unsigned int数据范围16位_unsigned int几个字节
ESP32与ROS调试笔记(Linux和Windows)
其实很简单,和esp8266类似,只用arduino自带的ros包即可,注意版本号0.7.8。
zhangrelay
2021/03/03
9670
【C数据(一)】数据类型和变量你真的理解了吗?来看看这篇
C语⾔其实原来并没有为布尔值单独设置⼀个类型,⽽是使⽤整数0在 表示假,非零表示真。在C99中也引⼊了布尔类型,是专⻔表⽰真假的。 布尔类型的使⽤得包含头⽂件 <stdbool.h> 布尔类型变量的取值是:true或者false.
学习起来吧
2024/02/29
1.4K0
【C数据(一)】数据类型和变量你真的理解了吗?来看看这篇
C++处理数据
这部分主要讲C++++中的数据类型及其变体 前面也没用这方面的笔记,刚好趁着C++再复习一次 我们申明变量 int age; age = 15;语句告诉程序正在存储整数,程序找到一块能够存储整数的内存,将内存单元标记为age,然后把5拷贝到这个内存单元。
用户7272142
2023/10/11
3120
C++处理数据
【C语言进阶】——深入剖析数据在内存中的存储
每一种数据类型的大小不同,这也就决定了它所存储的数据范围也就不同,就比如char和int所存储的数据范围就不同,那么具体能存储多少呢?相信大家看完本本章内容,就能对每一种数据是怎么存储在内存中的,就会有了更加深刻的认识。
诺诺的包包
2023/02/17
9140
【C语言进阶】——深入剖析数据在内存中的存储
江哥带你玩转C语言 | 09 - C语言进制和位运算
00011 0x001 0x7h4 10.98 0986 .089-109 +178 0b325 0b0010 0xffdc 96f 96.0f 96.oF -.003
极客江南
2021/07/11
1.5K0
Dji TT扩展件与TT使用USB端串口通讯.上
HardwareSerial类在声明对象时接收一个输入参数(0、1、2),分别代表
云深无际
2021/04/14
1.3K0
Dji TT扩展件与TT使用USB端串口通讯.上
可能是最通俗易懂的 Java 位操作运算讲解
Java 位操作这是一项很基础很基础的知识内容,在所有 Android 和 Java 开发者的学习之路上,大家都接触过,但是实际运用的场景却很少见,很多人估计都忘记有这个知识点了。事实上,在 C/C++ 开发领域因为与硬件的联系更紧密,所以位操作运算应用的更普遍。Java 因为面向对象的特性很多时候不需要接触位操作,但是在某些特定场景下,巧妙运用位操作,能够起到非常高效的的表现。这篇博文不谈应用,只详细讲解与位操作有关的知识点。
Frank909
2019/01/14
1.1K0
C语言之数据存储
1.这里需要提醒大家的就是其实char也是整形家族的,因为char类型在内存中是以ASCII码值存储的。
始终学不会
2023/03/28
1.6K0
C语言之数据存储
推荐阅读
相关推荐
VsCode设置ESP32工具链+刨根问底点灯
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验