STM32可以對存儲在flash上的程序進行讀保護.
• 啟動讀保護后,用戶就不能再讀寫程序了.
• 所以,在燒寫程序之前,需要程序調用關閉讀保護.關閉讀保護后,會自動清空flash上的程序
頭文件位于:#include "stm32f10x_flash.h"
啟動保護,用在main()函數初始化時調用:
void Set_Protect(void) //啟動保護
{
if(FLASH_GetReadOutProtectionStatus() != SET)
{
FLASH_Unlock(); //解鎖
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();//上鎖
}
}
注意:
當代碼第一次調用Set_Protect()函數啟動讀保護時。
期間不能再次調用Off_Protect()函數關閉讀保護,需要重新斷電才能關閉讀保護(因為Flash狀態啟動讀保護后,不能立即設置Status=1)
關閉讀保護,在串口接收某個有效數據或按下某個按鍵時,調用:
void Off_Protect(void) //關閉保護
{
if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock(); //不解鎖FALSH也可設置讀保護
FLASH_ReadOutProtection(DISABLE);
FLASH_Lock();//上鎖
}
}
運行測試
1.第一步,下載程序
51hei.png (44.59 KB, 下載次數: 47)
下載附件
2021-5-27 16:16 上傳
2.下載成功后,再次燒寫程序,校驗是否啟動讀保護(因為啟動讀保護后,不能進行讀寫程序了)
51hei.png (70.44 KB, 下載次數: 66)
下載附件
2021-5-27 16:16 上傳
3.通過ST-LINK Utility工具嘗試連接芯片,發現確實不能讀數據了
51hei.png (26.13 KB, 下載次數: 46)
下載附件
2021-5-27 16:17 上傳
然后只要代碼調用Off_Protect()函數,便可以取消保護了
oid SysLockProtectedProc(u8 nType)
{
//設置讀保護:
if (nType == 0x01)
{
if (FLASH_OB_GetRDP() != SET)
{
FLASH_Unlock();
FLASH_OB_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
FLASH_OB_RDPConfig(OB_RDP_Level_1);
FLASH_OB_Lock();
}
}
//解除讀保護
else
{
if (FLASH_OB_GetRDP() != RESET)
{
FLASH_Unlock();
FLASH_OB_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
FLASH_OB_RDPConfig(OB_RDP_Level_0);
FLASH_OB_Lock();
}
}
}
上面這個函數可以實現讀保護,下載完程序后要斷電,在上電。這樣就無法下載和調試。需要用STVP全片擦除。或者事先寫好解除保護的程序。
|