STM32芯片写保护/解除写保护的方法
一. 寫保護
1. 目的
??將Flash設置為寫保護的目的,是為了防止其他人通過J-Link,ULINK2等仿真器,將Flash中的程序讀取出來(設想一下,你辛辛苦苦研發的產品,別人通過仿真器將程序讀取出來,再copy一下產品的硬件,就可以生產)。
??可以通過將Flash設置為讀保護來保護自己的程序。
2. 開發環境
適用于STM32F1和F4系列(其他系列沒有用過);
F1系列的庫:STM32F10x_StdPeriph_Lib_V3.5.0
F4系列的庫:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0
開發環境使用的MDK,版本5.25
3. 程序
??通過flash_if.c源程序中的FLASH_If_EnableReadProtection()函數來加密Flash。函數代碼如下:
/*** @brief Enable the read protection of user flash area.* @param None* @retval 1: Read Protection successfully enable* 2: Error: Flash read unprotection failed*/uint32_t FLASH_If_EnableReadProtection(void){/* Returns the FLASH Read Protection level. */if( FLASH_OB_GetRDP() == RESET ){/* Unlock the Option Bytes */FLASH_OB_Unlock();/* Sets the read protection level. */FLASH_OB_RDPConfig(OB_RDP_Level_1);/* Start the Option Bytes programming process. */ if (FLASH_OB_Launch() != FLASH_COMPLETE){/* Disable the Flash option control register access (recommended to protect the option Bytes against possible unwanted operations) */FLASH_OB_Lock();/* Error: Flash read unprotection failed */return (2);}/* Disable the Flash option control register access (recommended to protect the option Bytes against possible unwanted operations) */FLASH_OB_Lock();/* Read Protection successfully enable */return (1);}/* Read Protection successfully enable */return (1);}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
??一般在BootLoader的主函數里,加入FLASH_If_EnableReadProtection()函數調用,加密Flash。
??加密后,無法再通過仿真器來Debug或燒寫程序,只能通過串口等IAP方式來燒寫用戶程序。
??工程需要添加flash_if.h和flash_if.c文件。
二. 解除寫保護
有兩種方法可以解除Flash的寫保護。
1. 建立MDK工程,程序設置為SRAM啟動,在程序中解除Flash的鎖定。
以作者最近使用的STM32F412為例,新建MDK工程,設置Target選項卡:
配置C/C++選項卡,根據芯片型號,包含對應宏定義;預編譯宏VECT_TAB_SRAM為必添加項。
添加初始化文件路徑:G:\ProgrammeFiles\Keil5\ARM\Pack\Keil\STM32F4xx_DFP\2.13.0\MDK\Boards\Keil\MCBSTM32F400\Blinky\Debug_RAM.ini (MDK的安裝路徑不同這里有所不同)
在main函數中調用Flash_DisableReadProtection()函數,函數代碼如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
該函數調用完成后,Flash芯片也已經解鎖成功。
Flash芯片內的程序會被清除。
2. 通過J-Flash解鎖
1中的方法需要自己新建MDK工程,比較繁瑣。
可以通過JFlash軟件,配合JLink仿真器來解鎖。
JFlash軟件的下載網址為:
https://www.segger.com/downloads/jlink/JLink_Windows.exe
下載安裝后,在安裝目錄下會看到JFlash軟件
打開JFlash,選擇Create a new project
注意:在彈出的Create New Project對話框中,Speed(kHz)默認是4000,即4MH在,一定要選擇200k以下。
因為SWD總線布線太長或者不規范,若使用默認的下載速度(4MHZ),下載或者擦除芯片時會導致出現下述錯誤。
??在Target Device中選擇對應要解鎖的芯片。
??以本人所用的STM32F412CE為例,Flash size為512KB,本應選擇STM32F411CE,由于STM32F411CE的Flash size為512KB+16MB,因此,選擇STM32F411VE。
??只要Flash size大小與要解鎖的芯片的Flash大小一致,Device可以不一致。
通過SWD將芯片與JLink連接后,選擇Target-Connect即可連接成功。
再選擇Target-Manual Programming-Erase Chip,即可解除芯片的Flash鎖定狀態。
不過Flash內的所有數據都會被清除。
?
參考網上文章《STM32-讀保護功能和清除讀保護功能設置》,根據自己操作。如有侵權,請聯系我刪除
1、STM32對內部Flash的保護措施?
???所有STM32的芯片都提供對Flash的保護,防止對Flash的非法訪問 - 寫保護和讀保護。
???1)、讀保護即大家通常說的“加密”,是作用于整個Flash存儲區域。一旦設置了Flash的讀保護,內置的Flash存儲區只能通過程序的正常執行才能讀出,而不能通過下述任何一種方式讀出:
通過調試器(JTAG或SWD);
從RAM中啟動并執行的程序;
???2)、寫保護是以四頁(1KB/頁) Flash存儲區為單位提供寫保護,對被保護的頁實施編程或擦除操作將不被執行,同時產生操作錯誤標志。??
???讀與寫設置的效果見下表:
???讀保護寫保護??????對Flash的操作功能
????有效有效 CPU只能讀,禁止調試和非法訪問。
????有效無效 CPU可以讀寫,禁止調試和非法訪問,頁0~3為寫保護。
????無效有效 CPU可讀,允許調試和非法訪問。
????無效無效 CPU可以讀寫,允許調試和非法訪問。
2、當Flash讀保護生效時,CPU執行程序可以讀受保護的Flash區,但存在兩個例外情況:
???1)、調試執行程序時;
???2)、從RAM啟動并執行程序時
???STM32還提供了一個特別的保護,即對Flash存儲區施加讀保護后,即使沒有啟用寫保護,Flash的第 0 ~ 3 頁也將處于寫保護狀態,這是為了防止修改復位或中斷向量而跳轉到RAM區執行非法程序代碼。
3、Flash保護相關函數
???FLASH_Unlock();???//Flash解鎖
???FLASH_ReadOutProtection(DISABLE);??//Flash讀保護禁止??
???FLASH_ReadOutProtection(ENABLE);???//Flash讀保護允許
4、stm32置讀保護跟清讀保護操作
??功能:讀保護設置后將不能讀出flash?的內容;當解除讀保護的時候stm32?會自動擦出整篇flash;
??讀保護設置:在程序的開頭加入“讀保護”代碼,即實現了讀保護功能;(每次程序運行先開保護)
??解除讀保護:解除讀保護可以設置在按鍵里面,方便實現解鎖,也不可不設按鍵在RAM中執行程序再清除讀保護;
??(1)設置讀保護:
?int?main(void)
{
????....
??????
????if(FLASH_GetReadOutProtectionStatus()?!=?SET)
????{
????????//FLASH_Unlock();不解鎖FALSH也可設置讀保護???
????????FLASH_ReadOutProtection(ENABLE);???
????}
????......
????while(1)
????{
???????.....
?????}
}
????這個寫到程序當中并執行過后,使用j-link就不能‘讀出’程序了,就是‘讀保護’了!沒有使用此程序可以讀出下載到芯片中的程序,但是如果使用了此程序就無法讀出程序了。但是也無法再次燒寫新的程序到芯片中了(要測試請慎重!!!!!!)
??可以在主程序當中設置一按鍵專門清除“讀保護”,一旦按下按鍵則清除“讀保護”時芯片可以重新被燒寫。
??(2)解除讀保護:在程序中的某個操作中(如按鍵等)加入如下代碼,執行后
代碼自己殺死了自己!
if(FLASH_GetReadOutProtectionStatus()?!=?RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}
???這些函數在stm32f10x_flash?里面,注意:調用上面這個庫的時候需在#include?"stm32f10x_flash.h"前加#define?_FLASH_PROG;否則報(沒有定義)錯。
???如果你沒有做按鍵清除讀保護這一步還有方法二補救:專門寫一個清除“讀保護”程序,使用RAM中運行程序的方法,運行此程序解鎖“讀保護”,執行后,FLASH會自動全部擦除。代碼如下:
int?main(void)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);?
??while (1)
??{
? };
}
※對于在RAM中運行程序,說明如下:
(1)我使用IAR?+?J-Link,不用把Boot0和boot1腳設置成從RAM啟動也可在RAM中調試(我使用IAR沒有RAM中運行選項)。
(2)在IAR環境中設置Link文件為lnkarm_ram.xcl或者自己修改STM32F10x_FLASH.icf文件
//define symbol __ICFEDIT_region_ROM_start__ = 0x080000F0; ?//修改為如下:
define symbol __ICFEDIT_region_ROM_start__ = 0x200000F0;
//define symbol __ICFEDIT_region_ROM_end__ ? = 0x0803FFFF; ?//修改為如下
define symbol __ICFEDIT_region_ROM_end__ ? = 0x20001FFF;
?
//define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; //修改為如下
define symbol __ICFEDIT_region_RAM_start__ = 0x20002000;
(3)Debuger選項Download?tab中勾全部去掉。
按上面設置完成后,按Debug按鈕,執行上面程序,讀保護可解除。
(4)點擊下載運行時。可能會提示錯誤(有時不提示)
當下載時,提示 CRC校驗失敗,選擇 NO(右邊)。
當下載時,提示無法擦除 sector 0,選擇NO(右邊)
(5)運行前使用J-Flash?ARM"工具,Target->unsercure?chip 解除了芯片的讀保護。不然會出現上述各種報錯。
if?(FLASH_GetReadOutProtectionStatus()?==?RESET)?
{
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);?
}
if?(FLASH_GetReadOutProtectionStatus()?==?SET)?
{?
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);?
}
CPU?Flash讀保護使能后,仿真器調試會失敗。J-LINK有個解鎖菜單,需要解鎖才能正常再次燒寫程序。當然解鎖會導致Flash內容被全部擦出。 運行
啟動"J-Flash?ARM"工具,Target->unsercure?chip?就解除了芯片的讀保護。Target->unsercure?chip?后一定要上電復位,系統不復位是不行的。
?
總結
以上是生活随笔為你收集整理的STM32芯片写保护/解除写保护的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用安卓模拟器时提示关闭hyper-v
- 下一篇: 领导合影站位图_领导座次安排图,没有人会