在线时间24 小时
UID290209
注册时间2011-5-12
NXP金币0
该用户从未签到
注册会员

- 积分
- 168
- 最后登录
- 1970-1-1
|
本帖最后由 henrei-290209 于 2016-6-20 06:41 编辑
任务描述:
1、我需要在flash中保存大量参数,这些参数在编程时被固化成固定参数。程序运行时这些参数可能需要被改写。类似虚拟EEPROM
软件编写描述:
a、在.ld文件中定义了一个参数段
- MEMORY {
- m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x000000C0
- m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x00015BF0
- m_data (RW) : ORIGIN = 0x1FFFF000, LENGTH = 0x00004000
- m_parameter (RX) : ORIGIN = 0x00016000, LENGTH = 0x00004000
- m_cfmprotrom (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
- }
- /* Define output sections */
- SECTIONS
- {
- /* The startup code goes first into INTERNAL_FLASH */
- .m_parameter :
- {
- __ROM_SYMBOLS = .;
- . = ALIGN(4);
- KEEP(*(.m_parameter)) /* Startup code */
- . = ALIGN(4);
- } > m_parameter
复制代码
b、主程序中定义了一个数据表
__attribute__ ((section(".m_parameter"))) uint8_t myparam[0x10]
c、执行初始化、擦除、写入、读出指令
- MyFLASH_Ptr = FLASH1_Init(NULL);
- /* Initialization of FLASH1 component */
- Error = FLASH1_Erase(MyFLASH_Ptr,MY_FLASH_LOCATION, sizeof(Data));
- while (!DataWrittenFlg) { /* Wait until the data are written */
- FLASH1_Main(MyFLASH_Ptr); /* Run the main method */
- }
- DataWrittenFlg = FALSE;
- Error = FLASH1_Write(MyFLASH_Ptr, Data, MY_FLASH_LOCATION, sizeof(Data)); /* Start writing to the flash memory */
- /* Here some other application code can be placed */
- while (!DataWrittenFlg) { /* Wait until the data are written */
- FLASH1_Main(MyFLASH_Ptr); /* Run the main method */
- }
复制代码
3、问题描述:
在没定义section(".m_parameter")之前,也就是0x16000地址处于.text段时,无论是否该地址有数据,擦除、写入都是正确的。下次启动时,该地址的数据是上次写入的数据,也可以被正常擦除和写入。
如果定义了section(".m_parameter"),在0x16000地址上就有了初始化的数据。擦除程序执行完毕,返回值Error是ErrOK,但是数据没有被擦除。后续自然无法写入。
求各位高人帮忙
最佳答案
number573 发表于 2016-12-19 16:52
我想问楼主,为什么要定义sectio呢,既然数据是上次写入的,也能正常擦除和写入 ...
一般定义专用sector是为了把你相关数据或者代码固定在flash的某个位置,否则编译器会把数据乱 ...
|
-
-
tt.rar
998.66 KB, 下载次数: 35, 下载积分: 威望 1
|