stm32对flash的读写保护与解除

179 篇文章 182 订阅

一、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

  • 6
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32F103内部FLASH读写保护设置流程如下: 1. 在系统时钟配置中,使能FLASH读写保护时钟。 2. 编写函数来设置FLASH读写保护。可以使用以下代码: ```c void FLASH_If_WriteProtectionConfig(uint32_t protectionstate) { FLASH_OBProgramInitTypeDef OBInit; HAL_StatusTypeDef result = HAL_OK; HAL_FLASH_Unlock(); /* Clear OPTVERR bit set on virgin samples */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR); /* Get the Dual boot configuration status */ HAL_FLASHEx_OBGetConfig(&OBInit); /* The user is allowed to change the protection status */ if ((OBInit.USERConfig & FLASH_OPTR_WRP_SECTOR) != protectionstate) { /* Modify the parameter data */ if (protectionstate == FLASH_PROTECTION_DISABLE) { OBInit.OptionType = OPTIONBYTE_WRP; OBInit.WRPSector = FLASH_WRPSector_AllPages; OBInit.WRPState = OB_WRPSTATE_DISABLE; } else { OBInit.OptionType = OPTIONBYTE_WRP; OBInit.WRPSector = FLASH_WRPSector_AllPages; OBInit.WRPState = OB_WRPSTATE_ENABLE; } /* Launch the option byte loading */ result = HAL_FLASHEx_OBProgram(&OBInit); /* Check if the option byte loading has succeeded */ if (result == HAL_OK) { /* Check if the programmed data is OK */ if ((OBInit.USERConfig & FLASH_OPTR_WRP_SECTOR) != protectionstate) { /* Error occurred while writing data in Flash memory */ result = HAL_ERROR; } } } /* Locks the FLASH */ HAL_FLASH_Lock(); /* Return the protection operation status */ if (result == HAL_OK) { return FLASHIF_OK; } else { return FLASHIF_FAIL; } } ``` 3. 在主函数中调用该函数,以设置FLASH读写保护。例如,要禁用FLASH读写保护,请使用以下代码: ```c FLASH_If_WriteProtectionConfig(FLASH_PROTECTION_DISABLE); ``` 4. 在编译和下载代码之前,确保将选项字节设置为与应用程序兼容的值。 以上就是STM32F103内部FLASH读写保护设置的流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值