目錄
- 1 esp32 series的中斷控制器
- 2 基于riscv和xtensa的晶片中斷子產品的差別
- 3 使用esp32 series的中斷
-
- 3.1 中斷的配置
- 3.2 中斷的處理
- 3.2 中斷的清除
1 esp32 series的中斷控制器
和一些中斷控制器固定了中斷連線不同,esp32 series采用
中斷矩陣
來連接配接
中斷源
和
中斷輸入引腳
。這樣做的好處是可以靈活配置中斷源對應的中斷号。至于中斷控制器的内部實作,難以探究,且對于軟體來說,也無需知道,通常我們關心的也就是中斷控制器在邏輯上的等效,如下圖所示:
需要說明的是:
- 上圖中UART部分不屬于中斷控制器,列舉這樣一個常見的外設是為了解釋清楚外設的中斷相關寄存器與中斷控制器的關系;
- 中斷控制器的寄存器的名字并非與TRM中完全一緻,但命名也算講究,不難将它們互相對應起來;
- 基于riscv和xtensa的esp晶片在中斷控制器上稍有差别,有些寄存器對于xtensa-based晶片來說是沒有的,下一節将會說明。
TODO:多核與中斷矩陣
2 基于riscv和xtensa的晶片中斷子產品的差別
樂鑫目前使用的核心有兩種,分别是
xtensa
和
riscv
,前者的代表有:
- esp32
- esp32s2
- esp32s3
後者的代表有:
- esp32c3
- esp32h2
下面分别以
esp32s2
和
esp32c3
為代表,比較一下兩種晶片在中斷控制器方面的異同:
esp32c3(riscv) | 來自中斷控制器(0)/核心(1) | esp32s2(xtensa) | 來自中斷控制器(0)/核心(1) |
---|---|---|---|
INT_ENABLE_REG | INTENABLE | 1 | |
INT_TYPE_REG | N/A | N/A | |
INT_CLR_REG | INTCLEAR | 1 | |
INT_EIP_REG | INTERRUPT | 1 | |
INT_PRIORITY_REG | N/A | N/A | |
INT_THRESHOLD_REG | PS.INTLEVEL | 1 | |
INT_MAP_REG | INT_MAP_REG | ||
INT_STATUS_REG | INT_STATUS_REG | ||
INT_CLOCK_REG | INT_CLOCK_REG | ||
INT_DATA_REG | INT_DATA_REG |
不難看出,xtensa-based有一些寄存器是核心提供的,是以中斷控制器就不再重複提供,且由于xtensa不支援中斷類型及優先級的配置,是以相應的寄存器也不存在(注意是不支援配置,但類型和優先級是存在的)。
值得一提的是,符合标準的riscv核心也有一些關于中斷的特權寄存器,常見的比如
mip
,
mie
等,它們建構了如下的邏輯:
再看esp32c3,由于已經具備了
INT_ENABLE_REG
和
INT_EIP_REG
,且僅支援機器模式,是以就沒有再設計
mip
和
mie
,沒有需要。
3 使用esp32 series的中斷
3.1 中斷的配置
- 設定中斷類型
- 設定優先級
- 配置matrix映射
- 注冊中斷handler
- 一系列的ENABLE
- 需要時設定中斷門檻值(通常是全局)
3.2 中斷的處理
中斷配置好以後,等到觸發,CPU就會響應,此時需要提供相應的中斷處理函數。不同于cortex-M3使用的NVIC,使用支援ABI規範的硬體機制使得一個C函數就可以作為中斷入口。esp32 series的中斷入口要稍微複雜一點,從入口到執行使用者提供的中斷處理函數有一個過程,這個放在本系列的下一篇部落格細說。
3.2 中斷的清除
中斷處理完成後(或開始前)需要清楚中斷的pending位,否則剛出中斷又會觸發,最終陷進中斷出不來,這當然是常識。esp32 series的中斷清除有些需要注意的地方,電平類型(高點平)和脈沖類型(上升沿)的中斷對于清除操作的要求是不同的:
- 對于電平類型,需要清除中斷源。在邏輯上可以了解為電平類型中斷的pending與中斷源連通,電平沒了,pending也就沒了。
- 對于脈沖類型,需要清除中斷源以及pending,在邏輯上了解位脈沖類型中斷的pending在捕獲到脈沖後會保持,直到在中斷處理函數中使用INT_CLR_REG清除它。