打印

MSP430单片机存储器结构总结

[复制链接]
660|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Thorald|  楼主 | 2018-8-30 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FLASH型的MSP430单片机都带有信息存储器SegmengA及SegmentB,SegmengA及SegmentB各有128字,SegmentB的地址是:0x01000h到0x107F,SegmentA的地址是:0x01080h到0x010FFh。程序被写入MSP430之后,程序通过SegmengA及SegmentB就可以保存不掉电数据。注意:每次程序烧写到MSP430时,SegmengA及SegmentB都会被擦除!

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

[cpp] view plain copy
#include  <msp430xG43x.h>  

void WriteSegment_256 (char index,char *value,char size);  
char ReadSegment_256(char index);  

void main(void)  
{  
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer  
  FCTL2 = FWKEY + FSSEL0 + FN0;             // MCLK/2 for Flash Timing Generator  

  char str1[3]={0xAA,0xBB,0xCC};  

  WriteSegment_256(0,str1,3);  

  for(char i=0;i<255;i++)  
    _NOP();                                   

  char str2[3]={0xBB,0xAA,0xCC};  
  WriteSegment_256(0,str2,3);  

}  

#define SegmentStart 0x01000  //Segment = 0x01000~0x010FF  
#define SegmentSize 255 //SegmentA + SegmentB = 256  

//*********************************************************  
//读取片内存储的数据  
//*********************************************************  
char ReadSegment_256(char index)  
{  
  char *flash_ptr = ((char *) SegmentStart) + index;  
  return *flash_ptr;  
}  

// *****************************************************  
//把数组写入数据到片内FLASH,必须先全部擦除再写入  
//参数index:保存数组的位置  
//参数value:数组的指针  
//参数size:数组的大小  
// *****************************************************  
void WriteSegment_256 (char index,char *value,char size)  
{  
  char buffer[SegmentSize],i=0;  
  char *flash_ptr = (char *) SegmentStart;  

  //先读取原FLASH数组  
  for(i=0;i<SegmentSize;i++)  
    buffer[i]=ReadSegment_256(i);  

  //擦除FLASH,必须  
  FCTL1 = FWKEY + ERASE;                    // Set Erase bit  
  FCTL3 = FWKEY;                            // Clear Lock bit  
  *flash_ptr = 0;                           // Dummy write to erase Flash segment  

  //把整个数组都写入FLASH  
  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation  

  for(i=0;i<size;i++)//修改原数组  
    buffer[index+i]=value[i];  
  for(i=0; i<SegmentSize; i++)//写入数据到FLASH  
    *(flash_ptr++) = buffer[i];                     

  FCTL1 = FWKEY;                            // Clear WRT bit  
  FCTL3 = FWKEY + LOCK;                     // Set LOCK bit  
}  
评论
dirtwillfly 2018-8-30 15:50 回复TA
感谢分享 

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

849

帖子

1

粉丝