來看下STM32內置的硬體安全功能,哪些是你用過的?

沃愛單片機 發佈 2024-03-01T08:21:17.552707+00:00

概覽對於功能安全,ST MCU 從晶片內置的硬體安全屬性,經過認證的軟體自檢庫和完備的安全文檔三個層面來支持STM32用戶在系統級進行開發,達到要求的功能安全等級。下表中列出了STM32MCU內置的一些主要硬體安全屬性。下面我們一起來看看這些屬性在功能安全中的用處。

概覽

對於功能安全,ST MCU 從晶片內置的硬體安全屬性,經過認證的軟體自檢庫和完備的安全文檔三個層面來支持STM32用戶在系統級進行開發,達到要求的功能安全等級。

下表中列出了STM32MCU內置的一些主要硬體安全屬性。下面我們一起來看看這些屬性在功能安全中的用處。

雙看門狗:獨立看門狗和窗口看門狗

看門狗是我們常用到的針對CPU運行狀態監測的手段之一。它本質上就是一個定時器,啟動之後,需要不斷的去刷新(我們通常把這個動作叫做「餵狗」),否則當看門狗的定時器減到規定的值後,就會引起系統復位。我們可以利用它來檢測程序是否跑飛,並通過晶片復位,來讓系統恢復到正常狀態。

STM32 MCU 提供兩個看門狗:獨立看門狗和窗口看門狗。

從獨立看門狗的名字可以看出,它的特點是擁有獨立於系統時鐘的時鐘。獨立看門狗使用LSI時鐘,這樣使得它與系統時鐘分離開,即使系統時鐘出現故障,獨立看門狗也能正常工作。

獨立看門狗還支持「硬體看門狗」功能,通過選項字使用該功能後,MCU只要一上電,就會啟動運行,開啟對系統的保護。

窗口看門狗使用的是系統時鐘,它的特點是必須在一個窗口時間內完成「餵狗」的動作,否則就會引起系統復位,所以窗口看門狗對「餵狗」的要求更精確了。

窗口看門狗還有一個EWI(early wakeup interrupt)的功能, 這個功能使能後,可以在窗口看門狗引起系統復位之前,先產生一個EWI中斷,在這個中斷里,給了系統軟體一個機會去完成一些必要的安全動作或者數據保存的工作。

部分 MCU 系列的窗口看門狗也支持「硬體看門狗」的功能。

獨立看門狗和窗口看門狗都支持在調試模式下「凍結」計數,以及在低功耗模式下繼續工作的功能。

看門狗可以用在內核檢測,時鐘檢測和電源檢測中。

電源監測

關於電源檢測,STM32MCU的可編程電壓監測(PVD),模擬電壓監測(AVD)和電池電壓監測等功能可以用來檢測VDD,VDDA和電池電壓是否在正常的電壓範圍內。

時鐘安全系統CSS

關於時鐘的檢測,MCU內部的時鐘安全系統(CSS)可以用來檢測外部高速時鐘(HSE)和外部低速時鐘(LSE)是否丟失。

當檢測到HSE時鐘丟失後,CSS可以觸發定時器的「剎車」功能和系統中斷,並自動切換到內部高速時鐘,軟體可以根據這些觸發的事件,制定相應的保護措施。

LSE是RTC的時鐘源,當檢測到LSE丟失後,RTC不能再使用LSE時鐘源,並產生CSS中斷,在中斷中需要將RTC切換到其他時鐘源。

CSS只能檢測時鐘是否丟失。對於時鐘存在但發生偏移的情況,可以通過下圖所示的時鐘交叉測試來進行檢測。


該測試利用了MCU的TIMER模塊的輸入捕獲功能,LSI 時鐘內部連接到TIMER 的一個輸入捕獲通道,當分別使用 HSE 或者 HSI 作為計數時鐘時,通過檢測 LSI 的頻率是否在正常範圍內,從而間接地檢測了 HSE/HSI 的頻率。

不同 STM32 系列用到 TIMER 模塊不一樣,具體請查看相應的參考手冊。

SRAM奇偶校驗位

部分STM32系列支持帶奇偶校驗的SRAM。

奇偶校驗可以用來檢測SRAM的瞬時和永久性故障。比如由於電磁干擾導致的SRAM中的數據錯誤。由於奇偶校驗的檢測原理,使得它只能檢測出奇數個的比特位錯誤,並且也不能對錯誤數據進行糾正。

STM32 MCU帶奇偶校驗的SRAM每個字節增加了一位奇偶校驗位,所以SRAM的數據總線是36位。在對SRAM進行寫操作時,硬體自動計算並存儲奇偶校驗;當進行讀操作時,硬體自動進行校驗。

如果檢測到錯誤,會立刻產生不可屏蔽中斷(NMI),並且可以配置成可以觸發定時器的「剎車」功能。

硬體ECC

ECC 全稱 Error Checking and Correcting,是一種錯誤檢查和糾正的技術。跟奇偶校驗一樣,它也需要額外的空間來存儲校驗碼。比奇偶校驗更強的是,ECC可以做到單比特位錯誤校正和雙比特位錯誤檢測。對於由於電磁干擾等原因造成的內存瞬時故障或者永久性故障,ECC 都可以檢測。

ECC 檢測在讀操作時進行,當檢測到一個比特位的錯誤時,讀出來的數據就是已經糾正後的數據,當檢測到兩個比特位的錯誤時,ECC 無法糾正,但是可以告訴應用程式該位置的數據有錯。

STM32 部分 MCU 系列(STM32H7/L4/G0/G4/L5)支持 Flash ECC,現在只有 H7 支持 SRAM ECC 和 Cache ECC。

當檢測到單比特/雙比特 ECC 錯誤時,出錯地址會被自動保存到寄存器中(需要使能該功能),並且可以通過寄存器配置產生對應的錯誤中斷。

檢測到雙比特錯誤時,還將觸發 NMI 中斷,並可以將出錯信號連接到 TIMER的「剎車」功能。

參考AN5342了解更多關於ECC的操作細節。

硬體CRC

在Flash自檢的程序中會用到CRC來檢測Flash內容的完整性。

其檢測思路一般是:在程序編譯完成後,計算整個程序的CRC值(第一次計算CRC值),然後將這個CRC值添加到可執行文件末尾。再將帶有CRC校驗值的可執行文件燒錄到MCU中。在程序啟動後,由程序中的自檢代碼重新根據當前Flash里內容(不包括預存的CRC校驗值)計算一次CRC值(第二次計算CRC值),再與之前預先計算並燒錄到Flash中的CRC校驗值(第一次計算的值)進行比較,如果一致就通過檢測。

第二次計算CRC值的時候是由運行在MCU中的自檢程序完成的,這部分工作可以利用軟體代碼完成,也可以利用MCU的硬體CRC完成。STM32的全系列都提供了硬體 CRC 的功能,默認使用 CRC32 多項式 0x4C11DB7。

參考AN4187了解更多關於CRC的使用細節。

存儲器保護單元MPU

存儲器保護單元MPU是Cortex-M內部的組件。Cortex-M0不支持MPU,所以除了基於Cortex-M0內核的STM32F0以外,其他STM32產品都支持存儲器保護單元 (MPU)。

MPU可以用來設置部分數據只能被一些特權任務訪問或者是只讀;可以將SRAM空間定義為「不可執行代碼」,從而防止注入攻擊代碼;可以用來檢測堆棧溢出和數組越界;還可以通過MPU設置存儲器的緩衝,緩存,共享等屬性。

在功能安全的應用中,我們可以利用MPU來對安全相關的關鍵數據進行隔離,從而防止其被其他程序意外修改。

關於MPU的使用細節,參考AN4838。

其他

除了前面介紹的這些硬體的功能外,還有: GPIO,Timer,比較器等外設的寄存器鎖定功能,可以配置參數不會被軟體意外修改。

定時器PWM輸出的「剎車」功能,它的目的是保護由PWM信號驅動的功率開關,就是當系統出現故障時,可以觸發該功能,關閉PWM輸出,保證系統處於安全狀態。

而觸發「剎車」功能的輸入信號,既可以是來自MCU內部的系統級故障(比如CSS檢測到的時鐘失效,SRAM的奇偶校驗錯誤等),也可以是連接到特定引腳的外部信號。不同的STM32系列支持的輸入信號來源不同,具體使用請見相應的參考手冊。

部分STM32系列還支持「內核進入lockup狀態」作為「剎車」功能的觸發源。關於「內核進入lockup狀態」是指,當MCU已經因為出錯進入fault中斷後,在fault中斷服務程序中又觸犯了fault條件,這時就會進入lockup狀態。

還有一些外設比如串口,I2C,CAN等,也內置有協議錯誤檢測,CRC校驗等功能,可以用於該外設使用過程中的安全檢測。

STM32內置安全屬性還很多,這裡就不一一列舉了。

可以參考各個STM32系列的安全手冊,來獲取詳細的信息。

關鍵字: