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.

[参考译文] CCS/MSP430G2553:运行时存储器

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/577090/ccs-msp430g2553-memory-storing-at-run-time

部件号:MSP430G2553

工具/软件:Code Composer Studio

大家好,

我想将参数保存到主存储器和/或信息存储器中。

我尝试了两种记忆

在主内存中:在调试模式下,我成功地写入和读取了内存。

但是,在运行时,数据不会更改或不正确(无法写入和无法读取)

在信息内存中,调试和运行时都无法写入和读取。

可能是配置问题?

现在,我要保存一个字符,但我需要保存更多字符和短路参数。

以下是此问题的代码(使用信息存储器):

void LoadParameters()
{
短M1,m2;
ReadFromFlash((char*)0x1040,(char*)&cnt_By_idx);// Count_by
IF (cnt_By_idx < 0 || cnt_By_idx > count_By_ARR_LEN - 1)
cnt_by_idx =3;
}

void SaveParameters()
{
WriteToFlash((char*)0x1040,(char)cnt_by_idx);// Count_by
}

void WriteToFlash(char*地址,char val)
{
CHAR* FLASH_PTR;
FCTL3 = FWKEY;
FLASH_PTR =地址; //初始化闪存指针
while (FCTL3和BUSY);
FCTL1 = FWKEY + WRT;
*FLASH_PTR = val;
while (FCTL3和BUSY);
FCTL1 = FWKEY; //清除WRT位
FCTL3 = FWKEY + LOCK; //设置锁定位
}

void ReadFromFlash(char* address,char* val)
{
CHAR* FLASH_PTR;
FLASH_PTR =地址;
while (FCTL3和BUSY);
*val =*FLASH_PTR;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在主内存中:在调试模式下,我成功地写入和读取了内存。

    但是,在运行时,数据不会更改或不正确(无法写入和无法读取)

    在信息内存中,调试和运行时都无法写入和读取。闪存的工作方式是擦除操作将闪存扇区中的所有位都更改为1,而写入操作可以将单词中的位更改为零。

    发布的代码仅执行写入操作,因此,除非闪存已被擦除,否则将无法写入正确的数据。

    在调试会话开始时执行CCS下载程序之前,默认行为是擦除所有主闪存,但保持信息闪存不变。 这可能解释了代码在调试模式下只将正确的数据写入主内存的观察行为。

    有关  执行闪存擦除和写入操作的示例代码,请参见msp430g2xxS 3_flashwrite_01.c系统内闪存编程,将SegC复制到SegD。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,感谢您的回复

    我添加了另一个调用clearflash的函数,该函数获取一个分段的地址并将其擦除。

    这才是诀窍。

    我知道我只能擦除段(最小大小)

    但是,在运行时,我不想擦除所有句段,只想更改一个参数。

    我只尝试写它,但它不起作用。如果我擦除并写入所有参数,它就不起作用了。

    是否有办法不擦除所有参数而只写入一个参数?