方法二:先在程序中定义一个const?类型的常量数组,并指定其存储位置(方便找到写入、读取位置),这样编译器就会分配你指定的空间将常量数组存入FLASH中。当你做擦除。读写操作时,只要在这个常量数组所在的地址范围就好。
const?uint8_t?table[10]?__at(0x08010000)?=?{0x55}?;
MDK3.03A开始就支持关键字?__at()?。
需要加#include?
方法三:在程序中定义一个const?类型的常量数组,无需指定其存储位置。只要定义一个32位的变量存储这个数组的FLASH区地址就行。
uint32_t?address;//STM32的地址是32位的
const?uint8_t?imageBuffer[1024]?=?{0,1,2,3,4,5,6,7};
address?=?(uint32_t)?imageBuffer;
方法二只能用在CARM编译器上,目前KEIL默认不支持。 RV下可以用以下方法来支持:
RV下绝对定位可以利用scatter做到
以RV的hello例子烧录0x1fc的0x87654321加密位为例
首先在hello.c中加入
const int????encrypt __attribute__((section("encrypt")))= 0x87654320;
其次修改scatter file
UV3会自动产生一个scatter file,默认位于 你的工程目录ojb你的工程名字.sct
可以在这个文件的基础上修改:
原来的hello.sct的内容
LR_IROM1 0x00000000 0x00040000??{??; load region
??ER_IROM1 0x00000000??{???????; load address = execution address
???*.o (RESET,+First)
???* (+RO)
??}
??RW_IRAM1 0x40000000 0x00004000??{??; RW data
???* (+RW +ZI)
}
另存为hello1.sct,并修改为:
???}
???ER_IROM2 0x000001fc FIXED
???{
????*.o (encrypt)
???ER_IROM3 0x200 FIXED
然后,修改设置
http://bbs.21ic.com/upfiles/img/2006724114655201.jpg