主题中讨论的其他器件: MSP-EXP430FR2355
您好!
数组静态 const unsigned char oil level[2048];
(当前地址0x802A 处的阵列起始)
为 NULL 覆盖了 MSP430FR2355
(CCSV10)时开启。
有人知道如何关闭此功能?
不需要初始化。
感谢您的回答。
向弗里德里希致以最诚挚的问候
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.
您好!
数组静态 const unsigned char oil level[2048];
(当前地址0x802A 处的阵列起始)
为 NULL 覆盖了 MSP430FR2355
(CCSV10)时开启。
有人知道如何关闭此功能?
不需要初始化。
感谢您的回答。
向弗里德里希致以最诚挚的问候
您好!
它是关于 MSP430FR2355的。
信息不足以解决我的问题。
我需要地址范围介于0x8000至0x8800之间的 FRAM 区域、我可以对该区域进行写入和读取、比如0x1800至0x1A00的地址范围、在使用 CCSV10加载我的 C 程序时不会覆盖/初始化地址范围0x8000至0x8800。
加载我的 C 程序时、从0x1800至0x1A00的地址范围被"不"覆盖。
即使进行复位、也不得覆盖/初始化从0x8000到0x8800的地址空间。
我还在寻找 linker.CMD 文件的文档,因为这里出现了一个定义,例如.info : type = NOINIT{}> info ,这显然可以确保从0x1800到0x1A00的地址范围不会被初始化。
在文档 ASM_slau131y.pdf Compiler_slau132y.pdf 中找不到表达式.info。
可能有一个__linker.CMD-File__的示例程序处理了该问题。 在 TI 的示例程序中、只处理了一个 FRAM 单元、缺少相关的 linker.CMD 文件。
我遇到问题的原因是地址范围0x1800至0x1A00对于我的用途而言不够用。 我需要另一个2K 字节。 数据将被写入此区域、之后的程序更改中不能将其销毁。
向弗里德里希致以最诚挚的问候
您提到了描述如何执行此操作的文档、但没有看到 SLAU131Y 中描述"链接器命令文件"的第8.5节。
如果您不需要数组恰好位于0x8000、但在程序 FRAM 中的某个位置介于0x8000和0xFFFF 之间、那么最简单的方法是修改 链接器文件中的一行。 在 FR2355的 CCSV12 (在 CCSV10中可能与之相同)中、"lnk_msp430fr2355.cmd"中有一行包含:
.TI.noinit : {} > RAM /* For #pragma noinit */
更改为:
.TI.noinit : {} > FRAM /* For #pragma noinit */
然后使用 NOINIT pragma 指令:
#pragma NOINIT(OIL_Level) volatile static const unsigned char OIL_Level[2048];
如果必须将其恰好放置在0x8000至0x8800之间、则需要修改链接器文件或将 LOCATION pragma 与 NOINIT 结合使用。
不是对您的问题的直接回答、但您打算如何修改数组的内容? 使用"const"关键字声明意味着您会更改 C 运行时之外的值。 在这种情况下、您还需要包含"volatile"关键字、否则即使优化已关闭、它也会被优化而不会分配到存储器中。
持久性数据在程序下载(实际上是程序文本的一部分)时初始化、但不会在复位时初始化。
Noinit 数据不会被程序下载(或复位)覆盖。 您需要自行确定内容是否有效。
但是,noinit 可以在下载过程中擦除。 您需要将"Project->Properties->Debug->MSP430 Flash->Erase Options"设置为(或者)"Erase..needed segments Only"或"Replace writed memory locations"(我已经忘记了哪个)。
FR2355没有 MPU、因此需要通过设置 SYSCFG0:PFWP=0来显式启用写入。 根据您的使用、您可能会从 SYSCFG0:FRWPOA 中获益良多。
将 TI.noinit 放入 FRAM [此处引用 Seth ]:
您好!
很抱歉、不起作用。
加载时、来自0x8000 (编译器放置数组的位置)的数据被0xff 覆盖。
内存浏览器会显示此信息。
我将 lnk_msp430fr2355.cmd 中的第139行从.TI.noinit :{}> RAM 更改为.TI.noinit :{}> FRAM。
在"Project->Properties->Debug->MSP430 Flash->Erase Options"中
我已选择"按地址范围(下面的规格)"、并指定了要用0x9000到0xa000进行擦除的区域。
我还注意到什么:我可以通过存储器浏览器更改0x8000处的内容。
如果我现在将程序从 PC 加载回 MSP-EXP430FR2355、
使用0xff 覆盖数据。
这里是测试程序
#include
void write_oil_level_UC8 (unsigned char、unsigned char *);
volatile unsigned char * oil_level_WRITE_ptr=0;
无符号 int ui_counter1;
unsigned int UI_break=0;
无符号字符 uC_data;
unsigned char uC_zw1;
#pragma NOINIT (OIL_LEVEL)
Volatile unsigned char oil_level[2048];
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;
uc_zw1=oil_level[0];
oil_level_WRITE_ptr =&oil_level[0];
P1OUT &=~BIT0;
P1DIR |= BIT0;
PM5CTL0 &=~μ A LOCKLPM5;
//uC_data ='a';
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
while (1)
{
UI_counter1=0;
操作
{
SYSCFG0 = FRWPPW | FRWPOA0 | DFWP;
*oil_level_WRITE_ptr ='a';
SYSCFG0 = FRWPPW | FRWPOA0 | PFWP | DFWP;
oil_level_WRITE_PTR++;
UI_counter1++;
{while (ui_counter1<2048 );
UI_break=0;
for (;;)
{
P1OUT |= BIT0;
__delay_cycles (400000);
P1OUT &=~BIT0;
__delay_cycles (400000);
}
}
}
如果加载为0xFF、则表示调试器正在擦除程序加载时的存储器段。
我在 FR6043上尝试了测试代码、所有设置都是相同的、并且在运行至 UI_break=0后所有字节都设置为"A"。 我停止了调试器、重新加载了程序、并检查了存储器、同时位于写入 WDTCTL 寄存器的默认第一个断点处。 所有存储器仍读取为"A"。 由于我没有 FR2355、因此我无法准确复制您的设置;主要区别在于我的器件配有 MPU、而您的器件配有 SYSCFG0寄存器 Bruce 指出。
另外 需要注意的是、"Project->Properties->Debug->MSP430 Flash->Erase Options"中的起始地址和结束地址不符合 Note2的要求。 0x9000和0xA000都是偶数地址;也许您可以尝试0x8800和0xFFFF。
您好!
现在它开始工作了。
解决方案:
在 C 程序#pragma NOINIT (OLOE_LEVEL)中
Volatile unsigned char oil_level[2048];
在 Linker.cmd 第139行中插入
.TI.noinit :{}>.TI.noinit 中的 RAM :{}> FRAM
变化
在"Project->Properties->Debug->MSP430 Flash->Erase Options"中,将"Replace writed.."切换为 等。
非常感谢您的帮助。
我将 FRWPOA0更改为 FRWPOA1。
此致
弗里德里希