Jlink使用技巧之读取STM32内部的程序 更新
- UID
- 1066743
|
Jlink使用技巧之读取STM32内部的程序 更新
6.保存读取到的程序
选项File-> Save data file或者是Save data file as,保存类型根据需要选择,建议选择Hex格式,已经包含了地址信息。
7.程序的验证。
怎么验证读取到的程序是正确的呢?很简单,重新烧写进去,看运行现象和原来的是不是一样就行了。
具体操作方法查看上一篇Jlink系列文章:Jlink使用技巧之单独下载HEX文件到单片机
总结
既然能这么简单的读取到单片机的程序,那么我们自己的程序应该如何保护起来呢?很显然,我们可以对Flash设置读保护功能,即大家说的“加密”功能,可以防止对Flash的非法访问,这里的加密是针对整个Flash区域的,如果设置了读保护功能,那么程序只能正常的从RAM中加载运行,而不能通过调试器读出来,那么别人就不能破解了。哈哈!
具体怎么实现呢?
这里先介绍几个关于Flash保护操作的几个库函数:
FLASH_Unlock(); //Flash解锁
FLASH_ReadOutProtection(DISABLE); //Flash读保护禁止
FLASH_ReadOutProtection(ENABLE); //Flash读保护允许
这个函数在固件库stm32f10x_flash.h中,使用这个功能要先添加这个库文件。
设置读保护:
void Set_Protect(void)
{
if(FLASH_GetReadOutProtectionStatus() != SET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
}
}
注意:
启动读保护后,就不能读写程序了,如使用JLink读取程序,或者是重新下载程序。
所以,在下载程序之前,需要通过程序内部调用关闭读保护,关闭读保护之后,会自动清空Flash
另外,当第一次调用Set_Protect()函数启动读保护之后,不能再次调用Off_Protect()函数关闭读保护,需要重新断电才能关闭读保护
关闭读保护,在串口接收某个有效数据或按下某个按键时,调用关闭读保护:
void Off_Protect(void)
{
if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
FLASH_Lock();
}
}
程序可以这样实现:
int main(void)
{
/*用户代码*/
if(KEY == 0) //按键按下
{
Off_Protect();
}
else
{
Set_Protect();
}
/*用户代码*/
while(1)
{
/*用户代码*/
}
}
! |
|
|
|
|
|