zoukankan      html  css  js  c++  java
  • MSP430F149的存储器结构及FLASH读写

    1      概述

    1.1 FLASH特点

        写操作只能将1改写为0,不能将0改写成1。FLASH擦除后所有单元变为1,擦除操作只能针对整个段。FLASH在擦除前不能被改写。

    1.2 MSP430F149存储器编址方式

        MSP430F149的ROM为60K+256B的FLASH,RAM为2K。MSP430存储器采用冯诺依曼结构,RAM和ROM合在一起编址。MSP430F149内部集成有FLASH控制器,可以简化对FLASH的操作。

        64K的寻址空间分为RAM、FLASH。

        RAM分两块:

    1、寄存器(0000H-01FFH),存放特殊寄存器、设备寄存器、变量与堆栈。

    2、数据RAM(01FFH-),存放各种变量、中间结果、堆栈。

        FLASH分两块:

    1、主FLASH 一般用于存放程序代码。

    2、信息FLASH(InfoFlash)用作掉电后保存少量数据。分为InfoA(0X1080-0X10FF)和InfoB(0X1000-0X1080),每段各128B。

    1.3 操作

      三种操作:读取、擦除(只能针对段擦除)、写入(可以写入单个字节)。

    2使用方法

    2.1 程序架构

        读取FLASH方法和读取RAM方法相同。写和擦除FLASH要进行如下配置:

    配置寄存器

    制定指针地址

    写数据/复制数据

    配置寄存器

    2.2 参数配置

        主要配置三个寄存器FCTL1,FCTL2,FCTL3。

        1、配置FLASH控制器时钟。时钟要求控制在250-470Khz之间。

    FCTL2 = FWKEY + FSSEL0 + FN0;  //2分频

        2、用指针指向地址Unsigned char *ptr= (unsigned char *) 0x1080;

        3、进入写模式或擦除模式FCTL1=FWKEY+WRT;或FCTL1=FWKEY+ERASE

        4、清除锁定位 FCTL3=FWKEY;

    5、写数据 *ptr=0x30;或擦除*ptr=0;

    6、退出写状态,恢复锁存

    FCTL1=FWKEY;

    FCTL3=FWKEY+LOCK;

    2.3 说明

        上电FLASH默认状态是读。为防止错误操作,FLASH的三个寄存器FCTLX都采用了密码核对机制FWKEY。

        上电时FLASH的InfoFLASH区域值均为1,可直接进行写操作,但此后的写操作必须先擦除才能正确写入。

    MSP430系列单片机FLASH擦写典型次数是10万次,最低保证1万次。产品设计初期要规划好FLASH的寿命,尽量不让某些需要频繁改动的数据保存在FLASH中,这些数据可保存在RAM中,在断电前才存入FLASH中。

    3相关寄存器

    1、FCTL2

    FWKEY Bits

    15-8

    FCTLx password. Always read as 096h. Must be written as 0A5h or a PUC

    will be generated.

    FSSELx Bits

    7−6

    Flash controller clock source select

    00 ACLK

    01 MCLK

    10 SMCLK

    11 SMCLK

    FNx Bits

    5-0

    Flash controller clock divider. These six bits select the divider for the flash

    controller clock. The divisor value is FNx + 1. For example, when FNx=00h,

    the divisor is 1. When FNx=03Fh the divisor is 64.

    FCTL2 = FWKEY + FSSEL0 + FN0;

    2、FCTL1

    FWKEY

    Bits

    15-8

    FCTLx password. Always read as 096h. Must be written as 0A5h or a PUC

    will be generated.

    MERAS

    ERASE

    Bit 2

    Bit 1

    Mass erase and erase. These bits are used together to select the erase mode.

    MERAS and ERASE are automatically reset when EMEX is set.

    MERAS ERASE Erase Cycle

    0 0 No erase

    0 1 Erase individual segment only

    1 0 Erase all main memory segments

    1 1 Erase all main and information memory segments

    WRT Bit 6 Write. This bit is used to select any write mode. WRT is automatically reset

    when EMEX is set.

    0 Write mode is off

    1 Write mode is on

    3、FCTL3

    FWKEYx Bits

    15-8

    FCTLx password. Always read as 096h. Must be written as 0A5h or a PUC

    will be generated.

    LOCK Bit 4 Lock. This bit unlocks the flash memory for writing or erasing. The LOCK bit

    can be set anytime during a byte/word write or erase operation and the

    operation will complete normally. In the block write mode if the LOCK bit is set

    while BLKWRT=WAIT=1, then BLKWRT and WAIT are reset and the mode

    ends normally.

    0 Unlocked

    1 Locked

    4 实例

    4.1 上电后向InfoFLASH某单元写入一个字节数据

        1、配置FLASH控制器时钟。时钟要求控制在250-470Khz之间。

    FCTL2 = FWKEY + FSSEL0 + FN0;  //2分频

        2、用指针指向地址Unsigned char *ptr= (unsigned char *) 0x1080;

        3、进入写模式FCTL1=FWKEY+WRT;

        4、清除锁定位 FCTL3=FWKEY;

    5、写数据 *ptr=0x30;

    6、退出写状态,恢复锁存

        注意FLASH操作期间不允许中断,所以写FLASH时要对全局中断允许进行操作。

    代码如下:

      WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

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

      unsigned char *ptr=(unsigned char *)0x1080;

      FCTL1=FWKEY+WRT;

      FCTL3=FWKEY;

      _DINT();

      *ptr=0x30;

      while(FCTL3&BUSY);

      _EINT();

      FCTL1=FWKEY;

      FCTL3=FWKEY+LOCK;

    4.2 向FLASH的InfoA中连续写入128B数据

        说明:通过FCTL1将FLASH设为段擦除模式后,只要向某个段内任何存储单元写入0即可进行擦除操作。

    void write_SegA (char value)

    {

      char *Flash_ptr;                          // Flash pointer

      unsigned int i;

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

      FCTL1 = FWKEY + ERASE;                    // Set Erase bit

      FCTL3 = FWKEY;                            // Clear Lock bit

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

      FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

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

      {

        *Flash_ptr++ = value;                   // Write value to flash

      }

      FCTL1 = FWKEY;                            // Clear WRT bit

      FCTL3 = FWKEY + LOCK;                     // Set LOCK bit

    }

  • 相关阅读:
    eclipse导入源码
    servlet文件上传及下载
    MediatorPattern(中介者模式)-----Java/.Net
    IteratorPattern(迭代器模式)-----Java/.Net
    CommandPattern(命令模式)-----Java/.Net
    ResponsibilityChainPattern(责任链模式)-----Java/.Net
    TemplateMethodPattern(模板方法模式)-----Java/.Net
    InterpreterPattern(解释器模式)-----Java/.Net
    ProxyPattern(代理模式)-----Java/.Net
    FlyweightPattern(享元模式)-----Java/.Net
  • 原文地址:https://www.cnblogs.com/yuesheng/p/2099877.html
Copyright © 2011-2022 走看看