1. 程式人生 > 其它 >32 引腳_ESP32DEVKIT V1引腳(刨根問底版)

32 引腳_ESP32DEVKIT V1引腳(刨根問底版)

技術標籤:32 引腳

ffd1dc3d-b63a-eb11-8da9-e4434bdf6706.png

00d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

裸機晶片的引腳,可以直接使用

01d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

我們下載一份ESP32 Arduino core

02d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

我這裡開發板是這個,選擇

03d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

縮排起來的樣子05d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

裡面包括這個標頭檔案

06d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

在這個裡面

07d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

我們看一眼內容

09d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

裡面都是大量的巨集定義

0ad2dc3d-b63a-eb11-8da9-e4434bdf6706.png

dint.h是c99中引進的一個標準C庫的標頭檔案.

https://blog.csdn.net/fangwei1235/article/details/6771117

  stdint.h中定義了一些整數型別,規則如下(其中N可以為8,16,32,64)

  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)

  INTN_MIN, UINTN_MIN, INTN_MAX, UINTN_MAX ;  INT_LEASEN_MIN, INT_LEASEN_MAX ;  INT_FASTN_MIN, INT_FASTN_MAX ;

  以上型別的C++型別定義等

  大數輸出:

  int64_t數的輸出:%lld ;  uint64_t數的輸出:%llu ;  uint64_t數十六進位制輸出:%llx ;  uint64_t數八進位制輸出:%llo ;

按照posix標準,一般整型對應的*_t型別為:

1位元組     uint8_t2位元組     uint16_t4位元組     uint32_t8位元組     uint64_t

0bd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

此處是引腳的標頭檔案的一開始的內容

0dd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

這個地方的這段程式碼,在每一種開發板上面都有.

0fd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

這個地方的定義,有點像傳統的Arduino裡面的int led = 13

10d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

這裡是三個通用的傳輸介面,串列埠,I2C,SPI

12d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

數字介面

13d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

Timer介面

15d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

DAC的介面

16d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

多次出現uint8_t型別

18d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

這個地方是定義所在

unsigned char沒有符號位,因此能表示0~255,這個好理解,8個bit,最多256種情況,因此無論如何都能表示256個數字。

在實際使用過程種有什麼區別呢?

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不會進行“符號擴充套件”,這個我不知道是不是對的。

c++算術運算和位運算中型別轉換和型別提升規則和方法
#includeusing 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;//127cout<short  unsigned uch3 = 0;  unsigned uch4 = 255;  cout << (short int)uch3 << endl;//0cout<short  char a = -0x80;  short int b = 0x7f80;shortintresult=a&b;//0111111110000000cout<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

1cd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

這個叫做巨集內嵌入表示式,寫法上面值得商榷


在gun c中,用括號將符合語句的括起來形成了表示式,在一個表示式使用迴圈,跳轉和區域性變數.

1dd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

對這裡的寫法迷惑不解,尋找一下根源

1ed2dc3d-b63a-eb11-8da9-e4434bdf6706.png

就是這個引腳的配置選項,以上的選項出現在所有的引腳配置檔案內

1fd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

我們換個名字進行搜尋,看第一個

20d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

開啟以後,看寫的名字是esp32 hal邏輯層(gpio部分)。c檔案

先不看具體實現,先看看標頭檔案

22d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

標頭檔案的框架

24d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

開始看,是不是看見這些Arduino的巨集定義了。我簡單的寫了一些註釋

26d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

中斷模式,中斷使能是什麼的。都在這裡了,以後具體的再來分析

28d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

這個是一個esp32 gpio 轉換矩陣的結構體。具體的暫存器,有格600多頁的文件,需要看哪個。這個電腦也沒有,我也不講解了

29d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

https://www.espressif.com/zh-hans/support/documents/technical-documents

2ad2dc3d-b63a-eb11-8da9-e4434bdf6706.png

https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_cn.pdf

《ESP32 技術參考手冊》的目標讀者群體是使用 ESP32 晶片的應用開發工程師。本手冊提供了關於 ESP32 的具 體資訊,包括各個功能模組的內部架構、功能描述和暫存器配置等。

2cd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

我們之後會對這個地方詳細的解答

2dd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

一些外設的叫法


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 僅用作輸入管腳,其 他的既可以作為輸入又可以作為輸出管腳。

2ed2dc3d-b63a-eb11-8da9-e4434bdf6706.png

IO_MUX、RTC IO_MUX 和 GPIO 交換矩陣結構框圖

2fd2dc3d-b63a-eb11-8da9-e4434bdf6706.png

31d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

35d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

按鈕的電路圖

36d2dc3d-b63a-eb11-8da9-e4434bdf6706.png

https://github.com/Nicholas3388/LuaNode/tree/master/LuaNode_Esp32

四年前的一個資料,不知道有沒有用

https://github.com/espressif/arduino-esp32/blob/master/variants/doitESP32devkitV1/pins_arduino.h

這個是對應文章裡面的標頭檔案的GitHub地址37d2dc3d-b63a-eb11-8da9-e4434bdf6706.png