MSP430讨论区
返回
登录/注册
flash中ACCVIFG问题
楼主
zdes2006 于 2013-06-29 09:55:23
flash中ACCVIFG问题
[P][P]本意是写一个计数器程序,数码管上不断显示计数值,掉电后充新上电则从掉电后数据开始接着计数。程序运行时,有时候掉电后重新上电能显示掉电值,有时候直接从0显示。[/P][P]调试时发现在flash写程序中,执行到*p=0这一句ACCVIFG置位,不知道置位原因,不知道问题是不是出在这。[/P][P]typedef unsigned char uchar;
typedef unsigned int uint;
#include <msp430x16x.h>[/P][P]#define uchar unsigned char
#define uint unsigned int[/P][P]#define wei_h P5OUT|= BIT5
#define wei_l P5OUT&= ~BIT5
#define duan_h P6OUT |= BIT6
#define duan_l P6OUT &= ~BIT6
//数码管7位段码:0--f
const unsigned char scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar value; // 8-bit value to write to segment A
uchar DataBuffer[128];
uchar val;
uchar tt;[/P][P]// Function prototypes
void write_SegA (uchar value);
void copy_A2B (void);
void delay(uint z);
void disp_smg (uchar number) ;
void init (void);
void read_SegA(void);
void main(void)
{
//初始化端口
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
P6DIR |= BIT2;P6OUT |= BIT2; //关电平转换
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
init();
//write_SegA(value);
read_SegA();
while(1) // Repeat forever
{
write_SegA(value); // Write segment A, increment value
//read_SegA();
disp_smg (value);
value++;
if(value==200)
value=0;
}
}[/P][P]void write_SegA (uchar value)
{[/P][P] _DINT();
uchar *Flash_ptr; // Flash pointer
uchar *p;
//while ((FCTL3&BUSY)==BUSY);//等待忙状态结束
Flash_ptr = (uchar *) 0x1080; // Initialize Flash pointer
p=(uchar *)0x1000;
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptr = 0; // Dummy write to erase Flash segment
*p=0;//??ACCVIFG置位
//while ((FCTL3&BUSY)==BUSY);//等待忙状态结束
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
*Flash_ptr = value; // Write value to flash
val=*Flash_ptr;
*p=0xaa;
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
_EINT();
}
void read_SegA(void)
{[/P][P] _DINT();
uchar *Flash_ptr; // Flash pointer
uchar *p;
Flash_ptr = (uchar *) 0x1080; // Initialize Flash pointer
p= (uchar *) 0x1000;
value=*Flash_ptr;
tt=*p;
_EINT();
if(tt!=0xaa)
value=100;
}[/P][P]void disp_smg (uchar number)
{
unsigned int disp,i;
unsigned int num[3];
num[0]=number/100;
num[1]=number%100/10;
num[2]=number%100%10;
for(i=0;i<3;i++)
{
disp=num[I];
P4OUT = ~(1 << i); //输出位选信号
wei_h;
wei_l;
P4OUT = scandata[disp]; //输出段选信号
duan_h;
duan_l;
delay(1000);
}
}[/P][P]void delay(uint z)
{
uint i;
i = z; // Delay
do (i--);
while (i != 0);
}
void init (void)
{
FCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator
}
[/P][/I][/P]
回复
1楼
DC 于 2013-06-29 12:31:04
在程序中找bug通常看得头晕,不过要实现这样的功能。换我来,我会用外部的EEPROM,常用的用24C04,用IO模拟IIC总线控制读写。[P]如果非要用内的LFASH的话,要用信息区的256字节。看你的程序写得也不怎么规范,不过建议你不要将显示与FLASH程序一起调试。这样有便以减少错误,最方面的方法是将显示删除,然后单纯在线调完这FLASH 信息区读写。简单点可以直接使用TI提供的例子,然后再修改。通过写与读的数据来测定是否存储成功。[/P][P]关于这样的例子,我记得在微控论坛的学习库也有写过的。去找找...[/P]
回复
2楼
zdes2006 于 2013-06-29 14:21:43
[P]先谢谢版主了。我初学,看到flash模块,就想自己编个程序测试一下。操作的时候就是仿照TI的例程改的,结果还是出错了。[/P][P] [/P]
回复
3楼
DC 于 2013-06-29 18:35:34
[FACE=宋体][SIZE=9pt]看看这个例子吧:[/SIZE][/FACE]
[FACE=宋体][SIZE=12px]http://www.microcontrol.cn/bbs/a/a.asp?B=112&ID=9201&E=1&EID=69&RootID=10686&p=1&q=1&r=10686[/SIZE][/FACE]
回复
1
电脑版
Page created in 0.0625 seconds width 2 queries.