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.

[参考译文] MSP430FR5969:确定要使用的 FRAM 的可用空间地址

Guru**** 2538955 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/987554/msp430fr5969-determine-the-available-space-address-of-fram-to-use

器件型号:MSP430FR5969

我的应用需要将一些数据存储在 FRAM 中、以便在运行时使用。

我的问题是如何确定可以使用 FRAM 的哪个区域来存储数据?

在 liker 文件中、lnk_msp430fr5969.cmd 显示了 FRAM 和 FRAM2的地址  

我的问题是如何确定可以 使用 FRAM 或 FRAM2的哪个区域来存储数据? 谢谢

这里是链接器文件中的 MPU:

存储器

SFR:origin = 0x0000、length = 0x0010
外设_8位:origin = 0x0010、length = 0x00F0
peripherals_16BIT:origin = 0x0100、length = 0x0100
RAM:origin = 0x1C00,length = 0x0800
INFOA:origin = 0x1980,length = 0x0080
              …
INFOD:origin = 0x1800,length = 0x0080


FRAM:origin = 0x4400,length = 0xBB80
FRAM2:origin = 0x10000、length = 0x3FF8 //边界已更改以修正 CPU47 */


JTAGSIGNATURE:origin = 0xFF80,length = 0x0004,fill = 0xFFFF
BSLSIGNATURE:origin = 0xFF84,length = 0x0004,fill = 0xFFFF
IPESIGNATURE:origin = 0xFF88,length = 0x0008,fill = 0xFFFF
INT00:origin = 0xFF90,length = 0x0002
INT01:origin = 0xFF92,length = 0x0002
             .

复位:origin = 0xFFFE,length = 0x0002

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

    这取决于您的需求。

    如果您没有太多信息、只需使用信息区域即可。

    如果您有很多、并且不使用大型模型进行编译、则所有 FRAM2都可用。

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

    首先、感谢 David 的回复。  

    然后、您提到所有 FRAM2都可用。 但是、我的项目一直在使用上面图片中的某些项目。  

    那么、我的问题是、如果我使用 FRAM2、那么我会覆盖.text 吗? 还是编译器会自动将.text 移动到其他区域?

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

    您的所有代码似乎都适合 FRAM、因此禁用大模式会强制编译器将其全部放在那里。 代码也会更小、更快。

    您必须使用一些专用函数来访问 FRAM2、但它们应该在库中可用。

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

    谢谢 David。 您在了解存储器分区方面为我提供了很多帮助。  

    我的新问题是:在库中,我应该使用哪一个: framctl_a.c 或 framctl.c? 我的硼是 MSP430FR5969

    谢谢

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

    GCC 具有:

    • unsigned char __data20_read_char(unsigned long addr);
    • unsigned long __data20_read_long(unsigned long addr);
    • unsigned short __data20_read_short(unsigned long addr);
    • void __data20_write_char(unsigned long addr, unsigned char src);
    • void __data20_write_long(unsigned long addr, unsigned long src);
    • void __data20_write_short(unsigned long addr, unsigned short src);

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

    我尝试在"INFOA "段将0x02和0x68写入 FRAM、该段的链接器文件地址为0x1980。

    当我读回时、值为0xFF、而不是0x2  

    FRAM 有什么问题?

    在这里、我的示例代码:

    #include
    #include
    #include
    #include
    #include "driverlib.h"

    uint8_t val = 0x0;
    int main (void){

    uint8_t dt1[2]={0x02、0x68};
    uint8_t * framPtr;

    const uint16_t infoA_address = 0x1980;
    const uint16_t numberOfBytes = 2;
    framPtr =(uint8_t *) infoA_address;
    WDT_A_HOLD (WDT_A_base);
    Val = 0x55;
    printf ("在 val=0x%x\n"、val 之前);
    FRAMCtl_write8 (dt1、framPtr、numberOfBytes);

    //回读位置0x1980
    framPtr =(uint8_t *) infoA_address;
    Val =*帧 Ptr;
    printf ("在 val=0x%x\n"、val 之后);

    返回(0);

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

    我不知道您为什么使用 FRAMctl 函数。 复位时、信息存储器默认启用读取/写入、因此您只需要一个指针。

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

    David、但我的目的是使用 FRAM 永久存储一些值。 这意味着当我们循环通电后、这些值仍然存在。

    请帮助。 谢谢

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

    尊敬的 Chris:

    infor 存储器也存储在 FRAM 中、因此在下电上电后该值仍然存在。

    对于上一个问题、您需要启用 FRAM 写入操作、然后才能将数据写入 FRAM。

    https://dev.ti.com/tirex/explore/node?node=AAdcVLl0EcrsqUMXhiaeEQ__IOGqZri__LATEST

    谢谢!

    此致

    Johnson

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

    您好、Johnson、感谢您的回复、但来自链接的源代码(我在下面复制并粘贴)未显示如何"启用 FRAM 写入操作"。 请帮助

    void FRAMWrite (void);

    unsigned char count = 0;
    无符号长整型数据;

    #if defined (__TI_Compiler_version__)
    #pragma PERSISTENT (FRAM_WRITE)
    unsigned long FRAM_WRITE[WRITE_SIZE]={0};
    #Elif defined (_IAR_systems_icc_)
    __persistent unsigned long FRAM_WRITE[WRITE_SIZE]={0};
    #Elif defined (_GNU_)
    unsigned long __attribute__(persistent) FRAM_write[write_size]={0};
    其他
    错误编译器不受支持!
    #endif

    int main (空)

    WDTCTL = WDTPW | WDTHOLD;//停止 WDT

    //配置 GPIO
    P1OUT &=~BIT0;//清除 P1.0输出锁存器以实现定义的加电状态
    P1DIR |= BIT0;//将 P1.0设置为输出方向

    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;

    //初始化虚拟数据
    数据= 0x00010001;

    while (1)

    数据+= 0x00010001;
    FRAMWrite();
    count++;
    如果(计数> 100)

    P1OUT ^= 0x01;//切换 LED 以显示512K 字节
    计数= 0;//已写入
    数据= 0x00010001;


    空 FRAMWrite (空)

    unsigned int i=0;

    对于(i=0;i< write_size;i++)

    FRAM_WRITE[i]=数据;

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

    尊敬的 Chris:

    作为@David 的描述、 persistent 存储在信息存储器中、因此默认情况 下将启用这些段。

    如果您想将一些数据写入其他 FRAM 部分、则必须启用 FRAM 写入操作。

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:

    这是我的链接文件  lnk_msp430fr5969.cmd 的一部分

    我想在"INFOA "部分存储一些值:  

      1)它是否位于 FRAM 中

       2) 2)如何启用 FRAM 写入操作。

    谢谢

    Chris

    存储器

    SFR:origin = 0x0000、length = 0x0010
    外设_8位:origin = 0x0010、length = 0x00F0
    peripherals_16BIT:origin = 0x0100、length = 0x0100
    RAM:origin = 0x1C00,length = 0x0800
    INFOA:origin = 0x1980,length = 0x0080
    INFOB:origin = 0x1900,length = 0x0080
    INFOC:origin = 0x1880,length = 0x0080
    INFOD:origin = 0x1800,length = 0x0080
    FRAM:origin = 0x4400,length = 0xBB80
    FRAM2:origin = 0x10000、length = 0x3FF8 //边界已更改以修正 CPU47 */
    JTAGSIGNATURE:origin = 0xFF80,length = 0x0004,fill = 0xFFFF
    BSLSIGNATURE:origin = 0xFF84,length = 0x0004,fill = 0xFFFF
    IPESIGNATURE:origin = 0xFF88,length = 0x0008,fill = 0xFFFF
    INT00:origin = 0xFF90,length = 0x0002
    INT01:origin = 0xFF92,length = 0x0002
    INT02:origin = 0xFF94,length = 0x0002

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

    尊敬的 Chris:

    我认为您可以使用以下代码来定义您的变量:

    #pragma DATA_SECTION(a,".infoA")
    unsigned char a;

    如需更多信息、请参阅本文档:

    https://www.ti.com/lit/an/slaa628a/slaa628a.pdf

    此致

    Johnson

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

    尊敬的 John,以下是我非常简单的示例代码:

    ///

    #include
    #include
    #include
    #include
    #include "driverlib.h"

    uint8_t val = 0x0;
    #pragma DATA_SECTION (A、".infoA")
    unsigned char a;
    int main (void){


    WDT_A_HOLD (WDT_A_base);
    Val = 0x55;
    a = val;

    printf ("val =0x%x\n"、val);
    printf (" a =0x%x\n"、a);
    返回(0);

    ///

    然后在我编译并运行它时输出:(它死区不允许写入 infoA 段)   

    Val = 0x55
    A =0xff

    请帮助

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

    尊敬的 Chris:

    这个问题是否被重新讨论过?  

    您是否仍然需要一些支持?

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:

    我尝试了、但没有成功。 我运行到另一个:我无法再将 Engr.out 文件加载到板中,错误是:

     

    MSP430:文件加载器:验证失败:地址0x04800处的值不匹配请验证目标存储器和存储器映射。

    MSP430:GEL:文件:C:\Users\Q\workspace_v10\Engr1\Debug\Engr1.Out:发生数据验证错误、文件加载失败。

    请帮助

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

    尊敬的 Chris:

    我将编写一个示例代码、并在测试通过后不久在这里发布。

    谢谢!

    此致

    Johnson

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

    尊敬的 Chris:

    我在我的侧面测试该代码:

    #include <msp430.h>
    
    #pragma DATA_SECTION(a,".infoA")
    unsigned char a = 1;
    
    
    int main(void)
    {
      WDTCTL = WDTPW | WDTHOLD;                 // Stop WDT
    
      a = 0x55;
    
      // Disable the GPIO power-on default high-impedance mode to activate
      // previously configured port settings
      PM5CTL0 &= ~LOCKLPM5;
    
    
      while (1)
      {
        __delay_cycles(5000);
    
      }
    }
    

    您需要启用写入 MPU:

    测试结果显示信息内存写入正常。

    谢谢!

    此致

    Johnson

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

    谢谢 Johnson。