社区导航

 

搜索
查看: 284|回复: 0

[资料分享] MSP430-Flash超过64K的读写操作方法

[复制链接]

5935

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-5-23 08:34 | 显示全部楼层 |阅读模式
下面例子是Qiaohaikun先生几年前一直用在MSP430FG4618...使用过的,一直都挺好使。希望在此分享出来能帮助到有需要的网友们。同样,希望各网友们如有精品程序例子的话同样可以发贴到微控论坛来。人人为我,我为人人!
运行代码 复制代码

#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;  
}


回复

使用道具 举报

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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-1-22 01:48 , Processed in 0.077052 second(s), 18 queries , Gzip On, MemCache On.

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