NXP LPC55S6x(ARM Cortex-M33) TrustZone入門開發

功能概述

LPC55S6x MCU家族是全球首款基於通用Cortex-M33的微控制器,隨LPC5500系列推出。該高效率MCU家族採用Armv8-M架構,性能和高級安全功能達到新水準,包括TrustZone-M和輔助處理器擴展。LPC55S6x家族利用輔助處理器擴展型號,大幅提高信號處理效率,採用專有DSP加速器,使計算的時鐘週期減少了10倍。還可選擇使用第二個Cortex-M33內核,支持靈活地平衡高性能與功率效率。

此外,LPC55S6x MCU家族基於40nm NVM的處理技術,具備成本效益優勢,提供廣泛的可擴展封裝和記憶體選項,並提供強大的支援,包括MCUXpresso軟體和工具生態系統及低成本開發板。

特性

Arm Cortex-M33內核

  • Arm Cortex-M33處理器,運行頻率高達100 MHz
  • TrustZone,浮點運算單元(FPU)和記憶體保護單元(MPU)
  • ARM Cortex-M33內置可嵌套向量中斷控制器(NVIC)
  • 非遮罩中斷(NMI)輸入,多種中斷源可供選擇

輔助處理器

  • Arm Cortex-M33輔助處理器
  • 運行頻率高達100 MHz
  • 這個處理器的配置不包括MPU、FPU、DSP、ETM和TrustZone
  • 系統節拍計時器
  • CASPER加解密輔助處理器,提供對非對稱加密演算法的硬體加速
  • PowerQuad提供對DSP計算(定點和浮點)的加速

嵌入式記憶體

  • 多達640 KB嵌入式快閃程式記憶體,帶快閃記憶體加速器和256位元組頁擦寫功能
  • SRAM高達320 KB,其中系統匯流排上有288 KB,內核匯流排有32 KB

安全特性

  • 啟用Arm TrustZone
  • PRINCE模組對寫入到嵌入式快閃記憶體的資料進行即時加密,在讀取加密快閃記憶體資料時進行解密,以保護代碼
  • AES-256加密/解密引擎
  • 安全雜湊演算法(SHA1/SHA2)模組支援通過專用DMA控制器的安全啟動。
  • 通過專用SRAM上的晶片指紋,提供物理不可仿製功能(PUF) ; PUF可以生成、存儲和重建從64到4096位長度不等的金鑰。包括用於金鑰提取的硬體
  • 亂數產生器(RNG)
  • 唯一的128位元設備識別序號(UUID)。
  • 安全通用IO埠

序列介面

  • Flexcomm介面包含9個串列周邊。每個Flexcomm介面可通過軟體選擇作為USART、SPI、I2C或I2S介面。
  • I2C匯流排界面,支持Fast-Mode和Fast-Mode Plus,資料傳輸率高達1 Mbit/s,具有多種位址識別和監測模式。
  • USB 2.0全速主機/設備控制器,帶有嵌入PHY和專用DMA控制器,在設備模式下支援無振盪器工作。
  • USB 2.0高速主機/設備控制器,帶有嵌入高速PHY

數位周邊

  • DMA0控制器,具有23個通道和多達22個可程式設計觸發器,能夠存取所有記憶體和支持DMA的周邊。
  • DMA1控制器,具有10個通道和16個可程式設計觸發器,能夠存取所有記憶體和支持DMA的周邊。
  • 安全的數位輸入輸出(SD/MMC和SDIO)卡介面,支援DMA SDIO支援兩個卡。支援的卡類型為MMC、SDIO和CE-ATA。支持0和SR25
  • CRC引擎模組可使用支援DMA的3個標準多項式中的一個計算所提供資料的CRC。
  • 多達64個通用輸入/輸出(GPIO)接腳。
  • 通用IO暫存器位於AHB上,以支援快速存取。DMA支援通用IO埠。
  • 最多8個通用IO可選為接腳中斷(PINT),由上升緣、下降緣或兩種輸入緣觸發。
  • 兩組通用IO中斷(GINT)支援基於輸入狀態邏輯(AND/OR)組合的中斷
  • I/O接腳配置,支援16個函數選項。
  • 可程式設計邏輯單元(PLU)用於建立小型組合和/或順序邏輯網路,包括狀態機。

類比周邊

  • 16位ADC,具有5個差分通道對(或10個單端通道)以及多個內部和外部觸發器輸入,取樣速率高達0 M取樣/秒。ADC支持兩個獨立的轉換序列
  • 連接至ADC的內建溫度感測器
  • 具有5個輸入接腳和外部或內部基準電壓的比較器。

計時器

  • 5個32位元標準通用非同步計時器/計數器,支援多達4個採集輸入和4個比較輸出。可選擇特定的計時器事件生成DMA請求
  • 一個SCTimer/PWM,具有8個輸入和10個輸出函數(包括捕捉和匹配)。輸入和輸出可引導至或來自外部接腳,內部引導至或來自所選周邊。在內部SCTimer/PWM支持16個捕捉/匹配,16個事件和32個狀態。
  • 32位元即時時鐘(RTC),以1秒解析度在始終開啟的電源區域內運行。RTC中的計時器可用於喚醒所有低功耗模式(包括深度省電模式),具有1 ms解析度
  • 多通道多速率24位元計時器(MRT),用於在多達4種可程式設計固定速率下重複生成中斷
  • Windowed Watchdog計時器 (WWDT),使用1MHz的FRO作為時鐘源
  • 微節拍計時器,通過Watchdog振盪器運行,可用於將器件從睡眠和深度睡眠模式中喚醒。
  • 42位元自運行OS計時器作為系統的連續時鐘,適用於任何低功耗的模式。

時鐘生成

  • 內部自運行振盪器(FRO)。該振盪器可提供96MHz輸出,以及一個可用作系統時鐘的12MHz輸出(從所選的較高頻率中除頻)。FRO在整個電壓和溫度範圍內調校為±1%精確度。
  • 32 kHz內部自運行振盪器(FRO)。FRO在整個電壓和溫度範圍內調校為±1%精確度。
  • 內部低功耗振盪器(FRO 1 MHz)
  • 晶體振盪器,工作頻率範圍:1MHz到25MHz,高達25MHz的外部時鐘輸入(旁路模式)時鐘頻率選項
  • 晶體振盪器,工作頻率為768 KHz
  • PLL0和PLL1可讓CPU以允許的最高速率運行,無需高頻外部時鐘
  • 帶除頻器的時鐘輸出功能,監測內部時鐘
  • 用於測量內部和外部時鐘信號頻率的頻率測量單元

省電模式

  • 最大限度降低功耗的整合式PMU(電源管理單元)
  • 低功耗模式:保留RAM的睡眠、深度睡眠,保留RAM和CPU0的省電模式和深度省電模式
  • 可配置從周邊中斷喚醒
  • Micro-Tick計時器通過Watchdog振盪器運行,即時時鐘(RTC)通過678 kHz時鐘運行,可用於在睡眠和深度睡眠模式下喚醒系統
  • 上電重置(POR)
  • 帶獨立的低電壓檢測(BOD),用於產生中斷和強制重置。

更多資訊

  • 通過內部DC-DC轉換器為系統供電
  • 單一外部供電:8V至3.6V
  • 支援JTAG邊界掃描
  • 工作溫度範圍:-40°C至+105°C
  • 提供HLQFP100、VFBGA98和HTQFP64封裝

(一) TrustZone技術介紹

LPC5500系列MCU以ARM最新的Cortex-M33為核心,與前幾代產品相比,改進了產品架構並提高了整合度;大幅減小了功耗,並提供高級安全功能。

近幾年來,物聯網(IoT)成為了嵌入式開發者的熱門話題。IoT系統產品變得更加複雜,同時也需要更好的方案來保證系統的安全。

傳統的方案是通過把軟體分成特權和非特權兩部分解決。特權級軟體利用MPU防止非特權軟體的應用,存取包含敏感資訊在內的關鍵系統資源。

這些方案對一些IoT系統非常適合,但是在一些情況下,只有兩層劃分是不夠的。特別是那些包含很多複雜特權級別的軟體組成的系統,特權級程式的一個缺陷,就可能導致駭客徹底的控制整個系統。

為了更好地提高MCU的安全性能,ARM在ARMv8-M架構中引入了TrustZone技術。ARMv8-M中的TrustZone技術是一種可選擇的安全擴展,旨在為各種嵌入式系統應用提供基本的安全保障。

TrustZone技術將系統分為安全區和非安全區兩部分,並通過特殊的指令實現兩種區域內函數的相互存取。

TrustZone的概念不是最新的了,它被應用在Arm Cortex-A系列處理器中已經有一段時間了,現在被擴展到了ARMv8-M 處理器中,它與Cortex-A處理器中的TrustZone並不是完全相同的,本篇中所描述的TrustZone技術都是基於Cortex-M處理器的。

1.1 TrustZone的特性:

允許使用者將記憶體劃分為安全和非安全區域;

允許在未經過身份驗證時阻止除錯安全程式/資料;

NVIC、MPU、SYSTICK、內核控制暫存器等也被備份到兩個區域中,安全程式和非安全程式可以獨立存取自己的資源;

安全區和非安全區都有MSP和PSP堆疊指標;

提出了Secure Gateway的概念,非安全程式可以通過Secure Gateway存取特定的安全程式,這也是非安全程式存取安全程式的唯一方式;

提供了一個Stack Limit Checking(堆疊限制檢查)功能,可以用於檢測堆疊溢位的情況。在Cortex-M33對應的ARMv8-M架構中,每個堆疊指標都有相應的堆疊限制暫存器。

1.2 Register banking:

上節提到一些有內核相關的暫存器也被備份到了安全/非安全區域中,下圖展示了具體哪些通用/特殊暫存器被備份到兩種記憶體中。

1.3 TrustZone技術可以滿足的安全需求:

Data protection:敏感性資料可以存儲在安全記憶體中,只可以被安全軟體存取。只有在安全檢查和授權之後,非安全軟體才可以存取安全APIs。

Firmware protection:韌體可以預裝載在安全區域中,防止逆向操作和惡意攻擊。

Operation protection:關鍵操作可以像安全韌體一樣,被預載入到安全記憶體中,並且配置適當的周邊僅在安全狀態下存取。

Secure boot:安全啟動機制可以使用戶對自己的平台充滿信心,因為它始終從安全記憶體啟動。


(二) Secure/Non-Secure記憶體配置

在Cortex-M33中,如果選配了TrustZone技術,則4G的記憶體空間將被劃分為安全和非安全記憶體區域。安全記憶體空間又可以進一步劃分為兩種類型:Secure和Non-secure Callable(NSC)。

三種記憶體區域的特性:

Secure:安全資料只可以被安全程式存取,安全程式只有在CPU處於安全模式時才可以被執行;

Non-secure:非安全資料可以被安全和非安全狀態存取,但非安全程式只能在CPU處於非安全狀態時被執行;

Non-secure Callable(NSC):NSC區域作為非安全函數存取安全函數的跳板。非安全程式需要先跳轉到NSC區域中,執行SG指令,然後再跳轉到相應的的安全函數處執行,這也是NS(Non-secure)程式存取S(Secure)函數的唯一方式。

引入NSC存儲區的原因,是為了防止其他二進位資料(例如:具有與SG指令的操作碼相同的值的查閱資料表)被用作安全狀態的入口函數。

2.1記憶體區域的安全屬性定義:

記憶體區域的安全屬性是由Secure Attribution Unit(SAU)和Implementation Defined Attribution Unit(IDAU) 共同決定的。

SAU的作用和IDAU是相似的,都是用於分離安全區和非安全區。兩者最大的區別是SAU位於CPU內部,IDAU在CPU外部。

無論是IDAU和SAU都可以定義一塊記憶體的安全屬性,此時CPU會選擇兩者中較高的安全屬性作為此塊記憶體最終的安全屬性,最高的安全屬性是Secure,其次是Non-Secure Callable,最後是Non-secure。

2.2 IDAU:

IDAU除了可以向處理器指示特定記憶體位址是Secure、NSC還是Non-secure,提供記憶體位址所在的區域編號之外,它還可以標記免受安全檢查的記憶體區域,例如ROM表。

理論上,IDAU是可以設計為可程式設計的,但是IDAU介面上的信號位於時序的關鍵路徑上,這會使IDAU的設計變得非常複雜,不切實際也會導致設計中的邏輯閘數更高。

實際上,IDAU只提供了有限的可配置的簡單記憶體映射。


LPC55Sxx 的IDAU提供的配置如下圖所示:

其中,0x00000000到0x1FFFFFFF是NS區域,在0x20000000到0xFFFFFFF範圍內,是根據記憶體位址的第28位元來判斷該記憶體位址的安全屬性,若Bit_28=0,則為非安全地址,若Bit_28=1,則為安全地址。

2.3 SAU:

SAU為每個記憶體區域定義了一個Region Number(RN)。RN可以被TT指令用來決定目標記憶體的存取權限和安全屬性。RN的數量可以被SAU配置為0、4或者8。

SAU是由設計者配置的,設計者可以在IDAU配置的記憶體屬性的基礎上,用SAU去重定義記憶體中的一些區域的安全屬性,CPU會根據IDAU和SAU的配置,決定記憶體的最終安全屬性。


LPC55Sxx重置後,預設的SAU配置是:所有存儲空間都是安全的。結合IDAU的預設配置,LPC55Sxx的最終預設配置如下圖所示,即所有記憶體區域都是安全的。


(三) Secure/Non-secure轉換

第二節中介紹了如何利用SAU和IDAU配置一塊記憶體區域的安全屬性,用戶可以在安全區和非安全區定義相應的函數,TrustZone技術允許兩種狀態下的函數相互呼叫,在進行相互呼叫時需要用到幾個特殊指令:SG、BXNS、BLXNS,如下表所示。

執行狀態切換時的具體操作如下圖所示:


SG指令:用於從非安全狀態切換到安全狀態,是從非安全區跳轉到NSC區域之後執行的第一條指令;

BXNS指令:用於從安全狀態返回到非安全狀態;

BLXNS指令:用於在安全狀態下呼叫非安全函數。

這裡介紹兩種特殊的函數:Entry function和Non-secure function。

Entry function是指那些可以被非安全函式呼叫的安全函數;

Non-secure function是指那些可以被安全函式呼叫的非安全函數。

使用者在實現兩種狀態下函數的相互呼叫時,不需要額外注意該執行哪條特殊指令(SG/BXNS/BLXNS),而只需要將那些被呼叫的函式定義為Entry function或 Non-secure function即可。下面簡單介紹如何定義以及使用Entry function和Non-secure function。

3.1 Entry function:

Entry function需要用“__attribute__((cmse_nonsecure_entry)) ”屬性修飾,舉例如下:

此時func1()已經被定義為了entry function,在非安全記憶體中呼叫entry function的方法與呼叫普通的非安全函數的方法是相同的,如下所示:

這樣即可實現非安全函式呼叫安全函數的功能。

3.2 Non-secure function call:

Non-secure function函式定義如下所示:

在安全記憶體中的呼叫non-secure function的方法如下:

這樣即可實現在安全函數中呼叫0x21000248u處的非安全函數。

(四) 總結

看到這裡,各位是不是對LPC55Sxx中的TrustZone技術的使用方法有了初步的瞭解呢,下面再為大家總結一下使用TrustZone時軟體的工作流程:

在明白了這些之後,大家就可以開始行動起來,利用手裡的LPC55Sxx來設計自己的安全系統。

LPC55S69 TrustZone動手實驗操作

目標

在本實驗中,您將學習:

  • LPC55S69上的安全可信執行環境是什麼(TEE)?
  • 如何使用CM33 Trust Zone
  • 非安全↔安全的環境轉換

硬體

  • NXP LPCxpresso55S69 - LPC55S69-EVK
  • 開發板整合CMSIS-DAP除錯器
  • Micro-USB線
  • 個人電腦

軟體

  • MCUXpresso IDE v10.3.x開發工具
  • MCUXpresso SDK軟體包
  • UART終端機程式(例如:Tera Term或PuTTy)

操作步驟:
(1) 下載LPC55S69 SDK : https://mcuxpresso.nxp.com/en/builder

(2) 安裝LPC55S69 SDK到MCUXpresso IDE

(3) 導入程式 : TrustZone hello world範例
  • Import SDK example(s)
  • 選擇 LPC55S69 à 選擇lpcxpressolpc55s69 board à Next

(4) 導入程式 :
  • 選擇trustzone examples à hello_world_ns 及hello_world_s
  • 點擊Finish

(5) 切換控制台輸出
  • 選擇lpcxpresso_hello_world_ns : Quick Settings --> SDK Debug Console --> UART Console
  • 選擇lpcxpresso_hello_world_s : Quick Settings --> SDK Debug Console --> UART Console

(6) 建構(編譯)
  • 建構安全專案 : lpcxpresso_hello_world_s
  • 建構非安全專案 : lpcxpresso_hello_world_ns

(7) 燒錄 Non-Secure程式
  • 選擇lpcxpresso_hello_world_ns專案
  • 點擊圖示 : Program flash action using LinkServer


(8) 燒錄及除錯Secure程式
  • 選擇lpcxpresso_hello_world_s專案
  • 點擊Debug


(9) 設置終端機程式
  • 打開UART終端程式並選擇正確的通訊埠
  • 將通信協議配置為115200/8 / N / 1

(10) 執行該應用程式

(11) 安全程式(S)和非安全程式(NS)除錯
  • 使用當前配置,由於未載入符號檔案(symbol file),因此無法在非安全程式中設置斷點
  • 離開除錯對話視窗
  • 在lpcxpresso_hello_world_s專案中雙擊lpcxpresso55s69_hello_world LinkServer Debug.launch

(12) 編輯除錯器腳本
  • 選擇Debugger選項
  • 點擊編輯腳本..

  • 選擇lpcxpresso_hello_world_s專案
  • 添加命令

          add-symbol-file /lpcxpresso55s69_hello_world_ns/Debug/lpcxpresso55s69_hello_world_ns.axf 0x10000

  • 點擊OK --> Apply --> Continue

(13) 安全和非安全程式的燒錄和除錯
  • 選擇lpcxpresso_hello_world_ns專案
  • 按住ISP按鈕並按RESET
  • 在此按下燒錄過程中繼續保持ISP按鈕

(14) 燒錄非安全程式
  • 選擇lpcxpresso_hello_world_ns專案
  • 點擊圖示 --> Program flash action using LinkServer


(15) 燒錄及除錯安全程式
  • 選擇lpcxpresso_hello_world_s專案
  • 點擊Debug
安(16) 全和非安全程式的燒錄和除錯
  • 在hello_world_s.c的lpcxpresso_hello_world_s專案中設置斷點

  • 在help_world_ns.c的lpcxpresso_hello_world_ns專案中設置斷點

  • 點擊Resume(F8)
  • 程式執行到安全程式設定的斷點時停止

  • 點擊Resume(F8)
  • 程式執行到非安全程式設定的斷點時停止

 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能