写MSP430片内flash

发布者:rho27最新更新时间:2015-11-09 来源: eefocus关键字:MSP430  片内flash 手机看文章 扫描二维码
随时随地手机看文章
//******************************************************************************

// 参数: adr 为地址 , 范围 0x1000~0xFFFF
void  FlashRead(long adr,uint8 *bBuf,uint8 bLen)
{
   while (bLen--)
     *bBuf++=*(uint8 *)adr++;
   return;
}


// 写入地址 adr  写入数据:*pc_byte

void FlashWrite(long adr,uchar *Datain,uint len)
{

 //FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK  16*FN4 + 8*FN3
  FCTL3 = FWKEY;
  FCTL1 = FWKEY + WRT;

  while(FCTL3 & BUSY);                //如果处于忙状态,则等待
  while(count--)
  {

    while(FCTL3 & BUSY);
    *(uchar*)adr++ = *Datain++;
  }
  FCTL1 = FWKEY;
  FCTL3 = FWKEY + LOCK;
  while(FCTL3 & BUSY);
}

 

 

 

EraseSectorFlash  过程

 

【430片内FLASH】写MSP430片内flash

 

void EraseSectorFlash(unsigned int adr)
{
     
      _DINT();
      uchar *p0;
      //FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//选择时钟源,分频
      FCTL3 = FWKEY;//清除LOCK
      while(FCTL3 & BUSY);//如果出于忙,则等待
      FCTL1 = FWKEY + ERASE;//使能段操作  每段512字节
      p0 = (unsigned char *)adr;//数值强制转换成指针
      *p0 = 0;            //向段内任意地址写0,即空写入,启动擦除操作
      FCTL1 = FWKEY;
      FCTL3 = FWKEY + LOCK;
      while(FCTL3 & BUSY);
      _EINT();                       //开总中断
}

 

查看空闲的FLASH 地址,避免擦除代码所在的地址。每次擦除均是一段一段的擦除,每段512字节。

找不到datasheet,不知道段的起止地址的,可以打开memory ,在内存窗口,用代码尝试随便写入一个任意地址,看哪些地方被改写成0xFF 就知道段的起止,如:

我们在0x15000写入(EraseSectorFlash(0x15000);),那里原本有非0xFF数据,好辨认(是FF的可以先写再擦)。看到段的起止是15000-151ff 刚好是512 。 

0x15000+0x200->0x15200 所以下一段的起始地址是 0x15200 以此类推。

           

验证代码:

              EraseSectorFlash(0x2A000);
              EraseSectorFlash(0x2A200);
              EraseSectorFlash(0x2A400);
              EraseSectorFlash(0x2A600);
             
              FlashWrite(0x2A000,origin_protect_data,512);
              memset(origin_protect_data,0xCB,900);
              FlashWrite(0x2A200,origin_protect_data,512);
              memset(origin_protect_data,0xCA,900);
              FlashWrite(0x2A400,origin_protect_data,512);
              memset(origin_protect_data,0xC9,900);
              FlashWrite(0x2A600,origin_protect_data,512);
             

【430片内FLASH】写MSP430片内flash
 

 

编译地址分配:
 
在IAR窗口中,点击view》memory ,在内存窗口,点下拉框选择 SER 可知,SFR地址为  0x0000-0fff
                                                                   RAM地址为:0x1c00-5bff
                                                                   FLASH地址:0x5c00-45bff
结合看下面的地址分配图,即可知道各部分代码和数据被分配到什么地方。
 
 
                ****************************************
                                                    *
                    SEGMENTS IN ADDRESS ORDER       *
                                                    *
                ****************************************

SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
DATA16_AN                              0102 - 0103                rel    0
                                       0120 - 0121               2
                                       0140 - 0141               2
                                       0144 - 0145               2
                                       015C - 015D               2
                                       0168 - 016F               8
                                       020A - 020B               2
                                       0222 - 0225               4
                                       0228 - 0229               2
                                       0242 - 0245               4
                                       024A - 024B               2
                                       026A - 026B               2
                                       0282 - 0285               4
                                       028A - 028B               2
                                       02A2 - 02A5               4
                                       02A8 - 02A9               2
                                       0340 - 0341               2
                                       0350 - 0351               2
                                       0380 - 0387               8
                                       0392 - 0397               6
                                       03AE - 03AF               2
                                       03C0 - 03C3               4
                                       03D2 - 03D3               2
                                       0640 - 0641               2
                                       0646 - 0648               3
                                       064C - 064C               1
                                       064E - 064E               1
                                       065C - 065D               2
DATA20_I                               1C00 - 1E26             227   rel    1
DATA20_Z                               1E28 - 28B7             A90   rel    1
CSTACK                                 5400 - 5BFF             800   rel    1
//-------------------------------------以下为编译到FLASH的代码---------------------------
CSTART                                 5C00 - 5C2F              30   rel    1
ISR_CODE                               5C30 - 5E63             234   rel    1
                              5E64 - D123            72C0   rel    1
INTVEC                                 FF80 - FFF9              7A   com    1
RESET                                  FFFE - FFFF                rel    1
DATA20_C                           00010000 - 00019486        9487   rel    1
DATA20_ID                          00019488 - 000196AE         227   rel    1
                ****************************************
                                                    *
                      END OF CROSS REFERENCE        *
                                                    *
                ****************************************
 30 112 bytes of CODE  memory
  5 303 bytes of DATA  memory (+ 81 absolute )
 38 574 bytes of CONST memory
Errors: none
Warnings: none

 

 

1 Msp430Flash型单片机内部Flash存储器介绍


MSP430的Flash存储器是可位、字节、字寻址和编程的存储器。该模块由一个集成控制器来控制编程和擦除的操作。控制器包括三个寄存器,一个时序发生器及一个提供编程、擦除电压的电压发生器。


Msp430的Flash存储器的特点有:


1)  产生内部编程电压


2)  可位、字节、字编程,可以单个操作,也可以连续多个操作


3)  超低功耗操作


4)  支持段擦除和多段模块擦除


2 Flash存储器的分割


Msp430 Flash存储器分成多个段。可对其进行单个字节、字的写入,也可以进行连续多个字、字节的写入操作,但是最小的擦除单位是段。[page]


Flash 存储器被分割成两部分:主存储器和信息存储器,两者在操作上没有什么区别。两部分的区别在于段的大小和物理地址的不同。


以Msp430F149为例,信息存储器有两个128字节的段,即segmentA和segmentB,主存储器有多个512字节的段。Msp430F149内部Flash的地址为0x1000H~0xFFFFH,计60K。信息段SegA的起始地址为0x1080H,信息段SegB的起始地址为0x1000H。


3 Flash存储器的操作


在默认状态下,处于读操作模式。在读操作模式中,Flash存储器不能被擦除和写入,时序发生器和电压发生被关闭,存储器操作指向ROM区。


Msp430 Flash存储器在系统编程ISP(in-system programmable)不需要额外的外部电压。CPU能够对Flash直接编程。Flash存储器的写入/擦除通过BLKWRT、WRT、MERAS、ERASE等位确定。


3.1 擦除


Flash存储器各位的缺省值为1,每一位都可以单独编程为0,但只有擦除操作才能将其恢复为1。擦除操作的最小单位是段。通过erase和meras位设置可选择3种擦除模式。



MERAS


ERASE


擦除模式


0


1


段擦除


1


0


多段擦除(所有主存储器的段)


1


1


整体擦除(LOCKA=0时,擦除所有主存储器和信息存储器的段;主存储器的段只有当LOCKA=0时可以擦除)


擦除操作开始于对擦除的地址范围内的任意位置执行一次空写入。空写入的目的是启动时序发生器和擦除操作。在空写入操作之后,BUSY位自动置位,并保持到擦除周期结束。BUSY、MERAS、ERASE在擦除周期结束后自动复位。


3.2 写入

写入模式由WRT和BLKWRT位进行设置。



BLKWRT(块写入模式选择)


WRT(写模式选择位)


写入模式


0


1


单字节、单字写入


1


1


块写入

所有的写入模式使用一系列特有的写入命令,采用块写入的速度大约是单个写入的2

倍,因为电压发生器在块写入完成器件均能保持。对于这两种写入模式,任何能修改目的操作数的指令均能用于修改地址。一个Flash字不能再擦除器件进行两次以上的写入。


当启动写入操作时,BUSY置位,写入结束时复位。


4 操作编程


4.1 Flash擦除


对Flash要写入数据,必须先擦除相应的段,且对Flash存储器的擦除必须是整段进行的,可以一段一段擦,也可以多段一起擦除。擦除操作的顺序如下:


1)  选择适当的时钟源和分频因子;


2)  清除LOCK位


3)  判断BUSY位,只有当BUSY=0时才可以执行下一步


4)  使能段操作,设置ERASE、MERAS位等(如果是擦除一段,则ERASE=1,如果擦除多段,则MERAS=1,如果擦除整个Flash,则ERASE=1,MERAS=1)


5)  对擦除的地址范围内的任意位置作一次空写入,以启动擦除操作


6)  在擦除周期内,时钟源始终有效,不修改分频因子


7)  操作完成后,置位LOCK


根据上述操作顺序,编写程序代码如下:


void FlashErase(unsigned int adr)


{


  uchar *p0;

(关闭中断:_DINT();//关闭总中断 本人注)

 

  FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//选择时钟源,分频


  FCTL3 = FWKEY;//清除LOCK


  while(FCTL3 & BUSY);//如果出于忙,则等待


  FCTL1 = FWKEY + ERASE;//使能段操作


  p0 = (unsigned char *)adr;//数值强制转换成指针


  *p0 = 0;            //向段内任意地址写0,即空写入,启动擦除操作


  FCTL1 = FWKEY;


  FCTL3 = FWKEY + LOCK;


  while(FCTL3 & BUSY);

 ( _EINT();    //开总中断 本人注)

}


4.2 写入


对Flash的写入数据可以是单字、单字节,也可以是连续多个字或字节(即块操作)。编程写入操作的顺序如下:


1)  选择适当的时钟源和分频因子;


2)  清除LOCK位


3)  判断BUSY位,只有当BUSY=0时才可以执行下一步操作


4)  使能写入功能,设置WRT、BLKWRT(如果写入单字或单字节则WRT=1,如果是块写入,或者是多字、多字节连续写入则WRT=1,BLKWRT=1);


5)  判断BUSY位,只有当BUSY=0时才可以执行下一步操作


6)  写入数据


7)  判忙,完了之后清除WRT,置位LOCK


根据上述操作顺序,编写程序代码如下:


//write single byte


//Adr 为要编程的地址,没有奇偶地址要求、DataB为要编程的字节数据


void FlashWB(unsigned char Adr,unsigned char DataB)


{


  FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK  16*FN4 + 8*FN3


  FCTL3 = FWKEY;


  FCTL1 = FWKEY + WRT; 


  while(FCTL3 & BUSY);


  *((unsigned int *)Adr)=DataB;//数值强制转换成指针,指向地址数据Adr所表示的内存单元

(*((unsigned char *)Adr)?本人注)

                               //将数据字DataW赋值给内存单元


  FCTL1 = FWKEY;


  FCTL3 = FWKEY + LOCK;


  while(FCTL3 & BUSY); 


}


//write single word


//Adr 为要编程的地址,应该是偶地址、DataW为要编程的字数据[page]


void FlashWW(unsigned int Adr,unsigned int DataW)


{


  FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK  16*FN4 + 8*FN3


  FCTL3 = FWKEY;


  FCTL1 = FWKEY + WRT; 


  while(FCTL3 & BUSY);


  *((unsigned int *)Adr)=DataW;//数值强制转换成指针,指向地址数据Adr所表示的内存单元


                               //将数据字DataW赋值给内存单元


  FCTL1 = FWKEY;


  FCTL3 = FWKEY + LOCK;


  while(FCTL3 & BUSY);


}


// 写入地址 *pc_byte  写入数据:*pc_byte

void FlashWrite(uchar *pc_byte,uchar *Datain,uint count)


{


  FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK  16*FN4 + 8*FN3


  FCTL3 = FWKEY;


  FCTL1 = FWKEY + WRT; 


  while(FCTL3 & BUSY);                //如果处于忙状态,则等待


 


  while(count--)


  {


    while(FCTL3 & BUSY);


    *pc_byte++ = *Datain++;


  }


 


  FCTL1 = FWKEY;


  FCTL3 = FWKEY + LOCK;


  while(FCTL3 & BUSY); 


}


注意:在对字写入和字节写入的时候,用于指向信息区数据指针类型的区别,字写入时候为*((unsigned int *)Adr),字节写入时候为*((unsigned char *)Adr)。


4.3 读取


根据查看的书籍资料和网络资料得出,内部Flash的读取操作没有顺序的要求,一般Flash默认的操作方式即为读模式。读取Flash的程序代码如下:



void FlashRead(uchar *pc_byte,uchar *Dataout,uint count)


{


  while(count--)


  {


    *Dataout = *pc_byte;


    Dataout++;


    pc_byte++;


  }


}


在网上查找资料的时候,好像看到过有位网友的博客说,内部Flash的地址是自动加1的,按照他的理解,函数中pc_byte++语句就没有用处了,可是事实不然,我在调试过程中,发现并不能自动加1,pc_byte++语句还是有必要的。调用上述函数,可以通过这样的方式FlashRead((uchar *)0x1000,a,4);即从0x1080地址处开始,连续读取4个字节的数据,送给数组a。


5 小结


对Msp430 片内Flash的操作是通过对3个控制字中的相应位来完成的,只有控制位的正确组合,才能实现相应的功能。


同时在编程中注意灵活使用数组和指针,以及指向数组的指针等,可以达到灵活编程的目的,不过本文中给出的几个程序段,基本上能够实现对Msp430 Flash的擦除、写入等操作。这是我最近3天所作的一些努力,整理一下与大家分享。


本文参考了TI的《MSP430x1xx Family Users Guide》及TI网上提供的关于Flash操作的实例代码,并在网络上收集了一些资料,在此不一一列出,不过本文应该算本人原创,转载请注明。谢谢


 

MSP430X14X Flash 读写操作总结

开发平台:IAR Embedded Workbench、MSP430F149开发板

作者:谭贝贝

Flash操作注意事项

    在读写的过程中电压不能小于2.7V否则擦除和读写的结果将不可预测。Flash的可操作时钟频率为~257KHZ---~476KHZ。如果频率不符合要求,则结果不可预测。

在擦除先需要关闭中断和看门狗,在擦除的过程中如果产生了中断,则会在重新使能中断后产生一个中断请求。Flash只能从1写为0,不能从从0写为1,所以需要擦除。

可以被擦除的最小模块是片段,tAll Erase = tMass Erase = 5297/fFTG, tSeg Erase = 4819/fFTG。

Flash ERASE

MSP430X14X的擦除模式可以从Flash或者RAM中进行。

从Flash中擦除

从Flash中擦除的过程中所有的定时都会被Flash控制,CPU被挂起。擦除完成后需要一个假写入CPU才能复位。从Flash擦除时有可能把后面CPU需要执行的代码擦除。如果发生这样的情况,在擦除后CPU的执行状况将不可预测。

Flash中擦除流程图

图片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html

从RAM中擦除

从RAM中擦除时CPU不会被挂起,可以继续执行代码。必须检测BUSY位以判断擦除是否结束,如果在擦除的过程中(即BUSY=1时)访问Flash,这是一个违规的访问,ACCVIFG会置位,而擦除的结果也将不可预测。

RAM中擦除流程图

图片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html

Flash Write

MSP430X14X有两种写入模式,分为段写入(byte/word write),和块写入(Block Write),块写入要快得多,但是操作麻烦,在擦除的过程中不能有一个Flash word(low + high byte),则会发生损坏。CPU不能在BUSY=1时访问Flash,否则ACCFIG将置位写入将不可预测。

1.Byte/Word write

Byte/Word 写入可以从Flash或者RAM初始化,当从Flash中初始化时,所有的定时都会被Flash控制,CPU被挂起。写完后CPU将继续执行后面的代码。

当从RAM中初始化时,BUSY必须在CPU访问Flash前置0.否则ACCFIG将被置位,写入的结果将不可预测。

在Byte/Word 写模式下写入总时间不能超过4ms,如果超过了,当再想这块任何地址写入数据时必须先擦除。

Byte/Word 写入流程图

 

从RAM中执行Byte/Word 写入

块写入

块写入时没一小块不能超过t_cpt=4ms,块写入只能从RAM中进行,在块写入的过程中WAIT位要置0,当想Flash中写入数据时,需要先检查WAIT位是否为1.当前块写完后BLKWRT要清0.

流程图

图片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html

在擦除或者写入的过程中访问Flash,见下表

Flash的寄存器

FCTL1,选择擦除和写入模式的寄存器

FRKEY/FWKEY 高八位为密码读的密码为96h,写的密码为A5h。

BLKWRT     块写入模式选择位,可以自动被EMEX置位

WRT  字写入模式选择位,可任意自动被EMEX置位

MERASE和ERASE,擦除模式选择位

FCTL2时钟选择寄存器

 

FWKEYx密码位

FSSELx时钟选择位

FNx分频比 分频值等于FN+1

两个例子

#include

#include "BoardConfig.h"

 

void Write_A(uchar value);

void Copy_A2B(void);

 

 

void main( void )

{

  // Stop watchdog timer to prevent time out reset

  WDTCTL = WDTPW + WDTHOLD;

  BoardConfig(0xb8);

  FCTL2 = FWKEY + FSSEL0 + FN0; //Select source

  uchar value = 0;

  for(;;)

  {

    Write_A(value++);     //Write data to segment A

    Copy_A2B();             //Copy data from segment A to segment B

    _NOP();

  }

 

}

 

void Write_A(uchar value)

{

  uchar i;

  uchar *Flash_ptr;

  Flash_ptr = (uchar *)0x1080;

  FCTL1 = FWKEY + ERASE;  //Set ERASE mode

  FCTL3 = FWKEY;          //Clear LOCK

  *Flash_ptr = 0;          //Dummy write

 

  FCTL1 = FWKEY + WRT;

  for(i = 0;i < 128;i++)

  {

    *Flash_ptr++ = value;     //Write value

  }

 

  FCTL1 = FWKEY;            //Clear WRT

  FCTL3 = FWKEY + LOCK;     //Set LOCK

}

 

//Copy data from B to A

void Copy_A2B(void)    

{

  uchar *Flash_ptrA;

  uchar *Flash_ptrB;

  uint i;

  Flash_ptrA = (uchar *)0X1080;

  Flash_ptrB = (uchar *)0x1000;

  FCTL1 = FWKEY + ERASE;

  FCTL3 = FWKEY;

  *Flash_ptrB = 0;

 

  FCTL1 = FWKEY + WRT;

  for(i = 0;i < 128;i++)

  {

    *Flash_ptrB++ = *Flash_ptrA++;

  }

  FCTL1 = FWKEY;

  FCTL3 = FWKEY + LOCK;

}

 

 

 [page]

再来个块写入的(TI例程)

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

//  MSP430F14x Demo - Flash In-System Programming, BlockWrite

//

//  Description: This program first copies the FlashWrite routine to RAM, then

//  erases flash seg A, then it increments all values in seg A using the 64

//  byte block write mode.

//

//  Assumed default MCLK = DCO ~800 kHz.

//  Minimum RAM requirement = 512 bytes

//

//  ** Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash **

//

//               MSP430F149

//            -----------------

//        /||              XIN|-

//         | |                 |

//         --|RST          XOUT|-

//                          |

//

//  H. Grewal / L. Westlund

//  Texas Instruments Inc.

//  Jun 2006

//  Built with IAR Embedded Workbench Version: 3.30A

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

 

#include

 

// Global variables

char value = 0;                             // 8-bit value to write to segment A

char* Flash_ptr;                            // Flash pointer

char* RAM_ptr;                              // RAM pointer

char* END_ptr;                              // End of FlashWrite routine

 

// Function prototypes

void FlashWrite();

void CopyRoutine();

void End_of_FlashWrite();

 

void main(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

 

  _DINT();                                  // Diable Interrupts

  CopyRoutine();                            // Copy FlashWrite routine to RAM

  _EINT();                                  // Enable Interrupts

 

  while(1)                                  // Repeat forever

  {

    Flash_ptr = (char *) 0x1000;            // Initialize Flash pointer

    FCTL2 = FWKEY + FSSEL1 + FN0;           // MCLK/2 for Flash Timing Generator

    FCTL1 = FWKEY + ERASE;                  // Set Erase bit

    FCTL3 = FWKEY;                          // Clear Lock bit

 

    *Flash_ptr = 0;                         // Dummy write to erase Flash segment

    while(!(FCTL3 & WAIT));                 // WAIT until Flash is ready

    asm("CALL #300h");                      // Execute FlashWrite from RAM

                                            // Inline Assembly

    value++;                                // Increment value

    _NOP();                                 // SET BREAKPOINT HERE

  }

}

 

void CopyRoutine()

{

  Flash_ptr = (char*)FlashWrite;            // Set pointer to FlashWrite routine

  RAM_ptr = (char*)0x0300;                  // Set pointer to RAM

  END_ptr = (char*)End_of_FlashWrite;       // Set pointer to End_of_FlashWrite

 

  while(END_ptr != Flash_ptr)               // Check for end of FlashWrite

  {

    *RAM_ptr = *Flash_ptr;                  // Copy word to RAM

    Flash_ptr++;                            // Increment Flash pointer

    RAM_ptr++;                              // Increment RAM pointer

  }

}

 

void FlashWrite()

{

  volatile int i;                           // Use as write counter

  Flash_ptr = (char*)0x1000;                // Initialize Flash pointer

  while(FCTL3 & BUSY);                      // Check Flash BUSY bit

  FCTL1 = FWKEY + BLKWRT + WRT;             // Enable block-write operation

  for(i = 0; i < 64; i++)

  {

    *Flash_ptr = value;                     // Write value to flash

    Flash_ptr++;                            // Double-increment Flash pointer

    while(!(FCTL3 & WAIT));                 // WAIT until Flash is ready

  }

  FCTL1 = FWKEY;                            // Clear BLKWRT & WRT bits

  while(FCTL3 & BUSY);                      // Check Flash BUSY bit

  FCTL3 = FWKEY + LOCK;                     // Reset LOCK bit

  return;                                   // Exits routine

}

 

void End_of_FlashWrite(){}                  // Marks end of FlashWrite

 

 

 

 

 

内容摘要:一、MSP430单片机FLASH存储器模块特点1.8~3.6V工作电压,2.7~3.6V编程电压;擦除/编程次数可达100000次:数据保持时间从10年到100年不等:60KB空间编程时间<5秒:保密熔丝烧断后不可恢复,不能再对JTAG进行任何访问;FLASH编...
 

 

一、MSP430 FLASH模块特点
1.8~3.6V工作电压,2.7~3.6V编程电压;
擦除/编程次数可达100000次:
数据保持时间从10年到100年不等:// 来自 :ST_M_8.C_N
60KB空间编程时间<5秒:
保密熔丝烧断后不可恢复,不能再对JTAG进行任何访问;
FLASH编程/擦除时间由内部硬件控制,无任何软件干预;

二、FLASH存储器的操作
由于FLASH存储器由很多相对独立的段组成,因此可在一个段中运行程序,而对另一个段进行擦除或写入操作。正在执行编程或擦除等操作的FLASH段是不能被访问的,因为这时该段是与片内地址总线暂时断开的。对FLASH模块的操作可分为3类:擦除、写入及读出。而擦除又可分为单段擦除和整个模块擦除;写入可分为字写入、字节写入、字连续写入和字节连续写入
1.FLASH擦除操作:对FLASH要写入数据,必须先擦除相应的段,对FLASH存储器的擦除必须是整段地进行,可以一段一段地擦除,也可以多端一起擦除,但不能一个字节或一个字地擦除。擦除之后各位为1。擦除操作的顺序如下:
选择适当的时钟源和分频因子,为时序发生器提供正确时钟输入
如果Lock=1,则将它复位:
BUSY标志位,只有当BUSY=0时才可以执行下一步,否则不行
如果擦除一段,则设置ERASE=1
如果擦除多段,则设置MERAS=1
如果擦除整个FLASH,则设置RASE=1,同时MERAS=1
对擦除的地址范围内的任意位置作一次空写入,用以启动擦除操作。
在擦除周期选择的时钟源始终有效
在擦除周期不修改分频因子
在BUSY=1期间不再访问所操作的段
电源电压应符合芯片的相应要求// 来自 :ST_M_8.C_N
对FLASH擦除要做4件事
对FLASH控制寄存器写入适当的控制位
BUSY位
空写一次
等待
2.FLASH编程操作。对FLASH编程按如下顺序进行:
选择适当的时钟源和分频因子
如果Lock=1,则将它复位
BUSY标志位,只有当BUSY=0时才可以执行下一步,否则不行
如果写入单字或单字节,则将设置WRT=1
如果是块写或多字、多字节顺序写入,则将设置WRT=1,BLKWRT=1
将数据写入选定地址时启动时序发生器,在时序发生器的控制下完成整个过程
块写入可用于在FLASH段中的一个连续的存储区域写入一系列数据。一个块为64字节长度。块开始在0XX00H、0XX40H、0XX80H、0XXC0H等地址,块结束在0XX3FH、0XX7FH、0XXBFH、0XXFFH等地址。块操作在64字节分界处需要特殊的软件支持,操作如下:
等待WAIT位,直到WAIT=1,表明最后一个字或字节写操作结束
将控制位BLKWRT复位
保持BUSY位为1,直到编程电压撤离FLASH模块
在新块被编程前,等待trcv(编程电压恢复时间)时间
在写周期中,必须保证满足以下条件:
被选择的时钟源在写过程中保持有效
分频因子不变
在BUSY=1期间,不访问FLASH存储器模块
对FLASH写入要做4件事
对FLASH控制寄存器写入适当的控制位
BUSY位
写一个数据
继续写一直到写完
3.FLASH错误操作的处理:在写入FLASH控制寄存器控制参数时,可引发以下错误:
如果写入高字节口令码错误,则引发PUC信号。小心操作可避免
在对FLASH操作期间读FLASH内容,会引发ACCVFIG状态位的设置。小心操作可避免
在对FLASH操作期间看门狗定时器溢出。建议用户程序在进行FLASH操作之前先停止看门狗定时器,等操作结束后再打开看门狗
所有的FLASH类型的MSP430器件0段都包含有中断向量等重要的程序代码,如果对其进行擦除操作,将会引起严重的后果
不要在FLASH操作期间允许中断的发生
4.FLASH操作小结
对FLASH的操作是通过对3个控制字中的相应位来完成的,只有控制位的唯一组合才能实现相应的功能。下表给出了正确的控制位组合:
功能              BLKWRT   WRT   Meras   Erase  BUSY  WAIT  Lock
字或字节写入                              0
块写入                                    0
段擦除并写入                              0
擦除A和B以外段                            0
全部擦除并写入                            0

三、FLASH寄存器说明// 来自 :ST_M_8.C_N
允许编程、擦除等操作首先要对3个控制寄存器(FCTL1、FCTL2、FCTL3)的各位进行定义。它们使用安全键值(口令码)来防止错误的编程和擦除周期,口令出错将产生非屏蔽中断请求。安全键值位于每个控制字的高字节,读时为96H,写时为5AH。
1.FCTL1 控制寄存器1(用于控制所有写/编程或者删除操作的有效位),各位定义如下:
bit15~8                  bit7    bit6    bit5    bit4    bit3    bit2    bit1    bit0
安全键值,读为96H,写5AH    BLKWRT  WRT     --      --      --      MERAS   ERASE   -- 
BLKWRT——段编程位。如果有较多的连续数据要编程到某一段或某几段,则可选择这种方式,这样可缩短编程时间。在一段程序完毕,再编程其它段,需对该位先复位再置位,在下一条写指令执行前WAIT位应为1。
0:未选用段编程方式
1:选用段编程方式
WRT——编程位
0:不编程,如对FLASH写操作,发生非法访问,使ACCVIFG位置位;
1:编程
MERAS——主存控制擦除位
0:不擦除
1:主存全擦除,对主存空写时启动擦除操作,完成后MERAS自动复位
ERASE——擦除一段控制位
0:不擦除
1:擦除一段。由空写指令带入段号来指定擦除哪一段,操作完成后自动复位
2.FCTL2 控制寄存器2(对进入时序发生器的时钟进行定义),各位定义如下:
bit15~8                bit7    bit6    bit5    bit4    bit3    bit2    bit1    bit0
安全键值,读为96H,写5AH  SSEL1   SSEL0   FN5     FN4     FN3     FN2     FN1     FN0
SSEL1、SSEL0——选择时钟源
0:ACLK
1:MCLK
2:SMCLK
3:SMCLK
FN5~FN0——分频系数选择位
0:直通
1:2分频
2:3分频
...... read datasheet
63:64分频
3.FCTL3 控制寄存器3(用于控制FLASH存储器操作,保存相应的状态标志和错误条件),各位定义如下:
bit15~8                bit7    bit6    bit5    bit4    bit3    bit2    bit1    bit0
安全键值,读为96H,写5AH  --      --      EMEX    Lock    WAIT    ACCVIFG  KEYV   BUSY
EMEX——紧急退出位。对FLASH的操作失败时使用该位作紧急处理
0:无作用
1:立即停止对FLASH的操作
Lock——锁定位,给已经编程好的FLASH存储器加锁
0:不加锁,FLASH存储器可读、可写、可擦除
1:加锁,加锁的FLASH存储器可读、不可写、不可擦除
WAIT——等待指示信号,该位只读。// 来自 :ST_M_8.C_N
0:段编程操作已经开始,编程操作进行中
1:段编程操作有效,当前数据已经正确地写入FLASH存储器,后续编程数据被列入计划
ACCVIFG——非法访问中断标志。当对FLASH阵列进行编程或擦除操作时不能访问FLASH,否则将使得该位置位
0:没有对FLASH存储器的非法访问
1:有对FLASH存储器的非法访问
KEYV——安全键值(口令码)出错标志位
0:对3个控制寄存器的访问,写入时高字节是0A5H
1:对3个控制寄存器的访问,写入时高字节不是0A5H,同时引发PUC信号
KEYV不会自动复位,须用软件复位
BUSY——忙标志位。该位只读。每次编程或擦除之前都应该检查BUSY位。当编程或擦除启动后,时序发生器将自动设置该位为1,操作完成后BUSY位自动复位
0:FLASH存储器不忙
1:FLASH存储器忙

 

可以在程序中擦写FLASH这样就不用判断Busy的标志,因为只有擦写完成的时候FLASH才有效!程序才能继续走!如果把程序拷到RAM中擦除就要判断BUSY了!
擦写完成后可以不用LOCK,用LOCK只是一个保险作用!防止你对FLASH的非法操作


关键字:MSP430  片内flash 引用地址:写MSP430片内flash

上一篇:单片机延时汇编语言计算方法
下一篇:复杂指令集CISC和简单指令集RISC以及ARM和X86的区别

推荐阅读最新更新时间:2024-03-16 14:38

基于MSP430F133的电子镇流器综合测试仪
引言 电子节能灯是走进千家万户的产品,提高它的品质对于提倡节能的现代化建设有重要意义,对于生产企业则是增强产品竞争力的必由途径,电子节能灯实现节能的主要原理是以电子镇流器代替传播电感镇流器,提高电子节能灯品质最重要的是要保证电子镇流器的品质,我校受企业的委托研制了本综合测试仪,用于生产过程中的分析,测试电子镇流器的性能。 1 电子镇流器主要测试项目 电子镇流器原理可以简化为图1所示的电路,影响电子镇流器性能的主要指标有:启动阶段的预热灯管电压,预热灯丝电流和预热时间,稳定后的灯管电压、灯管电流、灯丝电流、振荡频率、输入电流、输入功率和功率因素,为此须放置传感器采集输出端的灯管电压,灯丝电流,阴极电路和振荡频率,采集输入端
[测试测量]
MSP430低功耗设置小结
设置低功耗模式也就是对SR状态寄存器当中的位进行操作SCG0.SCG1,CPUOFF,OSCOFF等位进行操作 如果我们要设置低功耗模式,那一般来说也是要设置 中断的,在中断函数中打开CPU来执行我们想要执行的程序 大部分时间CPU是处于OFF状态的,这样可以达到降低功耗的目的 void main { unsigned char i; BCSCTL1|=DIVA_2; WDTCTL=_WDT_ADLY_1000; IE1|=WTDIE; while(1) { _BIS_SR(LPM3_bits); i++; } } #pragma vector=WDT_VECTO
[单片机]
MSP430的学习(3)
MSP430单片机具有基本定时器(Basic Timer1),经常用于低功耗当中,他工作的目的就是支持软件和各种外围模块工作于低频率 低功耗条件下。通过对SMCLK或者ACLK进行分频,向其他外围模块提供低频控制信号。 Bacis Timer1有两个计数单元(BTCN1 BTCN2和一个控制单元BTCTL。他可作为两个独立的8位定时器或一个16位定时器。 一:Basic Timer1的寄存器 同过控制仅存器的设置可以对计数单元BTCNT1 BTCNT2进行软件控制。当出现异常状况时,该寄存器各位保持原状态。用户程序在Basic Timer初始化期间来设定操作条件。 1:BTCTL控制寄存器:其信息决定了Timer1的运行状况
[单片机]
详解MSP430看门狗使用方法
以MSP430F2274为例。其中汇编实现采用的是IAR汇编,CCE汇编实现稍作修改即可。 1.看门狗有三种工作模式:停止模式,计时器模式,看门狗模式。 2.其中后两种模式可以选择的时钟源有:SMCLK和ACLK。 3.在使用后两种模式时候要注意单片机所处的状态下看门狗能否工作,如单片机处在LPM3时候只有ACLK时钟,处在LPM4下,没有时钟可以使用。 4.看门狗模式的使用方法:当看门狗计数溢出时,程序复位。在程序中开启看门狗,在计数溢出前清空看门狗,或重置看门狗,以使其重新计数。若程序跑飞,看门狗可能没有被清空或重置,就会溢,使程序复位。 5.在MSP430F2274中,看门狗模式下可以计时最长为1s,若需
[单片机]
MSP430数码管的使用Ⅰ
首先应该了解数码管及其工作原理。了解你使用的是共阴还是共阳数码管,其次了解数码管的段选位选。 接下来是一个例程 #include msp430f149.h typedef unsigned char uchar; #define wei_h P5OUT |= BIT5 #define wei_l P5OUT &= BIT5 #define duan_l P6OUT &= ~BIT6 #define duan_h P6OUT |= BIT6 uchar table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,
[单片机]
MSP430F5438学习笔记 初始化XT1
// 时钟默认情况 // FLL时钟 FLL选择 XT1 // 辅助时钟 ACLK选择 XT1 32768Hz // 主系统时钟 MCLK选择 DCOCLKDIV 1048576Hz // 子系统时钟 SMCLK选择 DCOCLKDIV 1048576Hz #include msp430.h int main(void) { WDTCTL = WDTPW+WDTHOLD; // 停止看门狗 P4DIR |= BIT0; // P4.0输出状态 // 启动XT1 P7SEL |= 0x03; // P7.0 P7
[单片机]
MSP430F149为主控芯片的超低功耗智能火灾报警系统设计
引言 火灾严重威胁着人类的生命财产安全,每年我国由火灾引起的灾难数不胜数,然而,准确、及时的对火灾进行预测已成为迫在眉睫的事情。目前,火灾探测技术是预防火灾发生的最有效的手段,根据火灾发生初期的迹象来判断并进行预测,从而使人们在第一时间对这些迹象进行处理,有效的减少了火灾的发生。 普通可燃物燃烧的表现形式是:首先产生燃烧气体和烟雾,在氧气供应充足的条件下才能达到完全燃烧,产生火焰并发出一些可见光与不可见光,同时释放大量的热,使得环境温度升高。普通可燃物由初起阴燃阶段开始,到火焰燃烧、火势渐大,最终酿成火灾的起火过程。在该系统中我们以环境温度、烟雾浓度作为判断火灾的依据。 传统火灾报警系统有结构简单、准确度低、存在误报和漏报
[单片机]
以<font color='red'>MSP430</font>F149为主控芯片的超低功耗智能火灾报警系统设计
基于msp430G2553的低频方波频率、占空比、峰峰值测量函数
使用的平台是TI公司的launch pad,频率和占空比已经实现,峰峰值还有有待改进 1、主函数部分: /********************************************* * _ooOoo_ * * o8888888o * * 88 . 88 * * (| -_- |) * * O = /O * * ____/`---'____ * * .' \| |// `. * *
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved