MSP430FLASH小结

对FLASH编程必须满足编程最小电压2.2V;

内部FLASH必须在内存定时器设定的工作频率范围内工作,这个频率为257~476KHz。对于FLASH来讲编程和擦除的速度相对较慢。

MSP430内部集成了Flash控制器。主要由三个部分组成,分别为4个配置寄存器,Flash定时器和编程电压发生器。

配置寄存器主要用来配置Flash控制器的工作状态,Flash定时器用来产生编程会哦或者擦出操作的时钟。编程电压发生器用于产生编程火花则擦除操作中所需要的电压。

特别注意的是,从地址空间0xFFFF到0xFFC0是中断向量表的位置,这块区域可以不做中断向量表,也可以作为用户空间使用,但是不建议这样做。如果开启的中断所对应的中段向量表位置被用作用户空间使用,可能会导致中断服务函数发生跳转错误,进而导致代码跑飞。其中,存储在A段的往往存有器件的校准信息,所以对Segment A的操作设立了保护机制。

在Flash的定时器功能框图中,其时钟源可以是任意一个,通过FSSELx位来完成,选中的时钟源可以通过FNx来进行分频操作。

对Flash进行擦除,除了进行擦除模式配置,还需要对Flash进行一次假写入,一个Flash的写操作用来启动定时器和电压发生器,在写入之后便会对Flash进行擦除。

注意:在对Flash进行写操作之前必须进行一次擦除,否则可能会对Flash造成损毁。

基本步骤:1设置时钟源,得到Flash的工作频率。

     2.

#include "msp430x14x.h"
typedef unsigned char uchar;
typedef unsigned int uint;

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  FCTL2=FWKEY+FSSEL0+FN0;//   时钟源设置,得到Flash的工作频率;
  
  return 0;
}

void Write_SegA(uchar value)
{
  uchar * flashP;
  uchar i;
  flashP=(uchar * )0x1080;
  
  FCTL1=FWKEY+ERASE;
  FCTL3=FWKEY;
  *flashP=0;  //假写入已启动擦除操作;
  
  FCTL1=FWKEY+WRT;
  for(i=0;i<128;i++)
  {
    *flashP++=value;
  }
  FCTL1=FWKEY;
  FCTL3=FWKEY+LOCK;
}

void Copy()
{
   uchar  * flashPa,*flashPb,i;
   flashPa=(uchar *)0x1080;
   flashPb=(uchar *)0x1000;
   FCTL1=FWKEY+ERASE;
   FCTL3=FWKEY;
   *flashPb=0;
   FCTL1=FWKEY+WRT;
   for(i=0;i<128;i++)
   {
     *flashPb++=*flashPa;
   }
   FCTL1=FWKEY;
   FCTL3=FWKEY+LOCK;
}
原文地址:https://www.cnblogs.com/droidxin/p/3417173.html