MSP430 flash 操作
2020-05-08 来源:eefocus
关于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中)