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系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


为了保护STM32F4芯片的代码和数据不被非法读写,可以使用STM32F4芯片读写保护功能。下面是STM32F4芯片读写保护设置方法: 1. 设置读保护 (1)打开Flash读保护功能 通过设置FLASH_CR寄存器的PRSTRT位和PRG位可以打开Flash读保护功能。具体代码如下: ``` FLASH_Unlock(); //解锁Flash FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); //清除Flash标志位 FLASH_OB_Unlock(); //解锁Option Byte FLASH_OB_RDPConfig(0x80); //设置Flash读保护级别为Level 1 FLASH_OB_Launch(); //启动Option Byte编程 FLASH_OB_Lock(); //锁定Option Byte FLASH_Lock(); //锁定Flash ``` (2)禁止Flash读保护功能 通过设置FLASH_CR寄存器的PRG位可以禁止Flash读保护功能。具体代码如下: ``` FLASH_Unlock(); //解锁Flash FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); //清除Flash标志位 FLASH_OB_Unlock(); //解锁Option Byte FLASH_OB_RDPConfig(0x00); //设置Flash读保护级别为Level 0 FLASH_OB_Launch(); //启动Option Byte编程 FLASH_OB_Lock(); //锁定Option Byte FLASH_Lock(); //锁定Flash ``` 2. 设置写保护 (1)打开Flash写保护功能 通过设置FLASH_CR寄存器的WRP位可以打开Flash写保护功能。具体代码如下: ``` FLASH_Unlock(); //解锁Flash FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); //清除Flash标志位 FLASH_WRPConfig(FLASH_WRProt_AllPages, ENABLE); //设置Flash写保护 FLASH_Lock(); //锁定Flash ``` (2)禁止Flash写保护功能 通过设置FLASH_CR寄存器的WRP位可以禁止Flash写保护功能。具体代码如下: ``` FLASH_Unlock(); //解锁Flash FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); //清除Flash标志位 FLASH_WRPConfig(FLASH_WRProt_AllPages, DISABLE); //禁止Flash写保护 FLASH_Lock(); //锁定Flash ``` 以上就是STM32F4芯片读写保护设置方法。需要注意的是,一旦设置了读写保护,就无法再对Flash进行编程或擦除,因此在设置之前一定要慎重考虑。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HowieXue

求打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值