原创 MSP430读写flash程序

2007-11-14 15:52 4697 9 6 分类: MCU/ 嵌入式

用仿真器调试信息段的时候要特别主要将FET-Debugger  Download-Flash erase 选择成Erase main memory.  否则在重启FET的时候会擦除信息段里面的内容


 点击看大图


点击看大图


//******************************************************************************
//******************************************************************************


#include 
#define FLASH_ADDRESS 0x01000                       //定义FLASH信息区地址B段
unsigned char  write_buff[4]={0x01,0x03,0x04,0x09}; //用于存放被数组
unsigned char checkout[4];                          //读出缓冲区,用于验证的


unsigned char num="0";


void flash_erase(unsigned int*);
void read_array(unsigned char  *pc_byte, unsigned char *array,unsigned char amount);
void write_array(unsigned char *pc_byte,unsigned char *array,unsigned char amount);
//******************************************************************************
//FLASH段擦除
void flash_erase(unsigned int *pc_word)
{
 while(FCTL3 & BUSY);                       //如果处于忙状态,则等待
 FCTL3 = FWKEY ;                          //清出LOCK标志,解锁
 FCTL1 = FWKEY + ERASE ;                 //允许段擦除
 *pc_word = 0;                         //擦除..擦除..
 while(FCTL3 & BUSY); 
 FCTL3 = FWKEY + LOCK ;             //加锁
}


//******************************************************************************
//向FLASH信息区读出指定数量的字节数据
//unsigned int*pc_word :信息区数据指针
//unsigned char *array :读出数据存放数据数组,8位长
//unsigned char amount :读操的数量,范围0-127
void read_array(unsigned char *pc_byte, unsigned char *array,unsigned char amount)
{ unsigned char i;
  if(amount<=127)
  {
    for(i=0;i    {
      *array = *pc_byte; //读数据,读数据时,flash地址自动加 1
      array++;          //接收缓冲区地址加 1  
    }
  }
}


//******************************************************************************
//向FLASH信息区写入指定数量的字节数据
//unsigned char *pc_byte 信息区数据指针
//unsigned char *array :读出数据存放数据数组,8位长
//unsigned char amount :读操的数量,范围0-127
void write_array(unsigned char *pc_byte,unsigned char *array, unsigned char amount)
{ unsigned char i;


 while(FCTL3 & BUSY);                    //如果处于忙状态,则等待
 FCTL3 = FWKEY ;                       //清出LOCK标志
 FCTL1 = FWKEY  + WRT ;              //写操作,块编程,+ BLKWRT;


  if(amount<=127)
  {
    for(i=0;i    {  
      *pc_byte = *array;
      //*pc_byte = num;
     // num +=1;
      array++;                       //发送缓冲区地址加 1 
      pc_byte++;                   //写flash时,地址人为加 1
     while(!(FCTL3 & WAIT));   //如果处于忙状态,则等待 ,若用软件仿真,去掉                 //这语句
    }
  
  }
 FCTL1 = FWKEY;           //写操作完成,清除编程允许位 WRT,BLKWRT
 while(FCTL3 & BUSY);
 FCTL3 = FWKEY + LOCK;
}
//******************************************************************************
void main(void)
{
  unsigned char *pc_flash;                            //定义字节指针变量
  unsigned int *pc_flash_segment;                     //定义段地址指针变量


  WDTCTL = WDTPW + WDTHOLD;
  FCTL2 = FWKEY + FSSEL_1 + FN1;              //工作频率设为  MCLK/3,333.3KHZ
  _DINT(); 
 
  pc_flash = (unsigned char *) FLASH_ADDRESS;         //为指针初始化
  pc_flash_segment = (unsigned int *) FLASH_ADDRESS; 
//---------------------------------------------------
   while(1)
  {      
     flash_erase( pc_flash_segment);                     //段擦除
 
     write_array(pc_flash, write_buff,4);               //写入指定字节数量
      
     read_array(pc_flash,&checkout[0],4);                    //再读出刚才写的字节
    _NOP();
  } 
 
  /*for (;;)                             
  {
     //P1OUT ^= 0x01;
    _BIS_SR(LPM3_bits);                 // Enter LPM3
    _NOP();                             // Required only for C-spy
  }*/
}


// Basic Timer interrupt service routine
#pragma vector="BASICTIMER"_VECTOR
__interrupt void BT_ISR(void)
{
  P1OUT ^= 0x01;                        // Toggle P5.1 using exclusive-OR
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户389463 2008-4-29 22:01

好文章,收藏,感谢!
相关推荐阅读
用户1093755 2009-10-30 16:36
移植Linux 2.6.30.4到mini2440(Kernel)
前言:    尽管linux-<?XML:NAMESPACE PREFIX = ST1 />2.6.31直接提供了对mini2440的支持,但移植过程中发现存在的问题比较多,所以最后决定使...
用户1093755 2009-10-30 14:32
linux2.6.16内核的升级
俗话说:"功夫不负有心人",通过编译Linux内核时才能真正体会到.曾经也失败过无数次,放弃过一段时间编译.最后通过自己不断的实践和在网上收集这方面资料,终于在前不久编译成功了.把我在网上收集的资料和...
用户1093755 2009-10-30 14:31
编译内核实践
p> ORCAD仿真数字电路PDF格式教程...个人感觉还不错...HEEH......
用户1093755 2009-10-30 14:31
浅谈Linux内核编译过程...
菜鸟编译Linux内核                        菜鸟俺,最近研究了一下Linux内核的编译,有些许心得,望同大家分享一下,故有此文…我们这里要谈的不涉及到源码,只是一些内核编译的...
用户1093755 2009-10-30 14:30
initrd-x.x.x.img文件分析-制作安装程序不支持的根文件系统
1、initrd img文件分析 Linux不能启动的很多原因都直接或者间接与initrd-x.x.x.img文件有关系,以我的系统为例(具有通用性):initrd-2.4.21-AS.2smp.im...
用户1093755 2009-05-12 15:55
适合C51的DES算法,使用RAM少
网上找的一个DES算法,在其基础上做了下修改DATA只占用23字节Program Size: data="23".0 xdata="163" code="4974"/*DES Arithmetic B...
EE直播间
更多
我要评论
2
9
关闭 站长推荐上一条 /5 下一条