日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32芯片写保护/解除写保护的方法

發(fā)布時間:2023/12/8 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32芯片写保护/解除写保护的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. 寫保護(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ù)代碼如下:

/***************************************************************** Function: Flash_DisableReadProtection* Description: Disable the read protection of user flash area.* Input:* Output:* Return: 1: Read Protection successfully disable* 2: Error: Flash read unprotection failed *****************************************************************/ uint32_t Flash_DisableReadProtection(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_0);/* 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 disable */ return (1);}/* Read Protection successfully disable */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
  • 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。