stm32对flash的读写保护与解除
一、STM32對內(nèi)部Flash的保護(hù)措施 ?
? ? ? ? 所有STM32的芯片都提供對Flash的保護(hù),防止對Flash的非法訪問 - 寫保護(hù)和讀保護(hù)。?
? ? ? ? 1、讀保護(hù)即大家通常說的“加密”,是作用于整個Flash存儲區(qū)域。一旦設(shè)置了Flash的讀保護(hù),內(nèi)置的Flash存儲區(qū)只能通過程序的正常執(zhí)行才能讀出,而不能通過下述任何一種方式讀出:A、 通過調(diào)試器(JTAG或SWD); B、從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)試和非法訪問。 |
二、當(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í)行非法程序代碼。?
三、Flash保護(hù)的相關(guān)函數(shù)?
? ?FLASH_Unlock(); ? //Flash解鎖?
? ?FLASH_ReadOutProtection(DISABLE); ?//Flash讀保護(hù)禁止 ??
? ?FLASH_ReadOutProtection(ENABLE); ? //Flash讀保護(hù)允許
四、stm32設(shè)置讀保護(hù)和解除讀保護(hù)操作
1、功能:讀保護(hù)設(shè)置后將不能讀出flash中的內(nèi)容;當(dāng)解除讀保護(hù)的時候stm32會自動擦除整個flash,起到保護(hù)數(shù)據(jù)的作用。
2、設(shè)置讀保護(hù):在程序的開頭加入“設(shè)置讀保護(hù)”的代碼即可,每次運(yùn)行代碼時都檢查一下,如果沒有開就打開,如果打開了就跳過。
3、解除讀保護(hù):解除讀保護(hù)可以設(shè)置在按鍵里面,方便實(shí)現(xiàn)解鎖,也可以設(shè)置在命令中。
4、設(shè)置讀保護(hù)的代碼:
int main(void)
{...if (FLASH_GetReadOutProtectionStatus()!=SET) //檢查設(shè)置讀保護(hù)與否 { FLASH_Unlock(); //寫保護(hù)時可以不用這句話,可用可不用FLASH_ReadOutProtection(ENABLE); //設(shè)置讀保護(hù) }...while(1){...}
}
上面的代碼執(zhí)行后,使用j-link就不能讀出程序了,實(shí)現(xiàn)了代碼讀保護(hù)。
注意:芯片讀保護(hù)后,無法再次燒寫新的程序到flash中,必須要解除讀保護(hù)才可以,測試需謹(jǐn)慎。
5、解除讀保護(hù)代碼:
void Off_Protect(void) //關(guān)閉保護(hù)
{ if(FLASH_GetReadOutProtectionStatus() != RESET){FLASH_Unlock(); //不解鎖FALSH也可設(shè)置讀保護(hù),可用可不用FLASH_ReadOutProtection(DISABLE);FLASH_Lock(); //上鎖 }
}
程序中設(shè)置一個按鍵或者命令,可以隨時解除flash的讀保護(hù),讓芯片又可以重新燒錄程序。如果沒有留,還可以專門寫一個程序,下載到RAM中去運(yùn)行,用來解除讀保護(hù)。執(zhí)行后,flash會自動全部擦除。
int main(void)
{Chip_Init();FLASH_Unlock(); //不解鎖FALSH也可設(shè)置讀保護(hù),可用可不用FLASH_ReadOutProtection(DISABLE);
}
五、測試
下載并執(zhí)行設(shè)置讀保護(hù)代碼后,再次下載程序顯示:
說明已經(jīng)啟動了 讀保護(hù),無法再次下載程序了。
通過ST-LINK Utility連接芯片,提示讀保護(hù),無法讀取flash數(shù)據(jù):
這個時候,需要調(diào)用解除讀保護(hù)的代碼即可恢復(fù)。
?
轉(zhuǎn)載自:https://wenku.baidu.com/view/539f9f0754270722192e453610661ed9ad5155fb.html?rec_flag=default&sxts=1560582755950
總結(jié)
以上是生活随笔為你收集整理的stm32对flash的读写保护与解除的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几种中文分词工具
- 下一篇: 骁龙 7 Gen 3 测试版规格曝光:台