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.

[参考译文] MSP430FR5994:#pragma NOINIT #pragma PERSISTENT FRAM 存在问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1366153/msp430fr5994-issues-with-pragma-noinit-pragma-persistent-fram

器件型号:MSP430FR5994

工具与软件:

#pragma NOINIT (阻尼)
无符号字符阻尼;

#pragma PERSISTENT (系数)
浮点因子=1;

对阻尼的任何更改都不能在断电周期后保存、观察 lnk_msp430fr5994.cmd 文件、它设置为 RAM、因此将其移到具有 persistent 的读写部分、该选项同样不起作用、我无法更改任一变量。

这些始终为255或初始化值。 除非按照原始.cmd 文件存储在 RAM 中。

组(READ_WRITE_MEMORY)
{

.TI.persistent:{}/* for #pragma persistent */
.TI.noinit :{}/* for #pragma noinit */
.cio:{}/* C I/O 缓冲器*/
.sysmem:{}/*动态内存分配区*/
}PALIGN (0x0400)、RUN_START (FRAM_RW_START)

组(IPENCAPSULATED_MEMORY)
{


我已尝试禁用内存保护单元 MPU、并尝试将上面的内容放入 FRAM2中。

但初始化后无法更改这些值。

我可能缺少非常明显的东西、但已经尝试了我能想到的一切。

最感谢收到的任何帮助

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

    在"Project->Properties->Debug->MSP430 Flash Settings->Erase Options"中、确保选中"Erase and download necessary segments"选项。

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

    我已经尝试过,但它不是。 一旦更改了.cmd 文件、因此变量位于 fram 中、我就无法更改程序中的值、即使禁用 MPU、变量也位于地址4,000,4004 必须是别的值

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

    0x1E15位于 RAM 中、0x7B7A 不像预期的那样接近0x4000、因此我想会发生其他情况。

    我的测试案例:

    1) 1)我开始使用此代码:

    #include <msp430.h> 
    
    #pragma NOINIT(damping)
    unsigned char damping;
    
    #pragma PERSISTENT(factor)
    float factor=1;
    /**
     * main.c
     */
    int main(void)
    {
    	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    	PM5CTL0 &= ~LOCKLPM5;       // Avoid warning
    	++damping;
    	++factor;
    	while (1) {LPM0;}
    	/*NOTREACHED*/
    	return 0;
    }
    

    2) 2)我进行了您提到的.cmd 更改:

            GROUP(READ_WRITE_MEMORY)
            {
    
                .TI.persistent : {}              /* For #pragma persistent            */
                .TI.noinit  : {} /*> RAM */      /* For #pragma noinit                */
                .cio           : {}              /* C I/O Buffer                      */
                .sysmem        : {}              /* Dynamic memory allocation area    */
            } PALIGN(0x0400), RUN_START(fram_rw_start)
    

    3) 3)我已如上所述更改擦除选项

    4)我没有对 MPU 执行任何操作(我让编译器/链接器来解决它)

    我经历了几次重新启动和重新下载的组合,并看到了我所期望的--每次下载时系数都重新初始化,但在重新启动时保留其(递增)值,阻尼以一些随机值开始,并不断递增(两种情况)。

    我不确定我们的做法有何不同。

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

    感谢地址是从先前的测试他们是4000和4004,好的,所以一定是在我的代码或设置停止它?

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

    想到的一种可能性(不是*i*做过这个)是,经过一系列实验后,有一些被遗忘的设置在你的路上。

    如果可行、您可以考虑:(a)创建一个新项目并将您的代码复制到其中、和/或(b)按照我上面的测试案例(大约需要20分钟)查看您是否获得预期的结果。