智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2109|回复: 2
打印 上一主题 下一主题

[软件类] flash掉电存储问题求解 附程序

[复制链接]

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
QQ
威望
239
贡献
27
兑换币
0
注册时间
2010-12-3
在线时间
18 小时
跳转到指定楼层
1#
发表于 2011-9-24 16:31:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define D_Addr 0x00
#define Program_Dflash  0x11
typedef unsigned char UINT8;
typedef unsigned int UINT16;
typedef  unsigned char      uchar;
typedef  unsigned int       uint;
unsigned char read[8];
uchar k;
void delay(uint j)
{
  uchar i;
  for(;j>0;j--)
  for(i=20;i>0;i--);
}
void Write_Command(uchar index,uint fcmd,uint addr)
{
  FCCOBIX = index;    //set the  conmand mode and parameter
  FCCOB = (fcmd<<8) | addr; //set the address and the data
  
}
void Pre_Start()
{
  if(FCLKDIV_FDIVLD ==0)
  FCLKDIV |= 0x50;  //设置时钟分频,外部晶振为16Mhz   

}
void Start_Command()
{
  FSTAT_CCIF = 1; //To start the command. clear the FSTAT_CCIF begin to write the lauch command
}
void Wait_Complete_Command()
{
  while(FSTAT_CCIF == 0);  //if the command is finish FSTAT_CCIF will be zero
}

void Write_D_Flash(uchar k)
{
  uint des_addr = D_Addr;
  
   
   
     Pre_Start();
   
     if(FSTAT_CCIF)
     {
      
        if(FSTAT_ACCERR)
        {
         
          FSTAT_ACCERR = 1;
          delay(100);           //似乎此处必须加延时
        }
        if(FSTAT_FPVIOL)
        {
         
          FSTAT_FPVIOL = 1;
          delay(100);
        }
        Write_Command(0x00,Program_Dflash,0x10);
        
        Write_Command(0x01,0x00,des_addr);  //0X00
  
        Write_Command(0x02,k,k);
        //Write_Command(0x03,4,8);
        //Write_Command(0x04,16,32);
        //Write_Command(0x05,64,128);

     
  
        Start_Command();
      
        Wait_Complete_Command();
      }
  
}
void ReadEeprom( uchar * srcAddr, uint destAddr, UINT16 size)
{
    EPAGE=0X00;       /* current location */   
while(size != 0)
{
        /* copy to destination */
   *(UINT16 *)srcAddr=*(UINT16 *)destAddr;
        /* next address */
  destAddr=destAddr+1;
        /* next address */
   srcAddr=srcAddr+1;
        /* one byte less */  
  size--;
}
}
  
void main(void)
{
  /* put your own code here */
  
   
   uchar read1[8]={1,2,4,8,16,32,64,128};
   DDRB=0XFF;
   
   ReadEeprom(read,0x0800,0x08);
   k=read[1];
  for(;;) {  
     
   if(k>=7)k=0;
   k++;
  PORTB=read1[k];
   delay(50000);
   delay(50000);
   delay(50000);
   Write_D_Flash(k);
  
   
   }
}


做的流水灯 但是掉电后每次都从初始位置开始 可能是没有写进去 但是读写又正常 就是不能断电存储 求解 谢谢

8

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
威望
191
贡献
107
兑换币
107
注册时间
2013-3-8
在线时间
98 小时
毕业学校
中国计量学院
3#
发表于 2013-3-29 22:52:56 | 只看该作者
我也是这样啊 LZ问题解决了吗
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
威望
199
贡献
49
兑换币
0
注册时间
2012-2-24
在线时间
25 小时
毕业学校
未毕业
2#
发表于 2012-4-11 16:48:06 | 只看该作者
找了好久!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-25 15:23 , Processed in 0.052719 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表