【原创】求助:为什么我对SegmentA进行擦除和写以后,再重新启动就没反应了。

zhouqifa   2006-9-23 16:11 楼主
想用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; //锁定

清高手帮忙!
不胜感激。

回复评论 (6)

一断电再上电就没反应了,是什么概念?
参考一下这个程序吧
#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
}
点赞  2006-9-23 16:29

我就是照着这个程序抄的,只要一擦除,就什么都没了。

一断电再上电就没反应了,就是不能自启动,好像没有固化程序一样,比如板子一上电有个led是靠I/O点亮的,现在不亮了。
点赞  2006-9-23 17:23
给你一段我自己的擦写程序吧,你试一下
/*********************************************************
功能:段擦除
输入参数: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); // 写数据,没到一年
点赞  2006-9-23 17:39
多谢!我试试。
点赞  2006-9-24 21:47
找到原因了,是因为擦除时没有关闭中断,所以程序跑飞了,但是读写就不用关中断。
点赞  2006-10-4 14:23
还有,同样的程序用不同的编译器结果也不同。
在AQ430里就不行,IAR430就可以。
点赞  2006-10-4 18:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复