引言
在 STM32 TrustZone 開發(fā)調(diào)試技巧的第(1)篇中,我們介紹了內(nèi)核的 SAU/IDAU,地址的安全屬性配置,資源的安全屬性配置,以及內(nèi)核訪問資源的安全規(guī)則等內(nèi)容,這部分作為 TrustZone S/NS 工程開發(fā)的基礎(chǔ),讓 S 和 NS 工程代碼能夠基本運(yùn)行起來。在此基礎(chǔ)上,S/NS App 還需要使用片上外設(shè)等資源,實(shí)現(xiàn)應(yīng)用程序的業(yè)務(wù)邏輯和功能,這時候往往會遇到一些與外設(shè)使用相關(guān)的問題。
在這一篇中,我們將把重點(diǎn)放在 Trust Zone 架構(gòu)下應(yīng)用開發(fā)中使用外設(shè)的環(huán)節(jié),從外設(shè)中斷、DMA、GPIO 及其與 IO 連接的外設(shè)等幾個方面,介紹這些部分與傳統(tǒng)的不帶TrustZone 的 STM32 開發(fā)相比有哪些變化,同時會列舉一些相關(guān)開發(fā)中的常見問題,并給出問題的分析與解決方法,供開發(fā)者參考。
關(guān)于外設(shè)中斷
中斷向量表 Vector Table
傳統(tǒng)的 ARM V6/V7 內(nèi)核,例如 CM4、CM7,都只有一套中斷向量表,而帶 SecurityExtension 的 CM33 內(nèi)核有兩套中斷向量表,分別對應(yīng) CPU 的 S 和 NS 兩種狀態(tài)。
關(guān)于 DMA
DMA 的 TrustZone aware 特性
STM32 MCU 中的 DMA 單元(例如 GPDMA, LPDMA)在 Trust Zone 框架下屬于 TZaware IP,DMA 能夠直接支持 AHB5 總線。
作為總線主設(shè)備,DMA 可以發(fā)出 S 安全或者 NS 非安全的 transaction。以 STM32U5GPDMA 為例,通過 GPDMA_SECCFGR.SECx 寄存器,可以將 DMA 的 Channel 設(shè)置為安全或者非安全通道。
關(guān)于 GPIO 及其連接的外設(shè)
GPIO 的 TrustZone aware 特性
GPIO 在 Trust Zone 框架下是一個 TZ aware IP,每個管腳都可以單獨(dú)配置其安全訪問屬性(通過 GPIOx_SECCFGR 寄存器)。上電默認(rèn)所有的 GPIO pin 都是安全屬性,當(dāng)某個 GPIO pin 設(shè)置為安全,則它所對應(yīng)的 AF 寄存器,MODE 寄存器以及 I/O 數(shù)據(jù)都只允許 S 訪問,當(dāng)出現(xiàn) NS 訪問時,效果會是 RAZ/WI,即讀為零/寫忽略。
如果某組 GPIO 其中如果至少一個 pin 具有 S 屬性,那么這個 GPIO 在 RCC 中對應(yīng)的clock 和 reset 控制位也會自動具有安全屬性,只有安全代碼才能控制。
STM32CubeMX 外設(shè)初始化對 TrustZone 的支持
這個部分,我們會結(jié)合前面提到的外設(shè)中斷、DMA、GPIO、Securable 外設(shè)等,簡要介紹一下在 STM32CubeMX 工具中如何做 TrustZone 相關(guān)的配置。
小結(jié)
本文針對 STM32 進(jìn)行 V8M TrustZone 開發(fā)中使用外設(shè)需要的配置做了簡要介紹,也列舉了一些 TrustZone 環(huán)境下外設(shè)使用中的常見問題及其分析和解決方法,最后還提到了使用 STM32CubeMX 進(jìn)行外設(shè)安全配置的一些例子,希望對廣大開發(fā)者有所幫助。
在后續(xù)的篇章中,我們將總結(jié)一些其他的 TrustZone 開發(fā)中的常見問題及調(diào)試技巧,例如 Hard Fault 異常的處理與調(diào)試,TrustZone 中 App 使用 RTOS 的注意事項(xiàng)等,歡迎讀者繼續(xù)關(guān)注。