MSP430读写片内FLASH保存数据



     FLASH型的MSP430单片机都带有信息存储器SegmengA及SegmentB,SegmengA及SegmentB各有128字,SegmentB的地址是:0x01000h到0x107F,SegmentA的地址是:0x01080h到0x010FFh。程序被写入MSP430之后,程序通过SegmengA及SegmentB就可以保存不掉电数据。注意:每次程序烧写到MSP430时,SegmengA及SegmentB都会被擦除!

      接下来贴出本文的程序代码,以及程序写入信息存储器之后的FLASH数据:

  1. #include  <msp430xG43x.h>  
  2.   
  3. void WriteSegment_256 (char index,char *value,char size);  
  4. char ReadSegment_256(char index);  
  5.   
  6. void main(void)  
  7. {  
  8.   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer  
  9.   FCTL2 = FWKEY + FSSEL0 + FN0;             // MCLK/2 for Flash Timing Generator  
  10.    
  11.   char str1[3]={0xAA,0xBB,0xCC};  
  12.     
  13.   WriteSegment_256(0,str1,3);  
  14.     
  15.   for(char i=0;i<255;i++)  
  16.     _NOP();                                   
  17.     
  18.   char str2[3]={0xBB,0xAA,0xCC};  
  19.   WriteSegment_256(0,str2,3);  
  20.     
  21. }  
  22.   
  23. #define SegmentStart 0x01000  //Segment = 0x01000~0x010FF  
  24. #define SegmentSize 255 //SegmentA + SegmentB = 256  
  25.   
  26. //*********************************************************  
  27. //读取片内存储的数据  
  28. //*********************************************************  
  29. char ReadSegment_256(char index)  
  30. {  
  31.   char *flash_ptr = ((char *) SegmentStart) + index;  
  32.   return *flash_ptr;  
  33. }  
  34.   
  35. // *****************************************************  
  36. //把数组写入数据到片内FLASH,必须先全部擦除再写入  
  37. //参数index:保存数组的位置  
  38. //参数value:数组的指针  
  39. //参数size:数组的大小  
  40. // *****************************************************  
  41. void WriteSegment_256 (char index,char *value,char size)  
  42. {  
  43.   char buffer[SegmentSize],i=0;  
  44.   char *flash_ptr = (char *) SegmentStart;  
  45.     
  46.   //先读取原FLASH数组  
  47.   for(i=0;i<SegmentSize;i++)  
  48.     buffer[i]=ReadSegment_256(i);  
  49.     
  50.   //擦除FLASH,必须  
  51.   FCTL1 = FWKEY + ERASE;                    // Set Erase bit  
  52.   FCTL3 = FWKEY;                            // Clear Lock bit  
  53.   *flash_ptr = 0;                           // Dummy write to erase Flash segment  
  54.     
  55.   //把整个数组都写入FLASH  
  56.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation  
  57.     
  58.   for(i=0;i<size;i++)//修改原数组  
  59.     buffer[index+i]=value[i];  
  60.   for(i=0; i<SegmentSize; i++)//写入数据到FLASH  
  61.     *(flash_ptr++) = buffer[i];                     
  62.     
  63.   FCTL1 = FWKEY;                            // Clear WRT bit  
  64.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit  
  65. }  




您有 0条新通知
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值