shouchengcheng
just do it

msp430_info_flash

MSP430的flash操作

关于flash具体说明,可以参照msp430 user guide中的具体章节。

介绍

一般,在单片机中的flash是用于存放程序代码的,属于只读型存储器(ROM)。但是在许多单片机中内部,都会专门留有一小段flash控制区,用于存放重要的配置参数,使得这些参数在掉电后仍然可以保存在单片机上面。

硬件介绍

430单片机的存储器组织结构采用冯诺依曼结构,RAM和ROM统一编址在同一寻址空间,没有代码空间和数据空间之分。

一般430的单片机都统一在0-64k地址范围中,只有少数高端的型号才能突破64k。地址的大概编码方式见msp430 user guide。(msp430f22x4的是在P310处)

以msp430f22x4为例,它的information memory大小为256个字节,分成4端,分别为segment A、B、C、D。对应的地址从0x010ff-0x01000。每块64个字节。

flash操作包括:字或字节写入;字符串写入;段擦除;主flash擦除。

flash操作时需要把flash时钟的范围控制在257kHz到476kHz。如果不在这个范围内,将会产生不可预料的结果。

擦除:擦除的最小单位是段,有三种擦除模式

    MERAS    ERASE    Erase Mode
    0        1        Segment erase
    1        0        Mass erase(all main memory segments)
    1        1        Erase all flash memory(main and information segments)

通过MERAS、ERASE位来设置擦除模式:段擦除,主flash擦除,全部擦除。

写入:写入的模式由WRT和BLKWRT位来确定

BLKWRT    WRT    Write Mode
    0        1    Byte/word write
    1        1    Block write

这两种模式中块写入要比字或字节写入操作速度大约快两倍,因为在块写入完成之前,变成电压一直维持直到块写入完成。

程序实现

设置Flash时钟,初始化Flash控制器

void flash_init(void)
    {
        FCTL2 = FWKEY + FSSEL_2 + FN1;    //默认SMCLK/3
    }

擦除函数

void flash_erase(unsigned int addr)
    {
        unsigned char *paddr;
        paddr = (unsigned char *)addr;
        FCTL1 = FWKEY + ERASE;
        FCTL3 = FWKEY;
        DINT;
        *paddr = 0;
        flash_wait_for_enable();
        EINT;
    }
    
    void flash_wait_for_enable(void)
    {
        while((FCTL3&BUSY)==BUSY);    //Busy
    }

写入字节

void flash_write_char(unsigned int addr,char data)
    {
        unsigned char * paddr;
        paddr = (unsigned char *)addr;
        FCTL1 = FWKEY + WRT;
        FCTL3 = FWKEY;
        DINT;
        *paddr = data;
        flash_wait_for_enable();
        EINT;
        FCTL1 = FWKEY;
        FCTL3 = FWKEY + LOCK;
    }

读取字

unsigned char flash_read_char(unsigned int addr)
    {
        unsigned char data;
        unsigned char *paddr = (unsigned char *)addr;
        data = *paddr;
        return data;
    }

实际使用事项

向information memory中写入字时,必须是偶数地址,奇数地址会写在这个地址的前一个偶数地址。

程序可以在flash中运行,也可以在RAM中运行,如果在RAM中运行,那么要把程序先从flash中移到RAM中,然后跳转到RAM中运行。(在430这款单片机中,没有必要将程序移到RAM中)

 

 

 

 

posted on 2013-12-12 13:46  shouchengcheng  阅读(970)  评论(0编辑  收藏  举报