You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM8S005k6无STVP编程Option Byte仅获写保护,如何实现读保护?

解决STM8S005K6代码设置Option Byte仅生效写保护、读保护无效的问题

问题核心

通过代码写入Option Byte时仅写保护生效,但读保护未激活;但用IAR直接编程Option Byte功能正常,说明代码操作逻辑存在关键错误。

修正步骤

1. 解锁正确的Flash区域

STM8的Option Byte属于程序存储区(Program Memory),而非数据EEPROM。你当前代码解锁的是数据区,无法正确操作Option Byte,需改为解锁程序存储区:

FLASH_Unlock(FLASH_MEMTYPE_PROG);

2. 等待Flash操作完成

代码中未等待擦除、编程操作完成,可能导致操作未实际生效,需添加状态等待:

FLASH_EraseOptionByte(0x4800);
// 等待擦除完成
while(FLASH_GetStatus() != FLASH_STATUS_READY);

FLASH_ProgramOptionByte(0x4800, 0xAA);
// 等待编程完成
while(FLASH_GetStatus() != FLASH_STATUS_READY);

3. 复位芯片激活读保护

STM8的读保护(RDP)设置后必须复位才能生效,添加软件复位代码:

void Software_Reset(void) {
    *((volatile uint8_t*)0x0000) = 0x00;
    asm("rst");
}

在设置完成后调用该函数,芯片重启后读保护即可激活。

完整修正代码

void Read_Protect_Flash(void)
{
    FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
    
    while(FLASH_ReadOptionByte(0x4800) != 0xAA)
    {
        FLASH_Unlock(FLASH_MEMTYPE_PROG);

        FLASH_EraseOptionByte(0x4800);
        while(FLASH_GetStatus() != FLASH_STATUS_READY);

        FLASH_ProgramOptionByte(0x4800, 0xAA);
        while(FLASH_GetStatus() != FLASH_STATUS_READY);
   
        FLASH_Lock(FLASH_MEMTYPE_PROG);
    }
    
    Software_Reset();
}

void Software_Reset(void) {
    *((volatile uint8_t*)0x0000) = 0x00;
    asm("rst");
}

额外注意事项

  • 确认STM8S005K6的读保护对应Option Byte地址为0x4800:官方手册显示,该地址的RDP位(bit7)控制读保护,写入0xAA开启最高级别读保护。
  • 读保护开启后无法常规读取Flash内容,解除保护需执行全芯片擦除,会丢失所有Flash数据。

内容的提问来源于stack exchange,提问作者sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:40:09