PY32F040C1BT6普冉单片机读保护的开启与解除(程序代码实现)
·
单片机型号: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连接单片机需要注意复位方式的选择
更多推荐


所有评论(0)