第一:之前,仪表的设置参数(通信地址、量程、报警设置 ... 等数据),都是 存储在片外的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,恰好是 函数的局部变量,或者是 代码段地址,岂不就坏了。
