1348|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

MSP430-Flash超过64K的读写操作方法 [复制链接]

#include "msp430xG46x.h"  
void WriteFlashErrorNum(void);  
//----------------------------------------------------------------------  
//功能:从flash中读出数据,只需给出首地址和取出数据的数量  
//日期:2006.12.13  
//输入:waddr为flash的地址,length为数据长度  
//输出:无  
//----------------------------------------------------------------------  
void ReadFlash(unsigned long int waddr,unsigned int length)  
{  
  unsigned char i=0;  
  if(FlashMangleFlag==0)  
  {  
    while(FCTL3 & BUSY);  
    if(length>64) length=64;  
    while(length--)  
    {  
      Internal_flashdata[i++]=__data20_read_char(waddr++);  
    }  
  }  
}  

//----------------------------------------------------------------------  
//功能:段擦除;  
//日期:2006.12.13  
//输入:waddr为flash的地址,  
//输出:无  
//----------------------------------------------------------------------  
//void EraseFlashOneBlock(unsigned long int waddr)  
void EraseFlash(unsigned long int waddr)  
{  
  if(FlashMangleFlag==0)  
  {  
    if((waddr>=0x1f400) && (waddr<0x20000))  
    {  
      while(FCTL3 & BUSY);  
      _DINT();  
      FCTL2 = FWKEY + FSSEL1 + FN4;  
      FCTL3 = FWKEY;                            // Clear Lock bit  
      FCTL1 = FWKEY + ERASE;                    // Set Erase bit  
      __data20_write_char(waddr,0);             // Dummy write to erase Flash segment  
      while(FCTL3 & BUSY);  
      FCTL3 = FWKEY + LOCK;                     // Reset LOCK bit  
      _EINT();  
    }  
  }  
}  

//----------------------------------------------------------------------  
//功能:将数据写入flash;  
//日期:2006.12.13  
//输入:waddr为flash的地址,length为数据长度,*buf为指向数据的指针  
//输出:无  
//----------------------------------------------------------------------  
unsigned char  WriteFlash(unsigned long int waddr,unsigned char *buf,unsigned int length)  
{  
    unsigned int i;  
    unsigned char temp,ErrorFlag = 0;  
    if(FlashMangleFlag==0)  
    {  
      if((waddr>=0x1f400) && (waddr<0x20000))  
      {  
        while(FCTL3 & BUSY);  
        _DINT();  
        FCTL2 = FWKEY + FSSEL1 + FN4;  
        FCTL3 = FWKEY;                            // Clear Lock bit  
        FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation  
        for(i=0;i
        {  
          __data20_write_char(waddr,*buf);     // Write value to flash   
          temp = __data20_read_char(waddr);    // Read one byte  
           
          if(temp!=(*buf))                     // 判断读出的数据和写入的数据是否相当  
          {   
            ErrorFlag = 1;                   //写入flash操作错误标志  
            ErrorFlashNum ++ ;  
          }   
           
          waddr++;buf++;  
        }  
         
        while(FCTL3 & BUSY);  
         
        FCTL1 = FWKEY;  
        FCTL3 = FWKEY + LOCK;                     // Reset LOCK bit  
        _EINT();  
        if(ErrorFlag == 1) WriteFlashErrorNum();  
      }  
    }  
    return ErrorFlag;  
}   


 
点赞 关注

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表