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