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.

FRAM 存储数据?

Other Parts Discussed in Thread: MSP430FR5949

第一:之前,仪表的设置参数(通信地址、量程、报警设置 ... 等数据),都是 存储在片外的EEPROM芯片 (AT24C02)中。

 

第二:现在,我打算不在使用,EEPROM芯片 (AT24C02) 存储数据了。直接使用 MSP430FR5949 片上的FRAM替代 片外EEPROM芯片存储的功能。

      就像片外EEPROM芯片一样,在程序执行中,可进行读写,掉电不丢失,

        

第三:《MSP430? FRAM Technology – How To and Best Practices》 手册中,MPUSEGB1和MPUSEGB2两个寄存器,把 FRAM分成三个段,Segment 1、Segment 2、 Segment 3。

        

         Segment 3  是 代码段, 配置为,是只读的、可执行的。

         Segment 2  是 Constants,配置为 只读的, 我的理解是 存储C语言里 const变量。

        

         我对Segment 1理解是:

         Segment 1  是 分成了三段,Variables 、No-init、 Persistent。 配置为 可读写。

        

Variables  包含   对应 C语言里的 局部变量,以及初始化了的全局变量。就是.data段

No-init    包含   对应 C语言里的 未初始化的全局变量 ,就是 .bss 段

Persistent 包含   是针对 标准C里的 malloc()和free() 函数而分配的 堆存储区吗?

 

我的疑问是,我将 仪表的"设置参数",存储在那个段里呢,如果,在FRAM中,再分配一个Segment4,我该如何进行配置呢?

我看到一个官方的FRAM使用例程,是用 指针指向FRAM的地址,进行赋值,如下。

#include "msp430.h"

void FRAMWrite(void);

unsigned char count = 0;
unsigned long *FRAM_write_ptr;
unsigned long data;

#define FRAM_TEST_START 0xD000

int main(void)
{
  WDTCTL = WDTPW | WDTHOLD;                 // Stop WDT

  // Configure GPIO
  P1OUT &= ~BIT0;                           // Clear P1.0 output latch for a defined power-on state
  P1DIR |= BIT0;                            // Set P1.0 to output direction

  // Disable the GPIO power-on default high-impedance mode to activate
  // previously configured port settings
  PM5CTL0 &= ~LOCKLPM5;

  // Initialize dummy data
  data = 0x00010001;

  while(1)
  {
    data += 0x00010001;
    FRAM_write_ptr = (unsigned long *)FRAM_TEST_START;
    FRAMWrite();                            // Endless loop
    count++;
    if (count > 100)
    {
      P1OUT ^= 0x01;                        // Toggle LED to show 512K bytes
      count = 0;                            // ..have been written
      data = 0x00010001;
    }
  }
}

void FRAMWrite(void)
{
  unsigned int i=0;

  for ( i= 0; i<128; i++)
  {
    *FRAM_write_ptr++ = data;
  }
}

官方示例代码中的这个地址 0xD000,我不太明白, 是怎么来的, 随便找了个地址码?

如果是这个地址 0xD000恰好是 函数的局部变量,或者是 代码段地址,岂不就坏了。