STM32內(nèi)置的硬件功能安全屬性,你用過(guò)哪些
概覽
本文引用地址:http://2s4d.com/article/202304/445477.htm對(duì)于功能安全,ST MCU從芯片內(nèi)置的硬件安全屬性,經(jīng)過(guò)認(rèn)證的軟件自檢庫(kù)和完備的安全文檔三個(gè)層面來(lái)支持STM32用戶在系統(tǒng)級(jí)進(jìn)行開(kāi)發(fā),達(dá)到要求的功能安全等級(jí)。
下表中列出了STM32 MCU內(nèi)置的一些主要硬件安全屬性。下面我們一起來(lái)看看這些屬性在功能安全中的用處。
雙看門狗:獨(dú)立看門狗和窗口看門狗
看門狗是我們常用到的針對(duì)CPU運(yùn)行狀態(tài)監(jiān)測(cè)的手段之一。它本質(zhì)上就是一個(gè)定時(shí)器,啟動(dòng)之后,需要不斷的去刷新(我們通常把這個(gè)動(dòng)作叫做“喂狗”),否則當(dāng)看門狗的定時(shí)器減到規(guī)定的值后,就會(huì)引起系統(tǒng)復(fù)位。我們可以利用它來(lái)檢測(cè)程序是否跑飛,并通過(guò)芯片復(fù)位,來(lái)讓系統(tǒng)恢復(fù)到正常狀態(tài)。
STM32 MCU提供兩個(gè)看門狗:獨(dú)立看門狗和窗口看門狗。
從獨(dú)立看門狗的名字可以看出,它的特點(diǎn)是擁有獨(dú)立于系統(tǒng)時(shí)鐘的時(shí)鐘。獨(dú)立看門狗使用LSI時(shí)鐘,這樣使得它與系統(tǒng)時(shí)鐘分離開(kāi),即使系統(tǒng)時(shí)鐘出現(xiàn)故障,獨(dú)立看門狗也能正常工作。
獨(dú)立看門狗還支持“硬件看門狗”功能,通過(guò)選項(xiàng)字使能該功能后,MCU只要一上電,就會(huì)啟動(dòng)運(yùn)行,開(kāi)啟對(duì)系統(tǒng)的保護(hù)。
窗口看門狗使用的是系統(tǒng)時(shí)鐘,它的特點(diǎn)是必須在一個(gè)窗口時(shí)間內(nèi)完成“喂狗”的動(dòng)作,否則就會(huì)引起系統(tǒng)復(fù)位,所以窗口看門狗對(duì)“喂狗”的要求更精確了。
窗口看門狗還有一個(gè)EWI(early wakeup interrupt)的功能, 這個(gè)功能使能后,可以在窗口看門狗引起系統(tǒng)復(fù)位之前,先產(chǎn)生一個(gè)EWI中斷,在這個(gè)中斷里,給了系統(tǒng)軟件一個(gè)機(jī)會(huì)去完成一些必要的安全動(dòng)作或者數(shù)據(jù)保存的工作。
部分MCU系列的窗口看門狗也支持“硬件看門狗”的功能。
獨(dú)立看門狗和窗口看門狗都支持在調(diào)試模式下“凍結(jié)”計(jì)數(shù),以及在低功耗模式下繼續(xù)工作的功能。
看門狗可以用在內(nèi)核檢測(cè),時(shí)鐘檢測(cè)和電源檢測(cè)中。
電源監(jiān)測(cè)
關(guān)于電源檢測(cè),STM32 MCU的可編程電壓監(jiān)測(cè)(PVD),模擬電壓監(jiān)測(cè)(AVD)和電池電壓監(jiān)測(cè)等功能可以用來(lái)檢測(cè)VDD,VDDA和電池電壓是否在正常的電壓范圍內(nèi)。
時(shí)鐘安全系統(tǒng)CSS
關(guān)于時(shí)鐘的檢測(cè),MCU內(nèi)部的時(shí)鐘安全系統(tǒng)(CSS)可以用來(lái)檢測(cè)外部高速時(shí)鐘(HSE)和外部低速時(shí)鐘(LSE)是否丟失。
當(dāng)檢測(cè)到HSE時(shí)鐘丟失后,CSS可以觸發(fā)定時(shí)器的“剎車”功能和系統(tǒng)中斷,并自動(dòng)切換到內(nèi)部高速時(shí)鐘,軟件可以根據(jù)這些觸發(fā)的事件,制定相應(yīng)的保護(hù)措施。
LSE是RTC的時(shí)鐘源,當(dāng)檢測(cè)到LSE丟失后,RTC不能再使用LSE時(shí)鐘源,并產(chǎn)生CSS中斷,在中斷中需要將RTC切換到其他時(shí)鐘源。
CSS只能檢測(cè)時(shí)鐘是否丟失。對(duì)于時(shí)鐘存在但發(fā)生偏移的情況,可以通過(guò)下圖所示的時(shí)鐘交叉測(cè)試來(lái)進(jìn)行檢測(cè)。
該測(cè)試?yán)昧薓CU的TIMER模塊的輸入捕獲功能,LSI時(shí)鐘內(nèi)部連接到TIMER的一個(gè)輸入捕獲通道,當(dāng)分別使用HSE或者HSI作為計(jì)數(shù)時(shí)鐘時(shí),通過(guò)檢測(cè)LSI的頻率是否在正常范圍內(nèi),從而間接地檢測(cè)了HSE/HSI的頻率。
不同STM32系列用到TIMER模塊不一樣,具體請(qǐng)查看相應(yīng)的參考手冊(cè)。
SRAM奇偶校驗(yàn)位
部分STM32系列支持帶奇偶校驗(yàn)的SRAM。
奇偶校驗(yàn)可以用來(lái)檢測(cè)SRAM的瞬時(shí)和永久性故障。比如由于電磁干擾導(dǎo)致的SRAM中的數(shù)據(jù)錯(cuò)誤。由于奇偶校驗(yàn)的檢測(cè)原理,使得它只能檢測(cè)出奇數(shù)個(gè)的比特位錯(cuò)誤,并且也不能對(duì)錯(cuò)誤數(shù)據(jù)進(jìn)行糾正。
STM32 MCU帶奇偶校驗(yàn)的SRAM每個(gè)字節(jié)增加了一位奇偶校驗(yàn)位,所以SRAM的數(shù)據(jù)總線是36位。在對(duì)SRAM進(jìn)行寫操作時(shí),硬件自動(dòng)計(jì)算并存儲(chǔ)奇偶校驗(yàn);當(dāng)進(jìn)行讀操作時(shí),硬件自動(dòng)進(jìn)行校驗(yàn)。
如果檢測(cè)到錯(cuò)誤,會(huì)立刻產(chǎn)生不可屏蔽中斷(NMI),并且可以配置成可以觸發(fā)定時(shí)器的“剎車”功能。
硬件ECC
ECC全稱Error Checking and Correcting,是一種錯(cuò)誤檢查和糾正的技術(shù)。跟奇偶校驗(yàn)一樣,它也需要額外的空間來(lái)存儲(chǔ)校驗(yàn)碼。比奇偶校驗(yàn)更強(qiáng)的是,ECC可以做到單比特位錯(cuò)誤校正和雙比特位錯(cuò)誤檢測(cè)。對(duì)于由于電磁干擾等原因造成的內(nèi)存瞬時(shí)故障或者永久性故障,ECC都可以檢測(cè)。
ECC檢測(cè)在讀操作時(shí)進(jìn)行,當(dāng)檢測(cè)到一個(gè)比特位的錯(cuò)誤時(shí),讀出來(lái)的數(shù)據(jù)就是已經(jīng)糾正后的數(shù)據(jù),當(dāng)檢測(cè)到兩個(gè)比特位的錯(cuò)誤時(shí),ECC無(wú)法糾正,但是可以告訴應(yīng)用程序該位置的數(shù)據(jù)有錯(cuò)。
STM32部分MCU系列(STM32H7/L4/G0/G4/L5)支持Flash ECC,現(xiàn)在只有H7支持SRAM ECC和Cache ECC。
當(dāng)檢測(cè)到單比特/雙比特ECC錯(cuò)誤時(shí),出錯(cuò)地址會(huì)被自動(dòng)保存到寄存器中(需要使能該功能),并且可以通過(guò)寄存器配置產(chǎn)生對(duì)應(yīng)的錯(cuò)誤中斷。
檢測(cè)到雙比特錯(cuò)誤時(shí),還將觸發(fā)NMI中斷,并可以將出錯(cuò)信號(hào)連接到TIMER的“剎車”功能。
參考AN5342了解更多關(guān)于ECC的操作細(xì)節(jié)。
硬件CRC
在Flash自檢的程序中會(huì)用到CRC來(lái)檢測(cè)Flash內(nèi)容的完整性。
其檢測(cè)思路一般是:在程序編譯完成后,計(jì)算整個(gè)程序的CRC值(第一次計(jì)算CRC值),然后將這個(gè)CRC值添加到可執(zhí)行文件末尾。再將帶有CRC校驗(yàn)值的可執(zhí)行文件燒錄到MCU中。在程序啟動(dòng)后,由程序中的自檢代碼重新根據(jù)當(dāng)前Flash里內(nèi)容(不包括預(yù)存的CRC校驗(yàn)值)計(jì)算一次CRC值(第二次計(jì)算CRC值),再與之前預(yù)先計(jì)算并燒錄到Flash中的CRC校驗(yàn)值(第一次計(jì)算的值)進(jìn)行比較,如果一致就通過(guò)檢測(cè)。
第二次計(jì)算CRC值的時(shí)候是由運(yùn)行在MCU中的自檢程序完成的,這部分工作可以利用軟件代碼完成,也可以利用MCU的硬件CRC完成。STM32的全系列都提供了硬件CRC的功能,默認(rèn)使用CRC32多項(xiàng)式0x4C11DB7。
參考AN4187了解更多關(guān)于CRC的使用細(xì)節(jié)。
存儲(chǔ)器保護(hù)單元MPU
存儲(chǔ)器保護(hù)單元MPU是Cortex-M內(nèi)部的組件。Cortex-M0不支持MPU,所以除了基于Cortex-M0內(nèi)核的STM32F0以外,其他STM32產(chǎn)品都支持存儲(chǔ)器保護(hù)單元(MPU)。
MPU可以用來(lái)設(shè)置部分?jǐn)?shù)據(jù)只能被一些特權(quán)任務(wù)訪問(wèn)或者是只讀;可以將SRAM空間定義為“不可執(zhí)行代碼”,從而防止注入攻擊代碼;可以用來(lái)檢測(cè)堆棧溢出和數(shù)組越界;還可以通過(guò)MPU設(shè)置存儲(chǔ)器的緩沖、緩存、共享等屬性。
在功能安全的應(yīng)用中,我們可以利用MPU來(lái)對(duì)安全相關(guān)的關(guān)鍵數(shù)據(jù)進(jìn)行隔離,從而防止其被其他程序意外修改。
關(guān)于MPU的使用細(xì)節(jié),參考AN4838。
其他
除了前面介紹的這些硬件的功能外,還有: GPIO、Timer、比較器等外設(shè)的寄存器鎖定功能,可以配置參數(shù)不會(huì)被軟件意外修改。
定時(shí)器PWM輸出的“剎車”功能,它的目的是保護(hù)由PWM信號(hào)驅(qū)動(dòng)的功率開(kāi)關(guān),就是當(dāng)系統(tǒng)出現(xiàn)故障時(shí),可以觸發(fā)該功能,關(guān)閉PWM輸出,保證系統(tǒng)處于安全狀態(tài)。
而觸發(fā)“剎車”功能的輸入信號(hào),既可以是來(lái)自MCU內(nèi)部的系統(tǒng)級(jí)故障(比如CSS檢測(cè)到的時(shí)鐘失效,SRAM的奇偶校驗(yàn)錯(cuò)誤等),也可以是連接到特定引腳的外部信號(hào)。不同的STM32系列支持的輸入信號(hào)來(lái)源不同,具體使用請(qǐng)見(jiàn)相應(yīng)的參考手冊(cè)。
部分STM32系列還支持“內(nèi)核進(jìn)入lockup狀態(tài)”作為“剎車”功能的觸發(fā)源。關(guān)于“內(nèi)核進(jìn)入lockup狀態(tài)”是指,當(dāng)MCU已經(jīng)因?yàn)槌鲥e(cuò)進(jìn)入fault中斷后,在fault中斷服務(wù)程序中又觸犯了fault條件,這時(shí)就會(huì)進(jìn)入lockup狀態(tài)。
還有一些外設(shè)比如串口、I2C、CAN等,也內(nèi)置有協(xié)議錯(cuò)誤檢測(cè)、CRC校驗(yàn)等功能,可以用于該外設(shè)使用過(guò)程中的安全檢測(cè)。
STM32內(nèi)置安全屬性還很多,這里就不一一列舉了。
可以參考各個(gè)STM32系列的安全手冊(cè),來(lái)獲取詳細(xì)的信息。
評(píng)論