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