STM32芯片解锁读写保护:更改Option Byte [Error已解决]
问题描述
STM32使用中经常见到芯片设置了读保护(芯片被锁住),导致无法读取、更改芯片及Flash的内容数据;
使用STLink等工具也无法正常连接和读取
解决办法
通过更改OptionBytes 可以解决该问题:
连接设备后,打开STLink Utility -> Target -> OptionBytes:
变Level从1变为0,点击Apply即可。(程序执行读保护,其实是将Level从0变为1)
Apply后,就会解锁,擦除所有memory后 重新连接,正常会连接并读取芯片成功。
默认情况下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置(代码配置如下)。
原理:RDP保护级别
- Level 0:无保护
- Level 1:使能读写保护
这种保护下,若使用调试功能(使用下载器、仿真器)或者从内部SRAM自举时都不能对内部FLASH及备份SRAM作任何访问 (读写、擦除都被禁止);
当芯片处于级别1的时候,可以把选项字节的RDP位重新设置为0xAA,恢复级别0。
在恢复到级别0前,芯片会自动擦除内部FLASH及备份SRAM的内容,即降级后原内部FLASH的代码会丢失。
- Level 2:禁止调试 (相当于熔断)
最高级别的读保护,且设置后无法再降级,它会永久禁止用于调试的JTAG接口 (相当于熔断)。
各Level级别如下图:
代码配置Option bytes RDP:
通过代码配置Option bytes:
SetOptionByte_RDP()函数会先通过HAL_FLASHEx_OBGetConfig() 判断下当前RDP level,然后配置
/*************************************************
Function: // void SetOptionByte_RDP(void)
Description: // This function will set option byte to
// low level protection if it isn't be set yet.
// After that, the firmware in MCU will not be
// read out anymore.
Input: // void
Return: // void
Others: //
*************************************************/
void SetOptionByte_RDP(void)
{
FLASH_OBProgramInitTypeDef OBInit;
HAL_FLASHEx_OBGetConfig(&OBInit);
// If read option byte protection level is "No Protection"
if (OBInit.RDPLevel == OB_RDP_LEVEL_0)
{
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
OBInit.OptionType = OPTIONBYTE_RDP;
OBInit.RDPLevel = OB_RDP_LEVEL_1;
if ( HAL_FLASHEx_OBProgram(&OBInit) != HAL_OK )
{
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
return;
}
HAL_FLASH_OB_Launch();// to active new OPT
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
}
}
注意:
通过代码配置option byte后重启RDP生效,
之后就无法再次debug,只能手动改Option bytes为0,禁用读保护,清空memory后,再次烧写程序,才可恢复debug:
博主热门文章推荐:
一篇读懂系列:
LoRa Mesh系列:
网络安全系列:
- ATECC508A芯片开发笔记(一):初识加密芯片
- SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
- 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
- AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例
嵌入式开发系列:
- 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
- IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
- Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
- Android底层调用C代码(JNI实现)
- 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
- Android/Linux设备有线&无线 双网共存(同时上内、外网)
AI / 机器学习系列:
- AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
- AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
- AI: 什么是机器学习的数据清洗(Data Cleaning)
- AI: 机器学习的模型是如何训练的?(在试错中学习)
- 数据可视化:TensorboardX安装及使用(安装测试+实例演示)