单片机型号:PY32F040C1BT6

之前,笔者用普冉官方的PY32IspTool串口 ISP 专用烧录工具解除单片机的FLASH读保护。操作麻烦,要将BOOT0接高电平,重新断电后进入ISP模式,必须使用USB转TTL。很不方便。

为了解决这个问题,在单片机程序中编写了FLASH解除读保护的代码。当需要解除保护时运行改短代码即可。可以是按下摸个按钮执行解除保护的代码,页可以使是接收到设定的串口命令后,执行解除读保护的代码。
总之,这样要比用ISP解除读保护要方便一些。

/*****************************************************************
禁止读取FLASH
开启读保护(LEVEL0 → LEVEL1)
下载程序后,单片机需要断电两次,程序才会跑起来
*****************************************************************/
void py32f040_Flash_ReadOut_Disable(void)
{
	FLASH_OBProgramInitTypeDef OBInitCfg;
	
	HAL_FLASH_Unlock();      /* 解锁FLASH */
  HAL_FLASH_OB_Unlock();   /* 解锁OPTION */

	HAL_FLASH_OBGetConfig(&OBInitCfg);   // 官方提供的外部API
	uint8_t RDP_Level = OBInitCfg.RDPLevel;	// #define OB_RDP_LEVEL_0         ((uint8_t)0xAAU)
																					// #define OB_RDP_LEVEL_1         ((uint8_t)0x55U)
	if(RDP_Level==OB_RDP_LEVEL_0)//不保护
	{
		OBInitCfg.OptionType|= OPTIONBYTE_RDP;//待配置的选项字节
		OBInitCfg.RDPLevel = OB_RDP_LEVEL_1;//设置读取保护级别
		HAL_FLASH_OBProgram(&OBInitCfg);/* 启动option byte编程 */
		HAL_FLASH_OB_Launch();  //启动加载。必须添加这个,不然读保护设置不生效
	}
	HAL_FLASH_Lock();
  HAL_FLASH_OB_Lock();//上锁Flash控制寄存器访问权限
}

/*************************************************
允许读 FLASH
解除读保护(LEVEL1 → LEVEL0)
执行程序后,单片机需要断电一次,才可以再次下载程序
*************************************************/
void py32f040_Flash_ReadOut_Enable(void)
{
	FLASH_OBProgramInitTypeDef OBInitCfg;
	
	HAL_FLASH_Unlock();      /* 解锁FLASH */
  HAL_FLASH_OB_Unlock();   /* 解锁OPTION */

	HAL_FLASH_OBGetConfig(&OBInitCfg);   // 读取当前全部配置(保持和开保护一样)
	uint8_t RDP_Level = OBInitCfg.RDPLevel;
	
	if(RDP_Level==OB_RDP_LEVEL_1) // 只有当前是保护状态,才解除
	{
		OBInitCfg.OptionType |= OPTIONBYTE_RDP;  // 同样写法
		OBInitCfg.RDPLevel = OB_RDP_LEVEL_0;     // 改为无保护
		HAL_FLASH_OBProgram(&OBInitCfg);         // 标准编程
		HAL_FLASH_OB_Launch();                   // 触发复位+擦除
	}
	HAL_FLASH_Lock();
  HAL_FLASH_OB_Lock();
}

用STM32 ST-LINK Utility连接单片机需要注意复位方式的选择
在这里插入图片描述

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐