stm8选项字节无法正确读写
再使用stlink仿真的stm8s003f3时候,反馈:
> Reading OPTION BYTE area...
Error : Error on Option Bytes (complementary bytes). Reprogram Option Bytes of device
Error : < OPTION BYTE reading failed.
完了就以为是不是单片机的寿终正寝了,因为之前一直以为他的擦写次数很有限。但是我用stvp还能下载程序,
就是读不了,每次都报这个错。而且此时iar根本进不了修改option bytes的界面,
更别提更改了。然后就各种百度,索性解决了。
用STVP的选项字节编程,选择OPTION BYTE ,把ROP打开,刷一遍,再把这个关闭,再刷一遍

以前一直没咋用过这玩意,这次救了一波,瞬间彰显了它的力量。
给ROP打开,完了回把flash整个清除,包括选项字节,问题得以解决😀😀
stm8不像stm32,初始化的时候没有使能io的复用模式,一旦配置好相关外设,io自动进入外设的角色了,
引脚图里面带"[]"的,都是通过option bytes的相关位来设置的,类似stm32的复映射

我用的配套例程是风驰的,理论上他封装的
1 /************************************************************************** 2 * 函数名:FLASH_ReadOptionByte 3 * 描述 :读取的选项字 4 * 输入 :无 5 * 6 * 输出 :无 7 * 返回 :选项字的值 8 * 调用 :内部调用 设置Beep的选项字函数调用 9 *************************************************************************/ 10 static uint16_t FLASH_ReadOptionByte(uint16_t Address) 11 { 12 uint8_t value_optbyte, value_optbyte_complement = 0; 13 uint16_t res_value = 0; 14 value_optbyte = *((NEAR uint8_t*)Address); /* Read option byte */ 15 value_optbyte_complement = *(((NEAR uint8_t*)Address) + 1); /* Read option byte complement */ 16 17 18 if (value_optbyte == (uint8_t)(~value_optbyte_complement)) 19 { 20 res_value = (uint16_t)((uint16_t)value_optbyte << 8); 21 res_value = res_value | (uint16_t)value_optbyte_complement; 22 } 23 else 24 { 25 res_value = FLASH_OPTIONBYTE_ERROR; 26 } 27 return(res_value); 28 } 29 /************************************************************************** 30 * 函数名:FLASH_ProgramOptionByte 31 * 描述 :FLASH编程 32 * 输入 :uint16_t Address, uint8_t Data 33 * 34 * 输出 :无 35 * 返回 :无 36 * 调用 :内部调用 设置Beep的选项字函数调用 37 *************************************************************************/ 38 static void FLASH_ProgramOptionByte(uint16_t Address, uint8_t Data) 39 { 40 /* Enable write access to option bytes */ 41 FLASH_CR2 |= MASK_FLASH_CR2_OPT; 42 FLASH_NCR2 &= (uint8_t)(~MASK_FLASH_NCR2_NOPT ); 43 /* Program option byte and his complement */ 44 *((NEAR uint8_t*)Address) = Data; 45 *((NEAR uint8_t*)((uint16_t)(Address + 1))) = (uint8_t)(~Data); 46 FLASH_WaitForLastOperation(); 47 /* Disable write access to option bytes */ 48 FLASH_CR2 &= (uint8_t)(~MASK_FLASH_CR2_OPT); 49 FLASH_NCR2 |= MASK_FLASH_NCR2_NOPT; 50 } 51 /************************************************************************** 52 * 函数名:FLASH_WaitForLastOperation 53 * 描述 :等到FLASH编程完毕 54 * 输入 :无 55 * 56 * 输出 :无 57 * 返回 :无 58 * 调用 :内部调用 FLASH编程函数调用 59 *************************************************************************/ 60 static void FLASH_WaitForLastOperation(void) 61 { 62 uint8_t flagstatus = 0x00; 63 uint32_t timeout = OPERATION_TIMEOUT; 64 while ((flagstatus == 0x00) && (timeout != 0x00)) 65 { 66 flagstatus = (uint8_t)(FLASH_IAPSR & (uint8_t)(MASK_FLASH_IAPSR_EOP | 67 MASK_FLASH_IAPSR_WR_PG_DIS)); 68 timeout--; 69 } 70 71 }
这几个函数就能软件操作了,特别是没有stlink的情况
有佐证:
头文件里面有ROP的定义 所以应该是可行的
路漫漫其修远兮,吾将上下而求索
浙公网安备 33010602011771号