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的定义 所以应该是可行的

 

posted @ 2017-12-26 18:36  katachi  阅读(2611)  评论(0)    收藏  举报