1、STM32對內部Flash的保護措施所有STM32的芯片都提供對Flash的保護,防止對Flash的非法訪(fǎng)問(wèn) - 寫(xiě)保護和讀保護。
1)、讀保護即大家通常說(shuō)的“加密”,是作用于整個(gè)Flash存儲區域。一旦設置了Flash的讀保護,內置的Flash存儲區只能通過(guò)程序的正常執行才能讀出,而不能通過(guò)下述任何一種方式讀出:
通過(guò)調試器(JTAG或SWD);
從RAM中啟動(dòng)并執行的程序;
2)、寫(xiě)保護是以四頁(yè)(1KB/頁(yè)) Flash存儲區為單位提供寫(xiě)保護,對被保護的頁(yè)實(shí)施編程或擦除操作將不被執行,同時(shí)產(chǎn)生操作錯誤標志。
讀與寫(xiě)設置的效果見(jiàn)下表:
讀保護寫(xiě)保護對Flash的操作功能
有效 有效 CPU只能讀,禁止調試和非法訪(fǎng)問(wèn)。
有效 無(wú)效 CPU可以讀寫(xiě),禁止調試和非法訪(fǎng)問(wèn),頁(yè)0~3為寫(xiě)保護。
無(wú)效 有效 CPU可讀,允許調試和非法訪(fǎng)問(wèn)。
無(wú)效 無(wú)效 CPU可以讀寫(xiě),允許調試和非法訪(fǎng)問(wèn)。
2、當Flash讀保護生效時(shí),CPU執行程序可以讀受保護的Flash區,但存在兩個(gè)例外情況:
1)、調試執行程序時(shí);
2)、從RAM啟動(dòng)并執行程序時(shí)
STM32還提供了一個(gè)特別的保護,即對Flash存儲區施加讀保護后,即使沒(méi)有啟用寫(xiě)保護,Flash的第 0 ~ 3 頁(yè)也將處于寫(xiě)保護狀態(tài),這是為了防止修改復位或中斷向量而跳轉到RAM區執行非法程序代碼。
3、Flash保護相關(guān)函數
FLASH_Unlock();//Flash解鎖
FLASH_ReadOutProtection(DISABLE);//Flash讀保護禁止
FLASH_ReadOutProtection(ENABLE);//Flash讀保護允許
本文引用地址:http://dyxdggzs.com/article/201611/321886.htm4、stm32置讀保護跟清讀保護操作
功能:讀保護設置后將不能讀出flash的內容;當解除讀保護的時(shí)候stm32會(huì )自動(dòng)擦出整篇flash;
讀保護設置:在程序的開(kāi)頭加入“讀保護”代碼,即實(shí)現了讀保護功能;(每次程序運行先開(kāi)保護)
解除讀保護:解除讀保護可以設置在按鍵里面,方便實(shí)現解鎖,也不可不設按鍵在RAM中執行程序再清除讀保護;
(1)設置讀保護:
intmain(void)
{
....
if(FLASH_GetReadOutProtectionStatus()!=SET)
{
//FLASH_Unlock();不解鎖FALSH也可設置讀保護???
FLASH_ReadOutProtection(ENABLE);
}
......
while(1)
{
.....
}
}
這個(gè)寫(xiě)到程序當中并執行過(guò)后,使用j-link就不能‘讀出’程序了,就是‘讀保護’了!沒(méi)有使用此程序可以讀出下載到芯片中的程序,但是如果使用了此程序就無(wú)法讀出程序了。但是也無(wú)法再次燒寫(xiě)新的程序到芯片中了(要測試請慎重?。。。。。。?/p>
可以在主程序當中設置一按鍵專(zhuān)門(mén)清除“讀保護”,一旦按下按鍵則清除“讀保護”時(shí)芯片可以重新被燒寫(xiě)。
(2)解除讀保護:在程序中的某個(gè)操作中(如按鍵等)加入如下代碼,執行后
代碼自己殺死了自己!
if(FLASH_GetReadOutProtectionStatus()!=RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}
這些函數在stm32f10x_flash里面,注意:調用上面這個(gè)庫的時(shí)候需在#include"stm32f10x_flash.h"前加#define_FLASH_PROG;否則報(沒(méi)有定義)錯。
如果你沒(méi)有做按鍵清除讀保護這一步還有方法二補救:專(zhuān)門(mén)寫(xiě)一個(gè)清除“讀保護”程序,使用RAM中運行程序的方法,運行此程序解鎖“讀保護”,執行后,FLASH會(huì )自動(dòng)全部擦除。代碼如下:
intmain(void)
{
Chinp_Init();
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}
※對于在RAM中運行程序,說(shuō)明如下:
(1)我使用IAR+J-Link,不用把Boot0和boot1腳設置成從RAM啟動(dòng)也可在RAM中調試(我是設置成從FLASH啟動(dòng))。
(2)在IAR環(huán)境中設置Link文件為lnkarm_ram.xcl
(3)Debuger選項Downloadtab中勾全部去掉。
按上面設置完成后,按Debug按鈕,執行上面程序,讀保護可解除。
*************************華麗麗的分割線(xiàn)***********************************************
if(FLASH_GetReadOutProtectionStatus()==RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
}
*************************華麗麗的分割線(xiàn)***********************************************
if(FLASH_GetReadOutProtectionStatus()==SET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}
CPUFlash讀保護使能后,仿真器調試會(huì )失敗。J-LINK有個(gè)解鎖菜單,需要解鎖才能正常再次燒寫(xiě)程序。當然解鎖會(huì )導致Flash內容被全部擦出。
啟動(dòng)"J-FlashARM"工具,Target->unsercurechip就解除了芯片的讀保護。Target->unsercurechip后一定要上電復位,系統不復位是不行的。
評論