MM32F103(兼容STM32F103)选项字节编程第2位错误求助
我在使用灵动微电子MM32F103芯片(兼容STM32F103)时,尝试向选项字节地址0x1FFFF804写入数据0x08AE,但实际读出值为0x51AE,仅单个位出现错误。相关代码如下:
if (Sleep == ECUSleep(SaveAdr, BkpData) == 1) { FLASH_Unlock(); FLASH_OPTB_Enable(); FLASH_EraseOptionBytes(); FLASH_ProgramOptionHalfWord(0x1FFFF804, (u16)SaveData.SystemPulse); //Sys Pulse GPIO_ResetBits(GPIOB,GPIO_Pin_3); Flash_Lock(); }
排查与解决建议
检查选项字节写保护配置
MM32F103的选项字节部分可能存在写保护位,若目标地址所在区域被锁定,会导致位写入失败。需确认FLASH_OB_WRPConfig相关配置,确保0x1FFFF804未被写保护覆盖。另外,部分选项字节位属于OTP(一次性可编程)类型,若之前误写过该位,可能无法再次修改,需查阅MM32F103手册确认该位属性。验证选项字节擦除完整性
执行FLASH_EraseOptionBytes()后,立即读取0x1FFFF804地址值,确认是否为0xFFFF(擦除后的默认值)。若擦除不彻底,残留位会导致写入异常。同时需核对MM32官方手册,确认选项字节擦除流程是否与STM32完全一致,部分兼容型号可能有特殊时序要求。排查电源稳定性
选项字节写入对电源电压稳定性要求较高,若写入过程中VDD电压波动超出手册规定范围(通常2.0V~3.6V),可能导致单个位写入失败。需确保电源供电稳定,避免其他外设瞬间拉低电压。核对函数调用正确性
检查代码中Flash_Lock()是否为FLASH_Lock()的笔误,拼写错误会导致Flash未被正确锁定;同时确认FLASH_OPTB_Enable()是否完整开启了选项字节编程权限,部分型号可能需要额外步骤解锁选项字节区域,而非仅调用该函数。验证写入源数据准确性
在调用FLASH_ProgramOptionHalfWord前,通过调试或打印确认(u16)SaveData.SystemPulse的值确实为0x08AE,排除数据传递过程中的错误。
内容的提问来源于stack exchange,提问作者SteveMaybes

