關(guān)于STM32對內(nèi)部Flash的保護
為了防止對Flash的非法訪問,所有STM32的芯片都提供對Flash的保護,具體分為寫保護和讀保護。
如果對Flash設(shè)置了寫保護,那就無法對Flash進行編程和擦除。在開發(fā)STM32的時候,如果出現(xiàn)這種情況,通常仿真器都支持對Flash進行解鎖,像jlink,stlink等仿真器都支持這個功能。
在使用MDK進行調(diào)試的時候,可能會遇到如下圖所示的報錯信息,這時候就要排查Flash是不是被保護起來了。

讀保護即大家通常說的“加密”,是作用于整個Flash存儲區(qū)域,相關(guān)文章:STM32等單片機程序加密的方法。一旦設(shè)置了Flash的讀保護,內(nèi)置的Flash存儲區(qū)只能通過程序的正常執(zhí)行才能讀出,而不能通過下述任何一種方式讀出:
-
通過調(diào)試器(JTAG或SWD)
-
從RAM中啟動并執(zhí)行的程序
寫保護是以四頁(1KB/頁) Flash存儲區(qū)為單位提供寫保護,對被保護的頁實施編程或擦除操作將不被執(zhí)行,同時產(chǎn)生操作錯誤標(biāo)志,讀與寫設(shè)置的效果見下表:

當(dāng)Flash讀保護生效時,CPU執(zhí)行程序可以讀受保護的Flash區(qū),但存在兩個例外情況:
-
調(diào)試執(zhí)行程序時
-
從RAM啟動并執(zhí)行程序時
STM32還提供了一個特別的保護,即對Flash存儲區(qū)施加讀保護后,即使沒有啟用寫保護,F(xiàn)lash的第 0 ~ 3 頁也將處于寫保護狀態(tài),這是為了防止修改復(fù)位或中斷向量而跳轉(zhuǎn)到RAM區(qū)執(zhí)行非法程序代碼。
Flash保護的相關(guān)函數(shù)
FLASH_Unlock(); //Flash解鎖FLASH_ReadOutProtection(DISABLE); //Flash讀保護禁止FLASH_ReadOutProtection(ENABLE); //Flash讀保護允許
STM32如何設(shè)置讀保護和解除讀保護?
讀保護設(shè)置后將不能讀出Flash中的內(nèi)容。
如何設(shè)置讀保護
在程序的開頭加入“設(shè)置讀保護”的代碼即可,每次運行代碼時都檢查一下,如果沒有開就打開,如果打開了就跳過。其中,設(shè)置讀保護的代碼如下:
int main(void){...if (FLASH_GetReadOutProtectionStatus()!=SET)//檢查設(shè)置讀保護與否{FLASH_Unlock(); //寫保護時可以不用這句話,可用可不用FLASH_ReadOutProtection(ENABLE); //設(shè)置讀保護}...while(1){...}}
上面的代碼執(zhí)行后,使用j-link就不能讀出程序了,實現(xiàn)了代碼讀保護。需要注意的是,芯片讀保護后無法再次燒寫新的程序到Flash中,必須要解除讀保護才可以。但是當(dāng)解除讀保護的時候STM32會自動擦除整個Flash,起到保護數(shù)據(jù)的作用。
通過代碼解除Flash保護
解除讀保護可以設(shè)置在按鍵里面,方便實現(xiàn)解鎖,也可以設(shè)置在命令中。如下是解除讀保護代碼:

程序中設(shè)置一個按鍵或者命令,可以隨時解除Flash的讀保護,讓芯片又可以重新燒錄程序。如果沒有留,還可以專門寫一個程序,下載到RAM中去運行,用來解除讀保護。
注意:執(zhí)行后,F(xiàn)lash會自動全部擦除。
int main(void){Chip_Init();FLASH_Unlock(); //不解鎖FALSH也可設(shè)置讀保護,可用可不用FLASH_ReadOutProtection(DISABLE);}
通過ST-LinkUtility來解除Flash保護
在STLink連接目標(biāo)板的情況下打開程序燒寫軟件ST-Link Utility,在菜單欄的Target下選擇connect,因為這時候Flash已經(jīng)被鎖住了,能看到如下圖所示的錯誤提示。

下面來操作如何解除Flash保護。
請確保當(dāng)前已經(jīng)正確連接了STLink和目標(biāo)板,在菜單欄Target里打開Option Bytes...選項,發(fā)現(xiàn)在這里Read Out Protection選項是Enable,這個表示無法通過SWD讀取STM32內(nèi)部Flash的程序。

將Read Out Protection選項設(shè)置為Disable,并點擊Apply。
這時候Flash已經(jīng)成功解鎖了,跟上文提到的解除Flash保護的結(jié)果一樣,內(nèi)部Flash已經(jīng)被擦除了,如下圖紅框中所示。

完成以上步驟之后,在菜單欄Target下選擇Disconnect斷開與目標(biāo)板連接。
重新進入MDK,可以正常對目標(biāo)板燒寫程序了。
通過ST-LinkUtility來設(shè)置Flash保護

在菜單欄Target里打開Option Bytes...選項,可以看到下面有Flash sector protection選項。選擇Select all之后,發(fā)現(xiàn)所有Page的Protection項都已經(jīng)變成Write Protection了,只要選擇Apply選項就可以對Flash進行寫保護,如上圖所示。
審核編輯 :李倩
-
FlaSh
+關(guān)注
關(guān)注
10文章
1748瀏覽量
155514 -
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373415 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
328瀏覽量
25086
原文標(biāo)題:STM32的Flash寫了保護怎么辦?
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
三防漆不固化怎么辦?從材料到工藝的排查指南 |鉻銳特實業(yè)
STM32讀保護的解除和出現(xiàn)的原因,使用串口和ST-LINK Utility解除讀保護
CW32F030 FLASH的讀保護功能
使用單片機系統(tǒng)時間不準(zhǔn)怎么辦?
FLASH 存儲器4級讀保護等級的設(shè)置
STM32C011開發(fā)(3)----Flash操作
Flash讀保護怎么實現(xiàn)?
FPGA的Jtag接口燒了,怎么辦?
STM32的Flash寫了保護怎么辦?
評論