在BL51或LX51中使用常量来设定flash lock字节值

开始者 <a href="http://community.silabs.com/t5/Welcome-and-Announcements/Community-Ranking-System-and-Recognition-Program/m-p/140490#U140490"><font color="#000000"><font size="2">Hero Employee</font></font> </a> yucheng 修改时间 ‎01-13-2017 04:10 PM

问题

是否可以在编译代码时指定8051 MCU lock 字节的值 ?

答案

 

可以,在使用Keil C51工具链时,可以很容易的通过BL51或LX51来实现

首先,需要在代码中的某个位置初始化lock 字节的设定。譬如,可以创建一个新的文件,并命名为”lockbyte.c”,然后在其中加入如下的代码,

 

#include <si_toolchain.h> 
const uint8_t code lockbyte = 0x00;

这段代码将会在flash中占用一个byte,且其初始值为0,但此时并未指定其具体地址。为了将这个字节放置在flash的lock字节位置,需要使用到链接器。

关于lock字节的地址,请查阅相应MCU的参考手册。例如EFM8BB1F8的lock 字节在flash的0x1FFF位置。

 

如果使用Simplicity Studio,链接器的指令可以在如下位置修改,Project -> Properties -> C/C++ Build -> Settings-> Keil 8051 Linker > Miscellaneous。然后在[Additional Flags]中添加链接器指令。

如果使用LX51,请在[Additional Flags]中添加如下命令:

 

SEGMENTS (?CO?LOCKBYTE(C: 0x1FFF))

 如果使用LX51,同时该MCU有code banking, 则需要指定code bank以及地址。例如,使用如下命令将LOCKBYTE放置在bank3 0x1FFFF位置。

 

SEGMENTS (?CO?LOCKBYTE(B3:0x1FFFF)) OVERLAY (* ! ?CO?LOCKBYTE)

 如果REMOVEUNUNUSED有被使能,那么需要使用OVERLAY命令以保证其不会处理该lock字节,否则链接器会将LOCKBYTE从代码段移除掉。REMOVEUNUNUSED设定在如下位置:

 

removeable.png

 

如果使用BL51,相应的命令如下

 

CODE (?CO?LOCKBYTE(0x1FFF))

 编译完成之后,查看.m51文件或.hex文件,即可以确定是否有将常量放置在指定的lock字节(0x1FFF)位置,同时其初始值是否正确。

 

map_file.png

 

link_file.png