stm32对flash的读写保护与解除
一、STM32對內部Flash的保護措施 ?
? ? ? ? 所有STM32的芯片都提供對Flash的保護,防止對Flash的非法訪問 - 寫保護和讀保護。?
? ? ? ? 1、讀保護即大家通常說的“加密”,是作用于整個Flash存儲區域。一旦設置了Flash的讀保護,內置的Flash存儲區只能通過程序的正常執行才能讀出,而不能通過下述任何一種方式讀出:A、 通過調試器(JTAG或SWD); B、從RAM中啟動并執行的程序;?
? ? ? ? 2、寫保護是以四頁(1KB/頁) Flash存儲區為單位提供寫保護,對被保護的頁實施編程或擦除操作將不被執行,同時產生操作錯誤標志。 ??
? ?讀與寫設置的效果見下表:?
| 讀保護 | 寫保護 | 對Flash的操作功能 |
| 有效 | 有效 | CPU只能讀,禁止調試和非法訪問。 |
| 有效 | 無效 | CPU可以讀寫,禁止調試和非法訪問,頁0~3為寫保護。 |
| 無效 | 有效 | CPU可讀,允許調試和非法訪問。 |
| 無效 | 無效 | CPU可以讀寫,允許調試和非法訪問。 |
二、當Flash讀保護生效時,CPU執行程序可以讀受保護的Flash區,但存在兩個例外情況:?
? ? ? ? 1、調試執行程序時;?
? ? ? ? 2、從RAM啟動并執行程序時?
? ? ? ? STM32還提供了一個特別的保護,即對Flash存儲區施加讀保護后,即使沒有啟用寫保護,Flash的第 0 ~ 3 頁也將處于寫保護狀態,這是為了防止修改復位或中斷向量而跳轉到RAM區執行非法程序代碼。?
三、Flash保護的相關函數?
? ?FLASH_Unlock(); ? //Flash解鎖?
? ?FLASH_ReadOutProtection(DISABLE); ?//Flash讀保護禁止 ??
? ?FLASH_ReadOutProtection(ENABLE); ? //Flash讀保護允許
四、stm32設置讀保護和解除讀保護操作
1、功能:讀保護設置后將不能讀出flash中的內容;當解除讀保護的時候stm32會自動擦除整個flash,起到保護數據的作用。
2、設置讀保護:在程序的開頭加入“設置讀保護”的代碼即可,每次運行代碼時都檢查一下,如果沒有開就打開,如果打開了就跳過。
3、解除讀保護:解除讀保護可以設置在按鍵里面,方便實現解鎖,也可以設置在命令中。
4、設置讀保護的代碼:
int main(void)
{...if (FLASH_GetReadOutProtectionStatus()!=SET) //檢查設置讀保護與否 { FLASH_Unlock(); //寫保護時可以不用這句話,可用可不用FLASH_ReadOutProtection(ENABLE); //設置讀保護 }...while(1){...}
}
上面的代碼執行后,使用j-link就不能讀出程序了,實現了代碼讀保護。
注意:芯片讀保護后,無法再次燒寫新的程序到flash中,必須要解除讀保護才可以,測試需謹慎。
5、解除讀保護代碼:
void Off_Protect(void) //關閉保護
{ if(FLASH_GetReadOutProtectionStatus() != RESET){FLASH_Unlock(); //不解鎖FALSH也可設置讀保護,可用可不用FLASH_ReadOutProtection(DISABLE);FLASH_Lock(); //上鎖 }
}
程序中設置一個按鍵或者命令,可以隨時解除flash的讀保護,讓芯片又可以重新燒錄程序。如果沒有留,還可以專門寫一個程序,下載到RAM中去運行,用來解除讀保護。執行后,flash會自動全部擦除。
int main(void)
{Chip_Init();FLASH_Unlock(); //不解鎖FALSH也可設置讀保護,可用可不用FLASH_ReadOutProtection(DISABLE);
}
五、測試
下載并執行設置讀保護代碼后,再次下載程序顯示:
說明已經啟動了 讀保護,無法再次下載程序了。
通過ST-LINK Utility連接芯片,提示讀保護,無法讀取flash數據:
這個時候,需要調用解除讀保護的代碼即可恢復。
?
轉載自:https://wenku.baidu.com/view/539f9f0754270722192e453610661ed9ad5155fb.html?rec_flag=default&sxts=1560582755950
總結
以上是生活随笔為你收集整理的stm32对flash的读写保护与解除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几种中文分词工具
- 下一篇: 调试opencv程序显示应用程序无法正常