想用information memory代替外接EEPROM的。
我是按照书上的例子对SegmentA进行擦除和写的,并且读出来的数确实是我写进去的。就是一断电再上电就没反应了,我怀疑是我把其他的段也擦除了?
pFlash=(char *)_AddSegA; //指向SegmentA
FCTL1=FWKEY+ERASE; //允许擦除
FCTL3=FWKEY; //解锁
*pFlash=0; //空写,启动擦除
FCTL1=FWKEY+WRT; //允许写
for(t1=0;t1<10;t1++)
{
*pFlash++ = t1; //字节1:第一次运行程序标志数
}
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK; //锁定
清高手帮忙!
不胜感激。
一断电再上电就没反应了,是什么概念?
参考一下这个程序吧
#include <msp430x11x1.h>
char value; // 8-bit value to write to segment A
// Function prototypes
void write_SegA (char value);
void copy_A2B (void);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
FCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator
value = 0; // initialize value
while(1) // Repeat forever
{
write_SegA(value++); // Write segment A, increment value
copy_A2B(); // Copy segment A to B
}
}
void write_SegA (char value)
{
char *Flash_ptr; // Flash pointer
unsigned int i;
Flash_ptr = (char *) 0x1080; // Initialize Flash pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptr = 0; // Dummy write to erase Flash segment
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<128; i++)
{
*Flash_ptr++ = value; // Write value to flash
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
}
void copy_A2B (void)
{
char *Flash_ptrA; // Segment A pointer
char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_ptrA = (char *) 0x1080; // Initialize Flash segment A pointer
Flash_ptrB = (char *) 0x1000; // Initialize Flash segment B pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrB = 0; // Dummy write to erase Flash segment B
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<128; i++)
{
*Flash_ptrB++ = *Flash_ptrA++; // copy value segment A to segment B
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
}
我就是照着这个程序抄的,只要一擦除,就什么都没了。
一断电再上电就没反应了,就是不能自启动,好像没有固化程序一样,比如板子一上电有个led是靠I/O点亮的,现在不亮了。
给你一段我自己的擦写程序吧,你试一下
/*********************************************************
功能:段擦除
输入参数:x
输出参数:无
返回值:无
调用关系:被主函数main调用
使用的资源:无
*********************************************************/
void eraser (unsigned int *x)
{
while (!(BUSY && FCTL3)) // 忙?
{
break;
}
FCTL1 = FWKEY + ERASE; // 设置寄存器
FCTL3 = FWKEY;
*x = 0; // 空写擦除
while (!(BUSY && FCTL3)) // 忙?
{
break;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK; // 设置寄存器
}
在主程序中仿照这的形式调用
eraser((unsigned int *) 0xF800);
写的程序针对性强一点,你也参考一下吧
/*********************************************************
功能:flash字节/字写入
输入参数:z
输出参数:无
返回值:无
调用关系:被主函数main调用
使用的资源:无
*********************************************************/
void write (unsigned int x, int y, int z,int rw)
{
while (!(BUSY && FCTL3)) // 忙?
{
break;
}
FCTL1 = FWKEY + WRT; // 设置寄存器
FCTL3 = FWKEY;
if (rw) // 数据段写入?
{ // 数据段写入
mse[x].year = yr;
mse[x].month = mr;
mse[x].day = dr;
mse[x].value = meter;
}
if (y) // 最后写入结构写入?
{ // 最后写入结构写入
last.year = yr;
last.month = mr;
last.day = dr;
last.value = meter;
}
if (z)
{
refer = pointer;
}
while (!(BUSY && FCTL3)) // 忙?
{
break;
}
FCTL1 = FWKEY; // 设置寄存器
FCTL3 = FWKEY + LOCK;
}
住程序中:
write (pointer, 1, 1, 1); // 写数据,没到一年
找到原因了,是因为擦除时没有关闭中断,所以程序跑飞了,但是读写就不用关中断。
还有,同样的程序用不同的编译器结果也不同。
在AQ430里就不行,IAR430就可以。