STM32的option bytes出现问题,OPTVERR 标志被置1

硬件平台:芯片由 STM32L152VE 替换为 STM32L151VD (原因不知,采购买了一千多片)

编译环境:IAR 8.1

软件:软件包括 BootLoader 和 APP 程序

问题:原本的代码是可以正常运行的,我就直接在编译环境的设置里修改了一些参数,然后又另外使用Jlink-FLASH ARM下载进板子.之后boot程序是可以正常运行并跳转到APP部分。我一直没有操作 OPTION BYTE 相关信息,但是在调试的过程中发现 OPTVERR 标志和OPTVERRUSR 标志被置1了,如下图所示:

 

 

之所以没出现问题,是因为我在BOOT程序开头清除了所有的错误标志位:

 

如果BOOT程序开头没有清除错误标志位的话就无法写入内部EEP,所以程序暂时可以正常运行。但是每次重新进入程序之后之前的错误标志位还是存在的,所以稳定性就不能保证。

百度查询,https://www.lijingquan.net/2017/ … %E7%BC%96%E7%A8%8B/

这篇文章里说

“FWWER 标志,当写入/擦除过程中有Flash指令读取,就会置位,这个正常操作中不应该出现,可以在编程Flash时候关闭所有中断.

NOTZEROERR  标志,当写入的位置不是0,就是不能写入,不应该编程这些位,如果发现可能是坏块产生了,也可能是逻辑错误.

RDERR 标志,当Flash区域有读保护时候,读取这些内容就会出错.置位这个.

OPTVERR 标志,写OP字节时候,因为OP字节格式不对,所以错误,程序设计问题了,当然对于我们做实验,OP可以自行用工具设置.

SIZERR 标志,只能编译uint32_t格式数据,其他都会这个错,程序可以避免.

PGAERR 标志,编程不对齐,程序逻辑问题.

WRPERR 标志,有写保护,所以错误.

READY 标志,储存器可用.

ENDHV 标志,编程中有高压.

EOP 标志,编程结束.

BSY 标志,繁忙标志.程序常用来判断的标志.”

 

这么看来,除了NOTZEROERR,其他只要程序没问题,就不会发生,而NOTZEROERR,是用久了之后发生的.

但是在程序里面或者外面我根本没有操作过OP字节,具体原因还需继续查找。

附上我ICF文件设置参数,大家帮我看看是不是这个设置错了。

 

 

152VE配置

Boot                                                                                    App
ROM_start__ =0x08000000;                                      ROM_start__ =0x08004000;

ROM_end__   = 0x08003FFF;                                     ROM_end__   = 0x08043FFE;

RAM_start__ =0x20000000;                                      RAM_start__ =0x20000000;

RAM_end__   = 0x20007FFF;                                     RAM_end__   = 0x2000FFFE;

cstack__ = 0x400;                                                         cstack__ = 0x400;

heap__   = 0x200;                                                         heap__   = 0x200;

EEPROM_start__ =0x08080000;                               EEPROM_start__ =0x08080000;

EEPROM_end__   = 0x08081FFF;                              EEPROM_end__   = 0x08081FFF;

 

 

151VD配置

Boot                                                                             App
ROM_start__ =0x08000000;                                  ROM_start__ =0x08004000;

ROM_end__   = 0x08003FFF;                                 ROM_end__   = 0x08043FFE;

RAM_start__ =0x20000000;                                  RAM_start__ =0x20000000;

RAM_end__   = 0x20007FFF;                                 RAM_end__   = 0x2000FFFE;

cstack__ = 0x400;                                                        cstack__ = 0x400;

heap__   = 0x200;                                                        heap__   = 0x200;

EEPROM_start__ =0x08080000;                           EEPROM_start__ =0x08080000;

EEPROM_end__   = 0x080817FE;                          EEPROM_end__   = 0x080817FE;

 

—->最终解决办法点这里!!!<—-

2018-03-12
1,364 views