第三章 ESP32-S3基礎(chǔ)知識(shí)
在本章中殷绍,我們將深入探索ESP32-S3這款備受矚目的微控制器。我們將詳細(xì)闡述其定義糯崎、核心資源、功能應(yīng)用河泳,以及如何選擇適合您項(xiàng)目的ESP32-S3型號(hào)沃呢。通過(guò)本章的學(xué)習(xí),您將全面了解ESP32-S3拆挥,為您的物聯(lián)網(wǎng)項(xiàng)目選擇合適的硬件平臺(tái)奠定堅(jiān)實(shí)基礎(chǔ)薄霜。
本章分為如下幾個(gè)小節(jié):
3.1 為什么選擇ESP32-S3
3.2初識(shí)ESP32-S3
3.3 ESP32-S3資源簡(jiǎn)介
3.4 S3系列型號(hào)對(duì)比
3.5 ESP32-S3功能概述
3.6 ESP32-S3啟動(dòng)例程
3.1 為什么選擇ESP32-S3
在研發(fā)之初,作者也對(duì)比過(guò)樂鑫官方推出的幾款MCU系列纸兔,經(jīng)過(guò)它們各自的功能及應(yīng)用場(chǎng)景來(lái)分析惰瓜,最終作者選擇S系列的S3型號(hào)。
下面汉矿,作者比較一下樂鑫推出的芯片有哪些特點(diǎn):
在上述表格中鸵熟,我們可以看到樂鑫推出的各系列MCU在硬件方面存在一些差異。下面我將繼續(xù)分析這些差異及其對(duì)應(yīng)用場(chǎng)景的影響负甸。
1流强,在內(nèi)核數(shù)量方面:S系列和ESP32系列支持單核和雙核處理器,而C系列和H系列僅支持單核處理器呻待。這意味著S系列和ESP32系列在處理多任務(wù)和高強(qiáng)度計(jì)算方面具有更強(qiáng)的性能打月。對(duì)于需要高效能、多任務(wù)處理的應(yīng)用場(chǎng)景蚕捉,如復(fù)雜算法處理奏篙、大數(shù)據(jù)分析等,S系列和ESP32系列可能更合適迫淹。
2秘通,在時(shí)鐘頻率方面,S系列和ESP32系列的時(shí)鐘頻率范圍為80~240MHz敛熬,而C系列和H系列的時(shí)鐘頻率分別為120MHz和96MHz肺稀。較高的時(shí)鐘頻率意味著更快的處理速度和更高的性能。對(duì)于需要高速處理的應(yīng)用場(chǎng)景应民,如實(shí)時(shí)信號(hào)處理话原、高速數(shù)據(jù)采集等,S系列和ESP32系列可能更合適诲锹。
3繁仁,在引出編程IO方面,S系列和ESP32系列的引出編程IO數(shù)量較多归园,而C系列和H系列的引出編程IO數(shù)量較少黄虱。這表明S系列和ESP32系列在編程接口的多樣性和靈活性方面具有優(yōu)勢(shì)。對(duì)于需要連接多種外設(shè)和傳感器的應(yīng)用場(chǎng)景庸诱,S系列和ESP32系列可能更合適捻浦。
4盐捷,在神經(jīng)網(wǎng)絡(luò)加速方面,只有S系列支持神經(jīng)網(wǎng)絡(luò)加速功能默勾。這意味著選擇S系列可以更好地滿足深度學(xué)習(xí)碉渡、圖像識(shí)別等應(yīng)用場(chǎng)景的需求。對(duì)于需要加速神經(jīng)網(wǎng)絡(luò)運(yùn)算的應(yīng)用場(chǎng)景母剥,如智能家居控制滞诺、智能安防等,S系列可能更合適环疼。
5习霹,在通信協(xié)議方面,所有系列都支持2.4G Wi-Fi和藍(lán)牙(BLE)炫隶,這意味著它們?cè)跓o(wú)線通信方面具有良好的兼容性淋叶。
6,在存儲(chǔ)器方面伪阶,各系列MCU的SRAM和ROM大小有所不同煞檩。較大的存儲(chǔ)器可以提供更多的程序運(yùn)行空間和數(shù)據(jù)存儲(chǔ)空間,以滿足更復(fù)雜的應(yīng)用需求栅贴。對(duì)于需要處理大量數(shù)據(jù)和運(yùn)行復(fù)雜程序的應(yīng)用場(chǎng)景斟湃,如物聯(lián)網(wǎng)網(wǎng)關(guān)、智能儀表等檐薯,S系列和ESP32系列可能更合適凝赛。
綜上所述,樂鑫推出的各系列MCU在硬件方面各有特點(diǎn)坛缕,選擇哪個(gè)系列取決于具體的應(yīng)用場(chǎng)景和需求墓猎。對(duì)于需要高性能、多核處理和神經(jīng)網(wǎng)絡(luò)加速的應(yīng)用場(chǎng)景赚楚,S系列可能是更好的選擇毙沾;而對(duì)于簡(jiǎn)單的物聯(lián)網(wǎng)應(yīng)用場(chǎng)景,C系列或H系列可能更合適直晨。
正點(diǎn)原子選擇S系列的S3型號(hào)作為開發(fā)板的核心芯片搀军,是為了讀者提供更好的學(xué)習(xí)資源和開發(fā)體驗(yàn)膨俐,幫助讀者更好地掌握物聯(lián)網(wǎng)和嵌入式開發(fā)的相關(guān)技術(shù)勇皇。
另外,樂鑫科技還提供了一個(gè)在線選型工具(https://products.espressif.com/#/product-selector?language=zh)焚刺,名為ESP Product Selector敛摘。它可以幫助用戶全面了解樂鑫產(chǎn)品與方案、提高產(chǎn)品選型和開發(fā)效率乳愉,如下圖所示兄淫。
上圖①顯示了篩選工具的選擇屯远,左邊是產(chǎn)品選型,右邊是產(chǎn)品對(duì)比捕虽。上圖②表示產(chǎn)品選型的功能篩選慨丐,主要根據(jù)客戶的需求來(lái)選擇,例如工作溫度泄私、單/雙核房揭、是否具備天線等條件,來(lái)選擇自己心儀的芯片/模組或者開發(fā)板晌端。上圖③表示功能篩選之后的結(jié)果選擇捅暴,例如芯片/模組或者滿足條件的開發(fā)板。最后咧纠,上圖④表示篩選的結(jié)果蓬痒,如果篩選結(jié)果是芯片/模組,那么它就會(huì)顯示符合篩選的芯片型號(hào)或者模組漆羔。
3.2 初識(shí)ESP32-S3
ESP32-S3是一款由樂鑫公司開發(fā)的物聯(lián)網(wǎng)芯片梧奢,它具有一些非常獨(dú)特的功能和特點(diǎn)。下圖為芯片的功能框圖演痒。
結(jié)合《esp32-s3_datasheet_cn.pdf》數(shù)據(jù)手冊(cè)和上圖的內(nèi)容粹断,簡(jiǎn)單歸納5個(gè)內(nèi)容。
1嫡霞,架構(gòu)和性能:ESP32-S3采用Xtensa? LX7 CPU瓶埋,這是一個(gè)哈佛結(jié)構(gòu)的雙核系統(tǒng)。它具有獨(dú)立的指令總線和數(shù)據(jù)總線诊沪,所有的內(nèi)部存儲(chǔ)器养筒、外部存儲(chǔ)器以及外設(shè)都分布在這兩條總線上。這種架構(gòu)使得CPU可以同時(shí)讀取指令和數(shù)據(jù)端姚,從而提高了處理速度晕粪。
2,存儲(chǔ):ESP32-S3具有豐富的存儲(chǔ)空間渐裸。它內(nèi)部有384 KB的內(nèi)部ROM巫湘,512 KB的內(nèi)部SRAM,以及8 KB的RTC快速存儲(chǔ)器和8 KB的RTC慢速存儲(chǔ)器昏鹃。此外尚氛,它還支持最大1 GB的片外FLASH和最大1 GB的片外RAM。
3洞渤,外設(shè):ESP32-S3具有許多外設(shè)阅嘶,總計(jì)有45個(gè)模塊/外設(shè)。其中11個(gè)具有GDMA(Generic DMA)功能,可以用來(lái)進(jìn)行數(shù)據(jù)塊的傳輸讯柔,減輕CPU的負(fù)擔(dān)抡蛙,提高整體性能。
4魂迄,通信:ESP32-S3同時(shí)支持WIFI和藍(lán)牙功能粗截,應(yīng)用領(lǐng)域貫穿移動(dòng)設(shè)備、可穿戴電子設(shè)備捣炬、智能家居等慈格。在2.4GHz頻帶支持20MHz和40MHz頻寬。
5遥金,向量指令:ESP32-S3增加了用于加速神經(jīng)網(wǎng)絡(luò)計(jì)算和信號(hào)處理等工作的向量指令浴捆。這些向量指令可以大大提高芯片在AI方面的計(jì)算速度和效率。
ESP32-S3是一款功能強(qiáng)大稿械、性能豐富的物聯(lián)網(wǎng)芯片选泻,適用于各種物聯(lián)網(wǎng)應(yīng)用場(chǎng)景。以上信息僅供參考美莫,如需了解更多信息页眯,請(qǐng)?jiān)L問(wèn)樂鑫公司官網(wǎng)查詢相關(guān)資料。
3.3 ESP32-S3資源簡(jiǎn)介
下面來(lái)看看ESP32-S3具體的內(nèi)部資源厢呵,如下表所示窝撵。
由表可知,ESP32內(nèi)部資源還是非常豐富的襟铭,本書將針對(duì)這些資源進(jìn)行詳細(xì)的使用介紹碌奉,并提供豐富的例程,供大家參考學(xué)習(xí)寒砖,相信經(jīng)過(guò)本書的學(xué)習(xí)赐劣,您會(huì)對(duì)ESP32-S3系列芯片有一個(gè)全面的了解和掌握。
關(guān)于ESP32-S3內(nèi)部資源的詳細(xì)介紹哩都,請(qǐng)大家參考“光盤àA 盤à7魁兼,硬件資料à2,芯片資料àesp32-s3_technical_reference_manual_cn.pdf”漠嵌,該文檔即《ESP32-S3的技術(shù)手冊(cè)》咐汞,里面有 ESP32-S3詳細(xì)的資源說(shuō)明和相關(guān)性能參數(shù)。
3.4 S3系列型號(hào)對(duì)比
樂鑫S3系列型號(hào)包括ESP32-S3儒鹿、ESP32-S3R2化撕、ESP32-S3R8和ESP32-S3FN8等。這些型號(hào)在硬件配置挺身、功能和應(yīng)用場(chǎng)景方面略有不同侯谁。不同型號(hào)的MCU都有不同的應(yīng)用場(chǎng)景,下面我們來(lái)看一下這些型號(hào)的命名規(guī)則章钾,如下圖所示墙贱。
從上圖可以看到,F(xiàn)表示內(nèi)置FLASH贱傀;H/N表示FLASH溫度(H:高溫惨撇,N:常溫);x表示內(nèi)置FLASH大懈(MB)魁衙;R表示內(nèi)置PSRAM;x表示內(nèi)置PSRAM大兄晟Α(MB)剖淀;V表示僅支持外部1.8v spi flash。為了讓讀者更清晰了解ESP32-S3命名規(guī)則纤房,這里作者以ESP32-S3FH4R2這一款芯片為例纵隔,繪畫一副清晰的命名示意圖,如下圖所示炮姨。
根據(jù)上述兩張圖的分析捌刮,我們可以了解到樂鑫S3系列的命名規(guī)則和特點(diǎn)。除了S3系列的芯片之外舒岸,樂鑫還推出了S3系列的模組绅作,它是S3系列芯片的簡(jiǎn)易系統(tǒng)。
樂鑫S3系列模組是基于S3系列芯片的子系統(tǒng)蛾派,它已經(jīng)設(shè)計(jì)好了外圍電路俄认,簡(jiǎn)化了開發(fā)過(guò)程,讓開發(fā)者可以更快速地使用S3系列芯片進(jìn)行開發(fā)洪乍。通過(guò)使用S3系列模組梭依,開發(fā)者可以更容易地實(shí)現(xiàn)特定功能,縮短開發(fā)周期典尾,提高開發(fā)效率役拴。
樂鑫推出了ESP32-S3-WROOM-1和ESP32-S3-WROOM-1U兩款通用型Wi-Fi+低功耗藍(lán)牙MCU模組,如下圖所示钾埂,它們搭載ESP32-S3系列芯片河闰。除具有豐富的外設(shè)接口外,模組還擁有強(qiáng)大的神經(jīng)網(wǎng)絡(luò)運(yùn)算能力和信號(hào)處理能力褥紫,適用于AIoT領(lǐng)域的多種應(yīng)用場(chǎng)景姜性,例如喚醒詞檢測(cè)和語(yǔ)音命令識(shí)別、人臉檢測(cè)和識(shí)別髓考、智能家居部念、智能家電、智能控制面板、智能揚(yáng)聲器等儡炼。
從上圖可知妓湘,ESP32-S3-WROOM-1采用PCB板載天線,而ESP32-S3-WROOM-1U采用連接器連接外部天線乌询。兩款模組均有多種芯片型號(hào)可供選擇榜贴,具體見下表所示:
根據(jù)上表,可以看出這兩款模組的主控芯片是ESP32-S3和ESP32-S3Rx妹田,它們都屬于樂鑫的ESP32-S3系列芯片唬党。之前作者已經(jīng)詳細(xì)講解了ESP32-S3系列芯片的命令規(guī)則,可以得出這兩款通用模組都是外接Flash存儲(chǔ)器鬼佣,并且內(nèi)置有PSRAM(主控芯片ESP32-S3沒有內(nèi)置PSRAM)驶拱。下面我們以ESP32-S3-WROOM-1-N16R8模組為例,來(lái)講解模組的命名規(guī)則晶衷,如下圖所示蓝纲。
通過(guò)了解模組內(nèi)置的主控芯片類型,開發(fā)者可以更好地理解該模組的功能和特點(diǎn)房铭,并根據(jù)需要進(jìn)行相應(yīng)的開發(fā)和應(yīng)用驻龟。正點(diǎn)原子ESP32-S3開發(fā)板是以ESP32-S3-WROOM-1-N16R8模組作為主控,它可以提供穩(wěn)定的控制系統(tǒng)和高效的數(shù)據(jù)處理能力缸匪,同時(shí)引出的IO可以滿足各種應(yīng)用需求翁狐。
3.5 ESP32-S3功能概述
3.5.1 系統(tǒng)和存儲(chǔ)
ESP32-S3采用哈佛結(jié)構(gòu)Xtensa? LX7 CPU構(gòu)成雙核系統(tǒng)。所有的內(nèi)部存儲(chǔ)器凌蔬、外部存儲(chǔ)器以及外設(shè)都分布在CPU 的總線上露懒。
以下是ESP32-S3的主要特性:
1,地址空間:ESP32-S3 擁有豐富的地址空間砂心,包括內(nèi)部存儲(chǔ)器指令地址空間懈词、內(nèi)部存儲(chǔ)器數(shù)據(jù)地址空間、外設(shè)地址空間、外部存儲(chǔ)器指令虛地址空間、外部存儲(chǔ)器數(shù)據(jù)虛地址空間露该、內(nèi)部DMA地址空間和外部DMA地址空間。這些地址空間為芯片的各個(gè)部分提供了獨(dú)立的存儲(chǔ)空間抠忘。
2,內(nèi)部存儲(chǔ)器:ESP32-S3內(nèi)部存儲(chǔ)器包括384 KB的內(nèi)部ROM外永、512 KB的內(nèi)部SRAM崎脉、8 KB的RTC快速存儲(chǔ)器和 8 KB 的 RTC 慢速存儲(chǔ)器。這些存儲(chǔ)器為芯片提供了存儲(chǔ)和讀取數(shù)據(jù)的能力伯顶。
3囚灼,外部存儲(chǔ)器:ESP32-S3支持最大1 GB的片外flash和最大1 GB 的片外 RAM骆膝。這些外部存儲(chǔ)器可以用來(lái)存儲(chǔ)大量的程序代碼和數(shù)據(jù),以滿足復(fù)雜應(yīng)用的需求灶体。
4阅签,外設(shè)空間:ESP32-S3總計(jì)有45個(gè)模塊/外設(shè),這些外設(shè)為芯片提供了豐富的輸入輸出接口和特殊功能赃春。
5愉择,GDMA(Generic DMA):ESP32-S3具有11個(gè)具有GDMA功能的模塊/外設(shè)劫乱,這些 GDMA 外設(shè)可以用來(lái)進(jìn)行數(shù)據(jù)塊的傳輸织中,從而減輕CPU的負(fù)擔(dān),提高整體性能衷戈。
下圖是ESP32-S3地址空間映射結(jié)構(gòu)圖狭吼,闡述了內(nèi)部存儲(chǔ)器地址空間映射、外部存儲(chǔ)器地址空間映射和模塊/外設(shè)地址映射的系統(tǒng)結(jié)構(gòu)圖殖妇,以及GDMA與各部分的聯(lián)系示意圖刁笙。
上圖中,灰色背景的地址空間不可用谦趣,紅色五角星表示對(duì)應(yīng)存儲(chǔ)器和外設(shè)可以被協(xié)調(diào)器訪問(wèn)疲吸。由于ESP32-S3系統(tǒng)是由兩個(gè)哈佛結(jié)構(gòu)Xtensa? LX7 CPU構(gòu)成,這兩個(gè)CPU能夠訪問(wèn)的地址空間范圍是完全一致的前鹅。上圖中摘悴,地址0x40000000以下部分屬于數(shù)據(jù)總線的地址范圍;地址0x40000000~4FFFFFFF部分位指令總線的地址范圍舰绘,其他是數(shù)據(jù)總線與指令總線的地址范圍蹂喻,即內(nèi)部存儲(chǔ)器、外部存儲(chǔ)器和外設(shè)等映射的內(nèi)存地址捂寿。
CPU的數(shù)據(jù)總線與指令總線都為小端序(將多字節(jié)數(shù)據(jù)的低位放在較小的地址處口四,高位放在較大的地址處)。CPU可以通過(guò)數(shù)據(jù)總線進(jìn)行單字節(jié)秦陋、雙字節(jié)蔓彩、4字節(jié)、16字節(jié)的數(shù)據(jù)訪問(wèn)驳概。CPU也可以通過(guò)指令總線進(jìn)行數(shù)據(jù)訪問(wèn)赤嚼,但必須是4字節(jié)對(duì)齊方式;非對(duì)齊數(shù)據(jù)訪問(wèn)會(huì)導(dǎo)致CPU工作異常抡句。CPU的工作如下:
①? ? 通過(guò)數(shù)據(jù)總線與指令總線直接訪問(wèn)內(nèi)部存儲(chǔ)器探膊。
②? ? 通過(guò)Cache直接訪問(wèn)映射到地址空間的外部存儲(chǔ)器。
③? ? 通過(guò)數(shù)據(jù)總線直接訪問(wèn)模塊/外設(shè)待榔。
系統(tǒng)中部分內(nèi)部存儲(chǔ)器與部分外部存儲(chǔ)器既可以被數(shù)據(jù)總線訪問(wèn)也可以被指令總線訪問(wèn)逞壁,這種情況下流济,CPU可以通過(guò)多個(gè)地址訪問(wèn)到同一目標(biāo)。
3.5.1.1 內(nèi)部存儲(chǔ)器
圖3.5.1中的①腌闯、②绳瘟、④和⑥部分組成ESP32-S3內(nèi)部存儲(chǔ)器。
上圖①:Internal ROM(384KB)是只讀存儲(chǔ)器姿骏、不可編程糖声,用來(lái)存放系統(tǒng)底層的固件(程序指令和一些只讀數(shù)據(jù))。
上圖②:InternalSRAM(512 KB)是易失性存儲(chǔ)器分瘦,可以快速響應(yīng)CPU的訪問(wèn)請(qǐng)求蘸泻,通常只需一個(gè)CPU時(shí)鐘周期。其中嘲玫,SRAM的一部分可以被配置成外部存儲(chǔ)器訪問(wèn)的緩存(Cache)悦施,但這種情況下無(wú)法被CPU訪問(wèn);另外去团,某些部分只可以被CPU的指令總線訪問(wèn)抡诞;某些部分只可以被CPU的數(shù)據(jù)總線訪問(wèn);還有某些部分既可被CPU的指令總線訪問(wèn)土陪,也可被CPU的數(shù)據(jù)總線訪問(wèn)昼汗。
上圖④和⑥:RTCMemory(16 KB)RTC 存儲(chǔ)器以靜態(tài)RAM(SRAM)方式實(shí)現(xiàn),因此也是易失性存儲(chǔ)器鬼雀。但是顷窒,在deep sleep模式下,存放在RTC存儲(chǔ)器中的數(shù)據(jù)不會(huì)丟失取刃。其中蹋肮, RTC FAST memory(8 KB)只可以被 CPU 訪問(wèn),不可以被協(xié)處理器訪問(wèn)璧疗,通常用來(lái)存放一些在 Deep Sleep 模式下仍需保持的程序指令和數(shù)據(jù)坯辩。而RTC SLOW memory (8KB)既可以被CPU訪問(wèn),又可以被協(xié)處理器訪問(wèn)崩侠,因此通常用來(lái)存放一些CPU和協(xié)處理器需要共享的程序指令和數(shù)據(jù)漆魔。
注意:所有的內(nèi)部存儲(chǔ)器都接受權(quán)限管理。只有獲取到訪問(wèn)內(nèi)部存儲(chǔ)器的訪問(wèn)權(quán)限却音,才可以執(zhí)行正常的訪問(wèn)操作改抡,CPU訪問(wèn)內(nèi)部存儲(chǔ)器時(shí)才可以被響應(yīng)。關(guān)于權(quán)限管理的更多信息系瓢,請(qǐng)參考《esp32-s3_technical_reference_manual_cn.pdf》章節(jié) 15 權(quán)限控制(PMS)阿纤。
3.5.1.2 外部存儲(chǔ)器
圖3.5.1中的⑦、⑧和⑨可見夷陋。CPU借助高速緩存(Cache)來(lái)訪問(wèn)外部存儲(chǔ)器欠拾。 Cache 將根據(jù)內(nèi)存管理單元(MMU)中的信息把 CPU指令總線或數(shù)據(jù)總線的地址變換為訪問(wèn)片外flash與片外RAM的實(shí)地址胰锌。經(jīng)過(guò)變換的實(shí)地址所組成的實(shí)地址空間最大支持1 GB 的片外flash與1 GB的片外RAM。前面我們討論知道藐窄,ESP32-S3采用雙核共享ICache 和DCache 結(jié)構(gòu)资昧,以便當(dāng)CPU的指令總線和數(shù)據(jù)總線同時(shí)發(fā)起請(qǐng)求時(shí),也可以迅速響應(yīng)荆忍。當(dāng)雙核同時(shí)訪問(wèn)ICache時(shí)格带,系統(tǒng)會(huì)做以下判斷,如下圖所示刹枉。
當(dāng)兩個(gè)核的指令總線同時(shí)訪問(wèn)ICache/DCache時(shí)叽唱,由仲裁器決定誰(shuí)先獲得訪問(wèn)ICache/DCache的權(quán)限。當(dāng)Cache缺失(處理器所要訪問(wèn)的存儲(chǔ)塊不在高速緩存中的現(xiàn)象)時(shí)嘶卧,Cache控制器會(huì)向外部存儲(chǔ)器發(fā)起請(qǐng)求尔觉,當(dāng)ICache和DCache同時(shí)發(fā)起外部存儲(chǔ)器請(qǐng)求時(shí)凉袱,由仲裁器決定誰(shuí)先獲得外部存儲(chǔ)器的使用權(quán)芥吟。
①:ICache的緩存大小可配置為16 KB或32KB,塊大小可以配置為16B或32B专甩,當(dāng)ICache緩存大小配置為32KB時(shí)禁用16B塊大小模式钟鸵。
②:DCache的緩存大小可配置為32 KB或64 KB,塊大小可以配置為16B涤躲、32B 或64B棺耍,當(dāng)DCache緩存大小配置為64 KB 時(shí)禁用16B 塊大小模式。
返回到圖4.5.1种樱,外部存儲(chǔ)器通過(guò)高速緩存(Cache)蒙袍,ESP32-S3一次最多可以同時(shí)訪問(wèn)32MB的指令總線地址空間和32MB的數(shù)據(jù)總線地址空間。32 MB的指令總線地址空間嫩挤,通過(guò)指令緩存(ICache)以64 KB為單位映射到片外flash或片外RAM害幅,支持 4 字節(jié)對(duì)齊的讀訪問(wèn)或取指訪問(wèn),而32 MB的數(shù)據(jù)總線地址空間岂昭,是通過(guò)數(shù)據(jù)緩存(DCache)以64 KB為單位映射到片外RAM以现,支持單字節(jié)、雙字節(jié)约啊、4字節(jié)邑遏、16字節(jié)的讀寫訪問(wèn)。這部分地址空間也可以用作只讀數(shù)據(jù)空間恰矩,映射到片外 flash 或片外RAM记盒。
下表列出了訪問(wèn)外部存儲(chǔ)器時(shí)CPU的數(shù)據(jù)總線和指令總線與Cache的對(duì)應(yīng)關(guān)系。
同樣外傅,想要操作外部存儲(chǔ)器的讀寫纪吮,需獲取訪問(wèn)權(quán)限蹂午,CPU訪問(wèn)外部存儲(chǔ)器時(shí)才能被響應(yīng)。關(guān)于權(quán)限管理的更多信息彬碱,請(qǐng)參考《esp32-s3_technical_reference_manual_cn.pdf》15權(quán)限控制(PMS)豆胸。
3.5.1.3 模塊/外設(shè)
圖3.5.1中的⑤就是模塊/外設(shè)地址空間地址,CPU就是通過(guò)該空間地址來(lái)訪問(wèn)模塊/外設(shè)的巷疼。下表是模塊/外設(shè)地址空間的各段地址與其能訪問(wèn)到的模塊/外設(shè)映射關(guān)系晚胡。
從上表可以得知,要操作外設(shè)的寄存器嚼沿,首先需要知道該外設(shè)的首地址估盘。然后,我們可以使用一些底層的編程語(yǔ)言骡尽,如C語(yǔ)言或匯編語(yǔ)言遣妥,來(lái)編寫程序以設(shè)置外設(shè)寄存器的值,從而控制外設(shè)的行為攀细。例如箫踩,通過(guò)設(shè)置GPIO寄存器的值,我們可以控制某個(gè)LED燈的亮滅谭贪;同樣地境钟,設(shè)置UART寄存器的值可以用來(lái)發(fā)送和接收數(shù)據(jù)。
與內(nèi)部存儲(chǔ)器和外部存儲(chǔ)器訪問(wèn)類似俭识,CPU要想訪問(wèn)某一個(gè)模塊/外設(shè)慨削,需要先獲取該模塊/外設(shè)的訪問(wèn)權(quán)限,否則訪問(wèn)將不會(huì)被響應(yīng)套媚。關(guān)于權(quán)限管理的更多信息缚态,請(qǐng)參考《esp32-s3_technical_reference_manual_cn.pdf》章節(jié)15權(quán)限控制(PMS)。
3.5.1.4 通用GDMA控制器
通用直接存儲(chǔ)訪問(wèn)(GeneralDirect Memory Access, GDMA)用于在外設(shè)與存儲(chǔ)器之間以及存儲(chǔ)器與存儲(chǔ)器之間提供高速數(shù)據(jù)傳輸軟件可以在無(wú)需任何CPU操作的情況下通過(guò)GDMA快速搬移數(shù)據(jù)堤瘤,從而降低了CPU的工作負(fù)載玫芦,提高了效率。ESP32-S3的GDMA控制器采用AHB總線架構(gòu)宙橱,以字節(jié)為單位進(jìn)行數(shù)據(jù)傳輸姨俩,支持軟件編程控制傳輸數(shù)據(jù)量,支持鏈表傳輸师郑,同時(shí)支持訪問(wèn)內(nèi)部RAM時(shí)的INCR burst傳輸环葵。其能夠訪問(wèn)的最大內(nèi)部RAM地址空間為480 KB,最大外部RAM地址空間為32 MB宝冕。該控制器包含5個(gè)接收通道和5個(gè)發(fā)送通道张遭,每個(gè)通道都可以訪問(wèn)內(nèi)部和外部RAM,并且支持可配置的外設(shè)選擇地梨。最后菊卷,GDMA控制器采用固定優(yōu)先級(jí)及輪詢仲裁機(jī)制來(lái)管理通道間的傳輸缔恳。
正如前文所述,GDMA共有10個(gè)獨(dú)立的通道洁闰,其中包括5個(gè)接收通道和5個(gè)發(fā)送通道歉甚。這10個(gè)通道被支持GDMA功能的外設(shè)所共享,也就是說(shuō)用戶可以將通道分配給任何支持GDMA功能的外設(shè)扑眉。這些外設(shè)包括SPI2纸泄、SPI3、UHCI0腰素、I2S0聘裁、I2S1、LCD/CAM弓千、AES衡便、SHA、ADC和RMT等洋访。根據(jù)圖3.3.1的③所示的連接關(guān)系再一次驗(yàn)證了镣陕,這些外設(shè)都可以使用GDMA傳輸數(shù)據(jù)。此外捌显,每個(gè)GDMA通道都具備訪問(wèn)內(nèi)部RAM或外部RAM的能力茁彭,這使得ESP32-S3在處理復(fù)雜的數(shù)據(jù)傳輸任務(wù)時(shí)具有顯著優(yōu)勢(shì)。
下圖是GDMA功能模塊和GDMA通道示意圖扶歪。
從上圖可知,每一個(gè)外設(shè)都可以使用任意一條通道進(jìn)行數(shù)據(jù)傳輸摄闸。然而善镰,這些通道分為不同的類型。當(dāng)使用GDMA接收數(shù)據(jù)時(shí)年枕,可以選擇任意的RXn通道(n:0~4)炫欺;相反,當(dāng)使用GDMA發(fā)送數(shù)據(jù)時(shí)熏兄,則需要選擇任務(wù)的TXn通道(n:0~4)品洛。這種通道的分類和選擇方式使得數(shù)據(jù)傳輸更加高效和靈活。
ESP32-S3中有11個(gè)外設(shè)/模塊可以和GDMA聯(lián)合工作摩桶,如下圖所示桥状。其中的 11 根豎線依次對(duì)應(yīng)這11個(gè)具有GDMA功能的外設(shè)/模塊,橫線表示GDMA的某一個(gè)通道(可以是任意一個(gè)通道)硝清,豎線與橫線的交點(diǎn)表示對(duì)應(yīng)外設(shè)/模塊可以訪問(wèn)GDMA的某一個(gè)通道辅斟。同一行上有多個(gè)交點(diǎn)則表示這幾個(gè)外設(shè)/模塊不可以同時(shí)開啟GDMA功能。
具有GDMA功能的模塊/外設(shè)通過(guò)GDMA可以訪問(wèn)任何GDMA可以訪問(wèn)到的存儲(chǔ)器芦拿。更多關(guān)于GDMA的信息士飒,請(qǐng)參考《esp32-s3_technical_reference_manual_cn.pdf》章節(jié) 3 通用 DMA 控制器(GDMA)查邢。
與前面小節(jié)一樣,當(dāng)使用GDMA訪問(wèn)任何存儲(chǔ)器時(shí)酵幕,都需要獲取對(duì)應(yīng)的訪問(wèn)權(quán)限扰藕,否則訪問(wèn)將會(huì)失敗。
3.5.2 IO MUX和GPIO交換矩陣
ESP32-S3 芯片有45個(gè)物理通用輸入輸出管腳(GPIOPin)芳撒。每個(gè)管腳都可用作一個(gè)通用輸入輸出实胸,或連接一個(gè)內(nèi)部外設(shè)信號(hào)。利用GPIO交換矩陣番官、IO MUX(IO復(fù)用選擇器)和RTC IO MUX(RTC復(fù)用選擇器)庐完,可配置外設(shè)模塊的輸入信號(hào)來(lái)源于任何的GPIO管腳,并且外設(shè)模塊的輸出信號(hào)也可連接到任意GPIO管腳徘熔。這些模塊共同組成了芯片的輸入輸出控制门躯。值得注意的是,這45個(gè)物理GPIO管腳的編號(hào)為0~21酷师、26~48讶凉。這些管腳即可作為輸入有可作為輸出管腳。正如前文所述山孔,正點(diǎn)原子選擇ESP32-S3-WROOM-1-N16R8模組作為主控懂讯,但由于該模組只有36個(gè)實(shí)際引腳的物理GPIO管腳。這是因?yàn)樵撃=M的Flash和PSRAM使用了八線SPI即Octal SPI模式台颠,這些模式共占用了12個(gè)GPIO管腳褐望。而且,該模組還將IO35串前、IO36瘫里、IO37引出,所以最終的管腳數(shù)量為45-12+3荡碾,即36個(gè)GPIO管腳谨读。
下圖是從《esp32-s3_datasheet_cn.pdf》數(shù)據(jù)手冊(cè)截取下來(lái)的,主要描述Flash和PSRAM使用八線SPI模式下的管腳坛吁。
需要注意的是劳殖,正點(diǎn)原子ESP32-S3開發(fā)板的原理圖并沒有使用IO35-IO37號(hào)管腳,所以不存在共用Falsh和PSRAM管腳拨脉。
下面我們來(lái)看一下這個(gè)模組的實(shí)物圖和引腳分布圖哆姻,如下圖所示。
從上圖可以得知女坑,左邊的圖片是該模組的3D實(shí)物圖填具,而右邊的圖片是該模組的管腳分布圖。雖然這些管腳是無(wú)序的,但它們都可以被復(fù)用為其他功能(除個(gè)別功能外)劳景,例如SPI誉简、串口、IIC等協(xié)議盟广。這是ESP32相比其他MCU的優(yōu)勢(shì)之一闷串,它具有更多的可復(fù)用管腳,可以支持更多的外設(shè)和協(xié)議筋量。
接下來(lái)烹吵,我們來(lái)看一下模組管腳默認(rèn)復(fù)用管腳和管腳功能釋義,如下表所示桨武。
上表是ESP32-S3-WROOM-1-N16R8模組的管腳定義肋拔,下面作者根據(jù)這個(gè)表格來(lái)講解GPIO交互矩陣及IO MUX復(fù)用的知識(shí)。
下圖為GPIO交換矩陣呀酸、IO MUX和RTC IO MUX將信號(hào)引入外設(shè)和引出至管腳的具體過(guò)程凉蜂。
首先性誉,作者說(shuō)明一下上圖帶有顏色線條和標(biāo)簽(Ⅰ窿吩、Ⅱ、Ⅲ错览、Ⅳ)的作用纫雁,紅色線條表示輸出方向;紫色線條代表RTC IO管腳的輸出方向倾哺;黃色線條代表RTCIO管腳輸入方向轧邪;標(biāo)簽代表輸入/輸出分支的節(jié)點(diǎn)。
從上圖可知悼粮,ESP32-S3管腳具有預(yù)設(shè)功能闲勺,即每個(gè)IO管腳直接連接至一組特定的片上外設(shè)。在運(yùn)動(dòng)時(shí)扣猫,可通過(guò)IO MUX和IO矩陣配置連接管腳外設(shè)。從上表4.5.2.1可知翘地,有些IO管腳預(yù)設(shè)了RTC和模擬功能申尤,有些IO管腳預(yù)設(shè)了SPI、IIC等功能衙耕。
上圖右邊兩個(gè)“Pin X supplied by VDD3P3_CPU/RTC”框圖為芯片焊盤 (PAD) 的內(nèi)部結(jié)構(gòu)昧穿,即芯片邏輯與GPIO管腳之間的電氣接口。ESP32-S3的45個(gè)GPIO管腳均采用此結(jié)構(gòu)橙喘,如下圖所示时鸵。
上圖中的IE表示輸入使能;OE表示輸出使能;WPU表示內(nèi)部弱上拉饰潜;WPD表示內(nèi)部弱下拉初坠,它們實(shí)現(xiàn)了芯片封裝內(nèi)晶片與GPIO管腳之間的物理連接。
一彭雾、“Pin X supplied by VDD3P3_CPU”芯片焊盤輸入流程(圖4.5.1.5.3中的綠色線條)
從上圖3.5.2.3可知碟刺,輸入信號(hào)通過(guò)兩條通道(Ⅳ處)到達(dá)輸入信號(hào)終端。第一條通道(①)無(wú)需經(jīng)過(guò)GPIO SYNC模塊的同步處理薯酝,而是通過(guò)IO_MUX_n_REGIO寄存器(該寄存器的IO_MUX_MCU_SEL位作用為信號(hào)選擇IO MUX功能半沽,為0選擇Function 0槐脏,為1選擇Function 1(GPIO)或辖,F(xiàn)unction功能請(qǐng)看《esp32-s3_technical_reference_manual_cn.pdf》章節(jié)6.12 IO MUX管腳功能列表)配置進(jìn)入GPIO交換矩陣,然后輸入信號(hào)進(jìn)入旁路GPIO交換矩陣(GPIO_SIMy_IN_SET)喘漏。另一方面做葵,另一條通道經(jīng)過(guò)GPIO SYNC模塊的同步處理占哟,然后將信號(hào)時(shí)鐘同步APB總線時(shí)鐘,隨后進(jìn)入GPIO交換矩陣蜂挪。在這個(gè)交換矩陣中重挑,通道的開通是由寄存器GPIO_FUNCy_IN_SEL_CFG_REG進(jìn)行配置的。這個(gè)寄存器的描述如下棠涮。
從上圖可知谬哀,GPIO_FUNCy_IN_SEL(其中y為GPIO的管腳號(hào))是外設(shè)輸入信號(hào)控制位。如果GPIO_FUNCy_IN_SEL的值為0x38严肪,則輸入信號(hào)被視為高電平史煎;如果GPIO_FUNCy_IN_SEL的值為0x3C,則輸入信號(hào)被視為低電平驳糯。GPIO_FUNCy_IN_INV_SEL(其中y為GPIO的管腳號(hào))是反轉(zhuǎn)輸入值的控制位篇梭。如果輸入是高電平,經(jīng)過(guò)反轉(zhuǎn)操作后變?yōu)榈碗娖皆褪啵环駝t恬偷,保持高電平。GPIO_SIMy_IN_SET(其中y為GPIO的管腳號(hào))是旁路GPIO交換矩陣帘睦,它的作用是提高高頻數(shù)字信號(hào)的特性袍患。如果GPIO_SIMy_IN_SET的值為1,則選擇GPIO交換矩陣作為輸入竣付;否則诡延,選擇IOMUX作為輸入,最終信號(hào)到達(dá)輸入信號(hào)終端古胆。
二肆良、“Pin X supplied by VDD3P3_CPU”芯片焊盤輸出流程(圖4.5.1.5.3中的紅色線條)
從上圖3.5.2.3可知,輸出信號(hào)也是分為兩個(gè)通道傳輸(Ⅰ處),如果輸出信號(hào)是普通的GPIO輸出惹恃,則該信號(hào)經(jīng)過(guò)GPIO矩陣夭谤,再由該矩陣輸出到IO MUX,再到輸出管腳座舍,這個(gè)流程由GPIO_FUNCy_OUT_SEL_CFG_REG寄存器配置沮翔,如下所示:
從上圖可知,GPIO_FUNCx_OUT_SEL(其中x為GPIO的管腳號(hào))是外設(shè)輸出信號(hào)控制位曲秉。當(dāng)GPIO0管腳輸出信號(hào)時(shí)采蚀,該值為0。GPIO_FUNCx_OUT _INV_SEL(其中x為GPIO的管腳號(hào))是反轉(zhuǎn)輸出值的控制位承二。如果輸出是高電平榆鼠,經(jīng)過(guò)反轉(zhuǎn)操作后變?yōu)榈碗娖剑环駝t亥鸠,保持高電平妆够。然后通過(guò)IO_MUX_n_REGIO寄存器(該寄存器的IO_MUX_MCU_SEL位的作用是信號(hào)選擇IO MUX功能,為0選擇Function 0负蚊,為1選擇Function 1(GPIO)神妹。有關(guān)Function的詳細(xì)信息,請(qǐng)參閱《esp32-s3_technical_reference_manual_cn.pdf》第6.12節(jié)中的IO MUX管腳功能列表)配置家妆,信號(hào)最終到達(dá)輸出管腳鸵荠。
另一條通道是復(fù)用功能輸出的通道。該通道由輸出信號(hào)的起始端到IO MUX復(fù)用電路伤极,然后IO_MUX_n_REGIO寄存器的IO_MUX_MCU_SEL位不為1(GPIO模式)蛹找,為復(fù)用功能,最后經(jīng)過(guò)Ⅱ處輸出到輸出端(GPIO和RTC IO)哨坪。
三庸疾、“Pin X supplied by VDD3P3_RTC”芯片焊盤輸入流程(圖4.5.1.5.3中的黃色線條)
根據(jù)表3.5.2.1和圖3.5.2.3所示,ESP32-S3中有22個(gè)GPIO管腳具有低功耗(RTC)性能和模擬功能当编,由RTC子系統(tǒng)控制届慈。這些功能不使用 IO MUX 和GPIO交換矩陣,而是使用RTC IO MUX將22個(gè)RTC輸入輸出信號(hào)引入RTC子系統(tǒng)忿偷。當(dāng)這些管腳被配置為RTC GPIO管腳拧篮,作為輸出管腳時(shí)仍然能夠在芯片處于Deep-sleep模式下保持輸出電平值或者作為輸入管腳使用時(shí)可以將芯片從Deep-sleep中喚醒。
如果它們被用作普通輸入牵舱,則輸入流程與“Pin X supplied by VDD3P3_CPU”的輸入流程相同。如果它們作為RTC復(fù)用功能缺虐,則輸入信號(hào)會(huì)進(jìn)入RTCIO MUX復(fù)用電路芜壁,并最終到達(dá)RTCGPIO矩陣。
3.5.3 復(fù)位與時(shí)鐘
3.5.3.1 ESP32-S3復(fù)位等級(jí)
ESP32-S3提供四種級(jí)別的復(fù)位方式,分別是CPU復(fù)位慧妄、內(nèi)核復(fù)位顷牌、系統(tǒng)復(fù)位和芯片復(fù)位。除芯片復(fù)位外其它復(fù)位方式不影響片上內(nèi)存存儲(chǔ)的數(shù)據(jù)塞淹。下圖展示了整個(gè)芯片系統(tǒng)的結(jié)構(gòu)以及四種復(fù)位等級(jí)窟蓝。
CPU復(fù)位:只復(fù)位CPUx內(nèi)核,這里的CPUx代表CPU0和CPU1.復(fù)位釋放后饱普,程序?qū)腃PUxReset Vector開始執(zhí)行运挫。
內(nèi)核復(fù)位:復(fù)位除了RTC以外的數(shù)字系統(tǒng),包括CPU0套耕、CPU1谁帕、外設(shè)、WiFi冯袍、Bluetooth? LE及數(shù)字GPIO匈挖。
系統(tǒng)復(fù)位:復(fù)位包括RTC在內(nèi)的整個(gè)數(shù)字系統(tǒng)。
芯片復(fù)位:復(fù)位整個(gè)芯片康愤。
上述任意復(fù)位源產(chǎn)生時(shí)儡循,CPU0和CPU1均將立刻復(fù)位。復(fù)位釋放后征冷,CPU0和CPU1可分別通過(guò)讀取寄存器RTC_CNTL_RESET_CAUSE_PROCPU和RTC_CNTL_RESET_CAUSE_APPCPU獲取復(fù)位源择膝。這兩個(gè)寄存器記錄的復(fù)位源除了復(fù)位級(jí)別為CPU復(fù)位的復(fù)位源分別對(duì)應(yīng)自身的CPUx以外,其余的復(fù)位源保持一致资盅。下表列出了從上述兩個(gè)寄存器中可能讀出的復(fù)位源调榄。
上表描述了不同的復(fù)位對(duì)應(yīng)的復(fù)位源,在ESP32-S3上電復(fù)位時(shí)呵扛,它的復(fù)位源為芯片復(fù)位每庆,如下信息所示:
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0xb (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3810,len:0x17c0
load:0x403c9700,len:0xd7c
load:0x403cc700,len:0x300c
entry 0x403c992c
從上述內(nèi)容可以看到,rst為0x01(復(fù)位編碼)今穿,根據(jù)上表的對(duì)應(yīng)關(guān)系缤灵,可得芯片上電時(shí)的復(fù)位源為芯片復(fù)位。
3.5.3.2 系統(tǒng)時(shí)鐘
ESP32-S3的時(shí)鐘主要來(lái)源于振蕩器(oscillator蓝晒,OSC)腮出、 RC振蕩電路和PLL時(shí)鐘生成電路。上述時(shí)鐘源產(chǎn)生的時(shí)鐘經(jīng)時(shí)鐘分頻器或時(shí)鐘選擇器等時(shí)鐘模塊的處理芝薇,使得大部分功能模塊可以根據(jù)不同功耗和性能需求來(lái)獲取及選擇對(duì)應(yīng)頻率的工作時(shí)鐘胚嘲。下圖為ESP32-S3系統(tǒng)時(shí)鐘結(jié)構(gòu)。
從上圖可知洛二,ESP32-S3時(shí)鐘頻率馋劈,可劃分為:
(1)攻锰,高性能時(shí)鐘,主要為CPU和數(shù)字外設(shè)提供工作時(shí)鐘妓雾。
①:PLL_CLK:320MHz或者480MHz內(nèi)部PLL時(shí)鐘
②:XTAL_CLK:40MHz外部晶振時(shí)鐘
(2)娶吞,低功耗時(shí)鐘,主要為RTC模塊以及部分處于低功耗模式的外設(shè)提供工作時(shí)鐘械姻。
? ?? ? ①:XTAL32K_CLK:32kHz外部晶振時(shí)鐘
? ?? ? ②:RC_FAST_CLK:內(nèi)置快速RC振蕩器時(shí)鐘妒蛇,頻率可調(diào)節(jié)(通常為17.5MHz)
③:RC_FAST_DIV_CLK:內(nèi)置快速RC振蕩器分頻時(shí)鐘(RC_FAST_CLK/256)
④:RC_SLOW_CLK:內(nèi)置慢速RC振蕩器,頻率可調(diào)節(jié)(通常為136 kHz)
從上圖紅色線條所示楷拳,CPU_CLK代表CPU的主時(shí)鐘绣夺。在CPU最高效的工作模式下,主頻可以達(dá)到240MHz唯竹。主頻頻率是由寄存器SYSTEM_SOC_CLK_SEL(SEL_0:選擇SOC時(shí)鐘源)乐导、SYSTEM_PLL_FREQ_SEL(SEL_2:選擇 PLL 時(shí)鐘頻率)和SYSTEM_CPUPERIOD_SEL(SEL_3:選擇 CPU 時(shí)鐘頻率)共同確定的,具體如下表所示浸颓。
從上表可以得知物臂,如果用戶想要將ESP32-S3的主頻設(shè)置為240MHz,那么我們應(yīng)該選擇PLL_CLK作為輸入源产上,然后通過(guò)二分頻得到240MHz的時(shí)鐘頻率棵磷。
外設(shè)、WiFi晋涣、BLUE仪媒、RTC等時(shí)鐘配置及選擇源,請(qǐng)讀者參考《esp32-s3_technical_reference_manual_cn.pdf》技術(shù)手冊(cè)章節(jié)7 復(fù)位和時(shí)鐘谢鹊。
3.5.4 芯片Boot控制
在上電復(fù)位算吩、 RTC看門狗復(fù)位、欠壓復(fù)位佃扼、模擬超級(jí)看門狗(analog superwatchdog)復(fù)位偎巢、晶振時(shí)鐘毛刺檢測(cè)復(fù)位過(guò)程中,硬件將采樣 Strapping 管腳電平存儲(chǔ)到鎖存器中兼耀,并一直保持到芯片掉電或關(guān)閉压昼。GPIO0、GPIO3瘤运、GPIO45和GPIO46鎖存的狀態(tài)可以通過(guò)軟件從寄存器GPIO_STRAPPING中讀取窍霞。GPIO0、GPIO45和GPIO46默認(rèn)連接內(nèi)部上拉/下拉拯坟。如果這些管腳沒有外部連接或者連接的外部線路處于高阻抗?fàn)顟B(tài)但金,內(nèi)部弱上拉/下拉將決定這幾個(gè)管腳輸入電平的默認(rèn)值,如下表所示郁季。
GPIO0傲绣、GPIO45和GPIO46在芯片復(fù)位時(shí)連接芯片內(nèi)部的弱上拉/下拉電阻掠哥。如果strapping管腳沒有外部連接或者連接的外部線路處于高阻抗?fàn)顟B(tài),這些電阻將決定strappin管腳的默認(rèn)值秃诵。所有strapping管腳都有鎖存器。系統(tǒng)復(fù)位時(shí)塞琼,鎖存器采樣并存儲(chǔ)相應(yīng)strapping管腳的值菠净,一直保持到芯片掉電或關(guān)閉。鎖存器的狀態(tài)無(wú)法用其他方式更改彪杉。因此毅往,strapping管腳的值在芯片工作時(shí)一直可讀取,并可在芯片復(fù)位后作為普通IO管腳使用派近。
①芯片啟動(dòng)模式控制
復(fù)位釋放后攀唯,GPIO0和GPIO46共同決定啟動(dòng)模式。詳見下表渴丸。
正常情況下侯嘀,ESP32啟動(dòng)模式為“SPI BOOT”,當(dāng)我們按下開發(fā)板的BOOT按鍵時(shí)才能進(jìn)入“Download Boot”模式啟動(dòng)谱轨。
② VDD_SPI 電壓控制
ESP32-S3系列芯片所需的VDD_SPI電壓請(qǐng)參考《esp32-s3_datasheet_cn.pdf》數(shù)據(jù)手冊(cè)的1.2型號(hào)對(duì)比表格戒幔,如下圖所示。
這個(gè)表格下定義了每個(gè)芯片型號(hào)VDD_SPI電壓土童。由于正點(diǎn)原子ESP32S3開發(fā)板的模組選擇的是ESP32-S3-WROOM-1-N16R8诗茎,而它的主控芯片為ESP32R8,所以根據(jù)上圖的內(nèi)容献汗,我們會(huì)發(fā)現(xiàn)ESP32R8芯片的VDD_SPI電壓為3.3V敢订。接著我們來(lái)看一下GPIO45號(hào)管腳的定義,如下圖所示罢吃。
從上圖可以看到楚午,電壓有兩種控制方式,具體取決于EFUSE_VDD_SPI_FORCE的值刃麸。如果這個(gè)值為0醒叁,那么VDD_SPI電壓取決于GPIO45的電平值。如果GPIO45的電平值為0泊业,VDD_SPI電壓為3.3V把沼;否則為1.8V。相反吁伺,如果EFUSE_VDD_SPI_FORCE 為 1饮睬,VDD_SPI電壓取決于 eFuse(表示 flash 電壓調(diào)節(jié)器是否短接至VDD_RTC_IO)。如果eFuse為0篮奄,VDD_SPI電壓值為1.8V捆愁;否則為 3.3V割去。
③ ROM日記打印控制
系統(tǒng)啟動(dòng)過(guò)程中, ROM代碼日志可打印至UART和USB串口/JTAG控制器昼丑。我們可通過(guò)配置寄存器和eFuse可分別關(guān)閉UART和USB串口/JTAG控制器的ROM代碼日志打印功能呻逆。詳細(xì)信息請(qǐng)參考《ESP32-S3技術(shù)參考手冊(cè)》 ->章節(jié)芯片Boot控制。
④ JTAG 信號(hào)源控制
在系統(tǒng)啟動(dòng)早期階段菩帝,GPIO3可用于控制JTAG信號(hào)源咖城。該管腳沒有內(nèi)部上下拉電阻,strapping的值必須由不處于高阻抗?fàn)顟B(tài)的外部電路控制呼奢。如圖所示宜雀,GPIO3與EFUSE_DIS_PAD_JTAG、EFUSE_DIS_USB_JTAG和EFUSE_STRAP_JTAG_SEL共同控制 JTAG 信號(hào)源握础。
注意:ESP32-S3系統(tǒng)中有一塊4-Kbit的eFuse辐董,其中存儲(chǔ)著參數(shù)內(nèi)容。相關(guān)內(nèi)容請(qǐng)看《esp32-s3_technical_reference_manual_cn.pdf》技術(shù)參考手冊(cè)-> 章節(jié) eFuse 控制器禀综。
3.5.5 中斷矩陣
ESP32-S3的中斷矩陣將任意外部中斷源單獨(dú)分配到雙核CPU的任意外部中斷上简烘,以便在外部設(shè)備中斷信號(hào)產(chǎn)生后,能夠及時(shí)通知CPU0或CPU1進(jìn)行處理菇存。外部中斷源必須經(jīng)過(guò)中斷矩陣分配至CPU0/CPU1外部中斷夸研,主要是因?yàn)镋SP32-S3具有99個(gè)外部中斷源,但每個(gè)CPU只有32個(gè)中斷依鸥。通過(guò)使用中斷矩陣亥至,可以根據(jù)應(yīng)用需求將一個(gè)外部中斷源映射到多個(gè)CPU0中斷或CPU1中斷。實(shí)際上贱迟,CPU0和CPU1的外部中斷只有26個(gè)姐扮,剩下的6個(gè)中斷均為內(nèi)部中斷。
下圖是雙核中斷矩陣結(jié)構(gòu)衣吠。
這種設(shè)計(jì)使得ESP32S3能夠適應(yīng)不同的應(yīng)用需求茶敏,提供更大的靈活性和控制力。在硬件配置上缚俏,用戶需要確保中斷矩陣的正確配置惊搏,以便能夠正確地接收和處理外部中斷。同時(shí)忧换,用戶也需要通過(guò)編程方式恬惯,根據(jù)實(shí)際需求對(duì)中斷矩陣進(jìn)行適當(dāng)?shù)呐渲煤筒僮鳌?/p>
當(dāng)某個(gè)外部中斷源滿足觸發(fā)條件時(shí)(例如GPIO引腳信號(hào)狀態(tài)發(fā)生變化),該中斷信號(hào)將被送入中斷矩陣進(jìn)行處理亚茬。中斷矩陣將根據(jù)中斷信號(hào)的特性酪耳,將其映射到一個(gè)特定的CPU外部中斷上。當(dāng)CPU接收到這個(gè)外部中斷信號(hào)時(shí)刹缝,會(huì)執(zhí)行與該中斷相關(guān)聯(lián)的ISR函數(shù)碗暗。
總的來(lái)說(shuō)颈将,ESP32S3的中斷矩陣是一種高效的中斷處理機(jī)制,它能夠?qū)⒍鄠€(gè)外部中斷源映射到兩個(gè)CPU的外部中斷上進(jìn)行處理言疗,并能夠查詢外部中斷源當(dāng)前的中斷狀態(tài)晴圾。
3.6 ESP32-S3啟動(dòng)流程
本文將會(huì)介紹ESP32-S3從上電到運(yùn)行app_main函數(shù)中間所經(jīng)歷的步驟(即啟動(dòng)流程)。從宏觀上洲守,該啟動(dòng)流程可分為如下3個(gè)步驟疑务。
①:一級(jí)引導(dǎo)程序,它被固化在ESP32-S3內(nèi)部的ROM中梗醇,它會(huì)從flash的0x00處地址加載二級(jí)引導(dǎo)程序至RAM中。
②:二級(jí)引導(dǎo)程序從flash中加載分區(qū)表和主程序鏡像至內(nèi)存中撒蟀,主程序中包含了RAM段和通過(guò)flash高速緩存映射的只讀段叙谨。
③:應(yīng)用程序啟動(dòng)階段運(yùn)行,這時(shí)第二個(gè)CPU和freeRTOS的調(diào)度器啟動(dòng)保屯,最后進(jìn)入app_main函數(shù)執(zhí)行用戶代碼手负。
下面作者根據(jù)IDF庫(kù)相關(guān)的代碼來(lái)講解這三個(gè)引導(dǎo)流程,如下:
一姑尺、一級(jí)引導(dǎo)程序
該部分程序是直接存儲(chǔ)在ESP32-S3內(nèi)部ROM中竟终,所以普通開發(fā)者無(wú)法直接查看,它主要是做一些前期的準(zhǔn)備工作(復(fù)位向量代碼)切蟋,然后從flash 0x00偏移地址中讀取二級(jí)引導(dǎo)程序文件頭中的配置信息统捶,并使用這些信息來(lái)加載剩余的二級(jí)引導(dǎo)程序。
二柄粹、二級(jí)引導(dǎo)程序
該程序是可以查看且可被修改喘鸟,在搭建ESP-IDF環(huán)境完成后,可在esp-idf\components\bootloader/subproject/main/路徑下找到bootloader_start.c文件驻右,此文件就是二級(jí)引導(dǎo)程序啟動(dòng)處什黑。首先我們克隆ESP-IDF庫(kù),克隆過(guò)程如下所示堪夭。
克隆完成后愕把,使用VSCode打開ESP-IDF庫(kù),接著找到bootloader_start.c森爽,如下圖所示恨豁。
在這個(gè)文件下,找到call_start_cpu0函數(shù)拗秘,此函數(shù)是bootloader程序圣絮,如下是bootloader程序的部分代碼。
/*
ROM引導(dǎo)加載程序完成從閃存加載第二階段引導(dǎo)加載程序之后到達(dá)這里
*/
void__attribute__((noreturn)) call_start_cpu0(void)
{
? ? if (bootloader_before_init) {
? ?? ? bootloader_before_init();
? ? }
/* 1. 硬件初始化:清楚bss段雕旨、開啟cache扮匠、復(fù)位mmc等操作
bootloader_support/src/esp32s3/bootloader_esp32s3.c */
? ? if (bootloader_init() != ESP_OK) {
? ?? ? bootloader_reset();
? ? }
? ? if (bootloader_after_init) {
? ?? ? bootloader_after_init();
? ? }
? ? /* 2. 選擇啟動(dòng)分區(qū)的數(shù)量:加載分區(qū)表捧请,選擇boot分區(qū) */
? ?bootloader_state_t bs = {0};
? ? int boot_index =select_partition_number(&bs);
? ? if (boot_index == INVALID_INDEX){
? ?? ? bootloader_reset();
? ? }
/* 3. 加載應(yīng)用程序映像并啟動(dòng)
bootloader_support/src/esp32s3/bootloader_utility.c */
? ?bootloader_utility_load_boot_image(&bs, boot_index);
}
ESP-IDF使用二級(jí)引導(dǎo)程序可以增加FLASH分區(qū)的靈活性(使用分區(qū)表),并且方便實(shí)現(xiàn)FLASH加密棒搜,安全引導(dǎo)和空中升級(jí)(OTA)等功能疹蛉。主要的作用是從flash的0x8000處加載分區(qū)表(請(qǐng)看在線ESP32-IDF編程指南分區(qū)表章節(jié))。根據(jù)分區(qū)表運(yùn)行應(yīng)用程序力麸。
三可款、三級(jí)引導(dǎo)程序
應(yīng)用程序的入口是在esp-idf/components/esp_system/port/路徑下的cpu_star.c文件,在此文件下找到call_start_cpu0函數(shù)(端口層初始化函數(shù))克蚂。這個(gè)函數(shù)由二級(jí)引導(dǎo)加載程序執(zhí)行闺鲸,并且從不返回。因此你看不到是哪個(gè)函數(shù)調(diào)用了它埃叭,它是從匯編的最底層直接調(diào)用的摸恍。
這個(gè)函數(shù)會(huì)初始化基本的C運(yùn)行環(huán)境(“CRT”),并對(duì)SOC的內(nèi)部硬件進(jìn)行了初始配置赤屋。執(zhí)行call_start_cpu0函數(shù)完成之后立镶,在components\esp_system\startup.c文件下調(diào)用start_cpu0(在110行中,弱關(guān)聯(lián)start_cpu0_default函數(shù))系統(tǒng)層初始化函數(shù)类早,如下start_cpu0_default函數(shù)的部分代碼媚媒。
static voidstart_cpu0_default(void)
{
? ?ESP_EARLY_LOGI(TAG, "Pro cpu start user code");
? ? /* 獲取CPU時(shí)鐘 */
? ? int cpu_freq = esp_clk_cpu_freq();
? ?ESP_EARLY_LOGI(TAG, "cpu freq: %d Hz", cpu_freq);
? ? /* 初始化核心組件和服務(wù) */
? ?do_core_init();
? ? /* 執(zhí)行構(gòu)造函數(shù) */
? ?do_global_ctors();
? ? /* 執(zhí)行其他組件的init函數(shù) */
? ?do_secondary_init();
? ? /* 開啟APP程序 */
? ?esp_startup_start_app();
? ? while (1);
}
到了這里,就完成了二級(jí)程序引導(dǎo)涩僻,并調(diào)用esp_startup_start_app函數(shù)進(jìn)入三級(jí)引導(dǎo)程序缭召,該函數(shù)的源碼如下:
/* components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c*/
/* 開啟APP程序 */
voidesp_startup_start_app(void)
{? ?/* 省略部分代碼 */
? ? /* 新建main任務(wù)函數(shù) */
? ?esp_startup_start_app_common();
? ? /* 開啟FreeRTOS任務(wù)調(diào)度 */
? ?vTaskStartScheduler();
}
/* components/freertos/FreeRTOS-Kernel/portable/port_common.c*/
/* 新建main任務(wù)函數(shù) */
voidesp_startup_start_app_common(void)
{
? ? /* 省略部分代碼 */
? ? /* 創(chuàng)建main任務(wù) */
? ?portBASE_TYPE res = xTaskCreatePinnedToCore(&main_task, "main",
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???ESP_TASK_MAIN_STACK, NULL,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???ESP_TASK_MAIN_PRIO, NULL, ESP_TASK_MAIN_CORE);
? ?assert(res == pdTRUE);
? ? (void)res;
}
/* main任務(wù)函數(shù) */
static void main_task(void* args)
{? ?/* 省略部分代碼 */
? ? /* 執(zhí)行app_main函數(shù) */
? ?app_main();
? ?vTaskDelete(NULL);
}
從上述源碼可知,首先在esp_startup_start_app_common函數(shù)調(diào)用FreeRTOS API創(chuàng)建main任務(wù)令哟,然后開啟freeRTOS任務(wù)調(diào)度器恼琼,最后在main任務(wù)下調(diào)用app_main函數(shù)(此函數(shù)在創(chuàng)建工程時(shí),在main.c下定義的)屏富。