STM32芯片写保护/解除写保护的方法
一. 寫保護(hù)
1. 目的
??將Flash設(shè)置為寫保護(hù)的目的,是為了防止其他人通過J-Link,ULINK2等仿真器,將Flash中的程序讀取出來(設(shè)想一下,你辛辛苦苦研發(fā)的產(chǎn)品,別人通過仿真器將程序讀取出來,再copy一下產(chǎn)品的硬件,就可以生產(chǎn))。
??可以通過將Flash設(shè)置為讀保護(hù)來保護(hù)自己的程序。
2. 開發(fā)環(huán)境
適用于STM32F1和F4系列(其他系列沒有用過);
F1系列的庫:STM32F10x_StdPeriph_Lib_V3.5.0
F4系列的庫:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0
開發(fā)環(huán)境使用的MDK,版本5.25
3. 程序
??通過flash_if.c源程序中的FLASH_If_EnableReadProtection()函數(shù)來加密Flash。函數(shù)代碼如下:
/*** @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的主函數(shù)里,加入FLASH_If_EnableReadProtection()函數(shù)調(diào)用,加密Flash。
??加密后,無法再通過仿真器來Debug或燒寫程序,只能通過串口等IAP方式來燒寫用戶程序。
??工程需要添加flash_if.h和flash_if.c文件。
二. 解除寫保護(hù)
有兩種方法可以解除Flash的寫保護(hù)。
1. 建立MDK工程,程序設(shè)置為SRAM啟動,在程序中解除Flash的鎖定。
以作者最近使用的STM32F412為例,新建MDK工程,設(shè)置Target選項(xiàng)卡:
配置C/C++選項(xiàng)卡,根據(jù)芯片型號,包含對應(yīng)宏定義;預(yù)編譯宏VECT_TAB_SRAM為必添加項(xiàng)。
添加初始化文件路徑:G:\ProgrammeFiles\Keil5\ARM\Pack\Keil\STM32F4xx_DFP\2.13.0\MDK\Boards\Keil\MCBSTM32F400\Blinky\Debug_RAM.ini (MDK的安裝路徑不同這里有所不同)
在main函數(shù)中調(diào)用Flash_DisableReadProtection()函數(shù),函數(shù)代碼如下:
- 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
該函數(shù)調(diào)用完成后,Flash芯片也已經(jīng)解鎖成功。
Flash芯片內(nèi)的程序會被清除。
2. 通過J-Flash解鎖
1中的方法需要自己新建MDK工程,比較繁瑣。
可以通過JFlash軟件,配合JLink仿真器來解鎖。
JFlash軟件的下載網(wǎng)址為:
https://www.segger.com/downloads/jlink/JLink_Windows.exe
下載安裝后,在安裝目錄下會看到JFlash軟件
打開JFlash,選擇Create a new project
注意:在彈出的Create New Project對話框中,Speed(kHz)默認(rèn)是4000,即4MH在,一定要選擇200k以下。
因?yàn)镾WD總線布線太長或者不規(guī)范,若使用默認(rèn)的下載速度(4MHZ),下載或者擦除芯片時會導(dǎo)致出現(xiàn)下述錯誤。
??在Target Device中選擇對應(yīng)要解鎖的芯片。
??以本人所用的STM32F412CE為例,Flash size為512KB,本應(yīng)選擇STM32F411CE,由于STM32F411CE的Flash size為512KB+16MB,因此,選擇STM32F411VE。
??只要Flash size大小與要解鎖的芯片的Flash大小一致,Device可以不一致。
通過SWD將芯片與JLink連接后,選擇Target-Connect即可連接成功。
再選擇Target-Manual Programming-Erase Chip,即可解除芯片的Flash鎖定狀態(tài)。
不過Flash內(nèi)的所有數(shù)據(jù)都會被清除。
?
參考網(wǎng)上文章《STM32-讀保護(hù)功能和清除讀保護(hù)功能設(shè)置》,根據(jù)自己操作。如有侵權(quán),請聯(lián)系我刪除
1、STM32對內(nèi)部Flash的保護(hù)措施?
???所有STM32的芯片都提供對Flash的保護(hù),防止對Flash的非法訪問 - 寫保護(hù)和讀保護(hù)。
???1)、讀保護(hù)即大家通常說的“加密”,是作用于整個Flash存儲區(qū)域。一旦設(shè)置了Flash的讀保護(hù),內(nèi)置的Flash存儲區(qū)只能通過程序的正常執(zhí)行才能讀出,而不能通過下述任何一種方式讀出:
通過調(diào)試器(JTAG或SWD);
從RAM中啟動并執(zhí)行的程序;
???2)、寫保護(hù)是以四頁(1KB/頁) Flash存儲區(qū)為單位提供寫保護(hù),對被保護(hù)的頁實(shí)施編程或擦除操作將不被執(zhí)行,同時產(chǎn)生操作錯誤標(biāo)志。??
???讀與寫設(shè)置的效果見下表:
???讀保護(hù)寫保護(hù)??????對Flash的操作功能
????有效有效 CPU只能讀,禁止調(diào)試和非法訪問。
????有效無效 CPU可以讀寫,禁止調(diào)試和非法訪問,頁0~3為寫保護(hù)。
????無效有效 CPU可讀,允許調(diào)試和非法訪問。
????無效無效 CPU可以讀寫,允許調(diào)試和非法訪問。
2、當(dāng)Flash讀保護(hù)生效時,CPU執(zhí)行程序可以讀受保護(hù)的Flash區(qū),但存在兩個例外情況:
???1)、調(diào)試執(zhí)行程序時;
???2)、從RAM啟動并執(zhí)行程序時
???STM32還提供了一個特別的保護(hù),即對Flash存儲區(qū)施加讀保護(hù)后,即使沒有啟用寫保護(hù),Flash的第 0 ~ 3 頁也將處于寫保護(hù)狀態(tài),這是為了防止修改復(fù)位或中斷向量而跳轉(zhuǎn)到RAM區(qū)執(zhí)行非法程序代碼。
3、Flash保護(hù)相關(guān)函數(shù)
???FLASH_Unlock();???//Flash解鎖
???FLASH_ReadOutProtection(DISABLE);??//Flash讀保護(hù)禁止??
???FLASH_ReadOutProtection(ENABLE);???//Flash讀保護(hù)允許
4、stm32置讀保護(hù)跟清讀保護(hù)操作
??功能:讀保護(hù)設(shè)置后將不能讀出flash?的內(nèi)容;當(dāng)解除讀保護(hù)的時候stm32?會自動擦出整篇flash;
??讀保護(hù)設(shè)置:在程序的開頭加入“讀保護(hù)”代碼,即實(shí)現(xiàn)了讀保護(hù)功能;(每次程序運(yùn)行先開保護(hù))
??解除讀保護(hù):解除讀保護(hù)可以設(shè)置在按鍵里面,方便實(shí)現(xiàn)解鎖,也不可不設(shè)按鍵在RAM中執(zhí)行程序再清除讀保護(hù);
??(1)設(shè)置讀保護(hù):
?int?main(void)
{
????....
??????
????if(FLASH_GetReadOutProtectionStatus()?!=?SET)
????{
????????//FLASH_Unlock();不解鎖FALSH也可設(shè)置讀保護(hù)???
????????FLASH_ReadOutProtection(ENABLE);???
????}
????......
????while(1)
????{
???????.....
?????}
}
????這個寫到程序當(dāng)中并執(zhí)行過后,使用j-link就不能‘讀出’程序了,就是‘讀保護(hù)’了!沒有使用此程序可以讀出下載到芯片中的程序,但是如果使用了此程序就無法讀出程序了。但是也無法再次燒寫新的程序到芯片中了(要測試請慎重!!!!!!)
??可以在主程序當(dāng)中設(shè)置一按鍵專門清除“讀保護(hù)”,一旦按下按鍵則清除“讀保護(hù)”時芯片可以重新被燒寫。
??(2)解除讀保護(hù):在程序中的某個操作中(如按鍵等)加入如下代碼,執(zhí)行后
代碼自己殺死了自己!
if(FLASH_GetReadOutProtectionStatus()?!=?RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}
???這些函數(shù)在stm32f10x_flash?里面,注意:調(diào)用上面這個庫的時候需在#include?"stm32f10x_flash.h"前加#define?_FLASH_PROG;否則報(bào)(沒有定義)錯。
???如果你沒有做按鍵清除讀保護(hù)這一步還有方法二補(bǔ)救:專門寫一個清除“讀保護(hù)”程序,使用RAM中運(yùn)行程序的方法,運(yùn)行此程序解鎖“讀保護(hù)”,執(zhí)行后,FLASH會自動全部擦除。代碼如下:
int?main(void)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);?
??while (1)
??{
? };
}
※對于在RAM中運(yùn)行程序,說明如下:
(1)我使用IAR?+?J-Link,不用把Boot0和boot1腳設(shè)置成從RAM啟動也可在RAM中調(diào)試(我使用IAR沒有RAM中運(yùn)行選項(xiàng))。
(2)在IAR環(huán)境中設(shè)置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選項(xiàng)Download?tab中勾全部去掉。
按上面設(shè)置完成后,按Debug按鈕,執(zhí)行上面程序,讀保護(hù)可解除。
(4)點(diǎn)擊下載運(yùn)行時。可能會提示錯誤(有時不提示)
當(dāng)下載時,提示 CRC校驗(yàn)失敗,選擇 NO(右邊)。
當(dāng)下載時,提示無法擦除 sector 0,選擇NO(右邊)
(5)運(yùn)行前使用J-Flash?ARM"工具,Target->unsercure?chip 解除了芯片的讀保護(hù)。不然會出現(xiàn)上述各種報(bào)錯。
if?(FLASH_GetReadOutProtectionStatus()?==?RESET)?
{
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);?
}
if?(FLASH_GetReadOutProtectionStatus()?==?SET)?
{?
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);?
}
CPU?Flash讀保護(hù)使能后,仿真器調(diào)試會失敗。J-LINK有個解鎖菜單,需要解鎖才能正常再次燒寫程序。當(dāng)然解鎖會導(dǎo)致Flash內(nèi)容被全部擦出。 運(yùn)行
啟動"J-Flash?ARM"工具,Target->unsercure?chip?就解除了芯片的讀保護(hù)。Target->unsercure?chip?后一定要上電復(fù)位,系統(tǒng)不復(fù)位是不行的。
?
總結(jié)
以上是生活随笔為你收集整理的STM32芯片写保护/解除写保护的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用安卓模拟器时提示关闭hyper-v
- 下一篇: 领导合影站位图_领导座次安排图,没有人会