This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我将 uartecho 项目导入 CCS、并 添加一些代码来测试如何将数据保存到闪存区域。
因此、我按如下方式更改了.cmd 文件:
--stack_size=8192 /* C stack is also used for ISR stack */ HEAPSIZE = 0x20000; /* Size of heap buffer used by HeapMem */ MEMORY { FLASH (RX) : origin = 0x00000000, length = 0x000FF000 MYDATA (RW) : origin = 0x000FF000, length = 0x00001000 SRAM (RWX) : origin = 0x20000000, length = 0x00040000 } /* Section allocation in memory */ SECTIONS { .text : > FLASH .const : > FLASH .rodata : > FLASH .cinit : > FLASH .init_array : > FLASH myvars : {} > MYDATA .TI.ramfunc : {} load=FLASH, run=SRAM, table(BINIT) .data : > SRAM .bss : > SRAM .sysmem : > SRAM /* Heap buffer used by HeapMem */ .priheap : { __primary_heap_start__ = .; . += HEAPSIZE; __primary_heap_end__ = .; } > SRAM align 8 .stack : > SRAM (HIGH) }
请注意 MyData 和 myvars。
我将以下代码片段放入 uartecho.c 中:
/* pragmas to define the variables in flash */ #pragma DATA_SECTION(var1, "myvars"); #pragma RETAIN(var1) uint32_t var1 = 125; #pragma DATA_SECTION(var2, "myvars"); #pragma RETAIN(var2) uint32_t var2 = 300;
我编译了项目并开始调试。 然后、我立即看到以下调试会话屏幕截图。
程序运行进入退出状态、然后挂起。
出于测试目的、我通过添加 const 修改了变量 var1和 var2的属性。
const uint32_t var1 = 125;
const uint32_t var2 = 300;
然后 uartecho 程序运行良好。
这意味着我不能更改/修改闪存中特定位置的内容。
如何动态更改闪存中定义的 var1和 var2的内容?
任何提示/建议都将提前得到认可。
HaeSeung
您好 HasSeung、
如果您想要写入闪存、我认为您需要启用闪存操作功能。
您将一些变量推入闪存、因此必须在更改这些变量之前启用闪存写入函数。
谢谢!
此致
Johnson
尊敬的 Johnson:
我想提出 3个问题:
1.如果我使用#pragma DATA_SECTION (var1、"myvars")定义变量、如 var1;、
那么,我是否 必须将 var1定义为常量变量,例如 const uint32_t var1 = 100;?
如果是真的,那么为什么呢?
2.如果我想在闪存存储器区域中写入一些数据,我是否必须使用 FlashProgram()函数?
我想在闪存中写入一些数据、只需为变量 var1分配值即可。
3.或以下方案为非法模式?:
#pragma DATA_SECTION (var1、"myvars");
uint32_t var1 = 100;
然后我使用 FlashProgram()函数更改 var1的内容。
如果允许、我只需使用变量名称 var1来访问闪存的内容。
不允许执行此过程吗?
提前非常感谢、感谢您的任何提示。
HaeSeung
HaeSeung、您好!
[引用 userid="397173" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1118243/MSP-exp432e401y-pragma -data_section-symbol-section-name-ges-program-execution-hanged/4688、 pragma (if)、pragma #1461"、如"var1、pragma 1、pragma 1、pragma 1、pragma、pragma、var1、pragma、pragma 1、pragma、var1、pragma、pragma、pragma对于 Q1、您可以在闪存中将 var1定义为正常变量、例如 uint32_t var1 = 100;这是可以的、如果您将此变量定义到闪存中、即使在下电上电后也可以保留此值。
[~ userid="397173" URL"μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1118243/MSP-exp432e401y-pragma DATA_SECTION section-name-gest-program-execution-hanged/4688 i 写入闪存区数据(如果我想在闪存区中写入某些数据)。]对于 Q2,是的,如果此变量在闪存中定义,则必须使用 FlashProgram()函数来写入某些变量,否则闪存写入默认值为禁用。
[~引语 userid="397173" URL"μ C/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forum/1118243/MSP-exp432e401y-pragma DATA_SECTION -section-name-gence-program-execution-hanged/4146688"3.或以下方案为非法模式?:
#pragma DATA_SECTION (var1、"myvars");
uint32_t var1 = 100;
然后我使用 FlashProgram()函数更改 var1的内容。
如果允许、我只需使用变量名称 var1来访问闪存的内容。
不允许执行此过程吗?
对于 Q3、不能更改 contants 变量。
谢谢!
此致
Johnson
尊敬的 Johnson:
感谢您对第二季度和第三季度的回答。 现在我了解了。
关于 Q1、我听从了您的建议、但仍然有问题。 我的设置如下:
在 MSP_EXP432E401Y_TIRTOS.cmd 中:
--stack_size=8192 /* C stack 也用于 ISR 堆栈*/
HEAPSIZE = 0x20000;HeapMem 使用的堆缓冲区的大小*/
存储器
{
闪存(RX):origin = 0x00000000,length = 0x000FF000
MyData (rwx):origin = 0x000FF000,length = 0x00001000
SRAM (rwx):origin = 0x20000000,length = 0x00040000
}
/*内存中的段分配*/
部分
{
.text:> FLASH
.const:> FLASH
.rodata:> FLASH
.cinit:>闪存
.pinit : > FLASH
init_array:> FLASH
myvars :{}> MyData
.TI.ramfunc:{} load=flash,run=SRAM,table (BINIT)
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
/* HeapMem 使用的堆缓冲区*/
.priheap:{
_primary_heap_start__=.;
。 += HEAPSIZE;
__primary_heap_end__=.;
}> SRAM 对齐8
.stack:> SRAM (高)
}
在 uartecho.c 中、我将以下代码放在 #include file 语句下方:
#pragma DATA_SECTION (var1、"myvars");
uint32_t var1 = 100;
#pragma DATA_SECTION (var2、"myvars");
uint32_t var2 = 200;
编译正常。
开始调试,然后立即执行程序进入 exit()。
我附上其屏幕截图:
"Debug"视图:
"Console"视图:
源视图:
它的运行是非常不可预料的。
Console 视图中的错误消息显示:
TI.SYSBIOS.family.ARM.m3/Hwi:第1259行:E_BUSFault:PRECISERR:立即总线故障、确切的已知地址、地址:000ff000
在 PC = 0x00007ab6的后台线程中发生异常。
在设置配置或 C 程序时是否有任何遗漏?
非常感谢
HaeSeung
您可能希望查看 nvsinternal_MSP_EXP432E401Y 示例项目。
配置文件中的 NVS 部分可让您定义闪存上用作 mon 易失性存储的块的地址和大小、然后代码会显示如何使用访问函数来读取和写入该块。 它负责 cmd 文件/链接器设置。
我将我的所有配置打包在一个结构中、并用校验和将其放入另一个结构中(请参阅 CRC 示例)。 然后、我在闪存存储和本地 RAM 副本之间读取或写入我的配置副本。 编辑 RAM 副本并在需要时通过访问 fn 保存到闪存中。
NVS_WRITE (nvsHandle、0、(void *)&ProtectedConfigData、sizeof (protectedConfigData)、NVS_WRITE_ERASE | NVS_WRITE_POST_VERIFY);
Display_printf (display、0、0、"使用 CRC %x 写入的默认配置数据"、TheProtectedConfigData.TheChecksum);