对于设计的产品来说,我们往往需要保存一些数据,往往我们采用外部的串行flash或者EEPROM,但有时候我们需要存储的配置参数并不是很多,此时如果我们用MSP430作为主控,我们就可以用MSP430-FLASH信息区保存我们的配置参数。
对于MSP430来说,其FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其信息存储器SegmengA和SegmentB各包含128字节,其他段有512字节,SegmentB的地址是: 0x1000到0x107F,SegmentA的地址是: 0x1080到0x10FF。其他段的地址根据容量不同,从0xFFFF开始,每512字节为一段进行分配。
大家应该都知道,对于FLASH存储器来说,其写入数据时,每一位只能由“ 1”变成“ 0”,而不能由“ 0”变成“ 1“,所以当我们有数据要想保存到FLASH存储器时,必须先对目标段进行整段擦除操作,擦除操作使的对应段FLASH存储器变成全“ 1”。这样我们才可以写我们的数据。
先介绍擦除FLASH段的程序。
- void Flash_clr( int *Data_ptr )
- {
- _DINT();
- FCTL1 = 0x0A502; /* ERASE = 1 */
- FCTL3 = 0x0A500; /* Lock = 0 */
- *Data_ptr=0; /* erase Flash segment */
- _NOP();
- _EINT();
- _NOP();
- }
复制代码
FLASH存储器可以按字节写入,也可以按字写入。
- void Flash_wb( unsigned char *Data_ptr,unsigned char byte ){
- _DINT();
- FCTL3 = 0x0A500; /* Lock = 0 */
- FCTL1 = 0x0A540; /* WRT = 1 */
- *Data_ptr=byte; /* program Flash word */
- _EINT();
- }
复制代码- void Flash_ww( unsigned int *Data_ptr, unsigned int word )
- {
- _DINT();
- FCTL3 = 0x0A500; /* Lock = 0 */
- FCTL1 = 0x0A540; /* WRT = 1 */
- *Data_ptr=word; /* program Flash word */
- _EINT();
- }
复制代码
FLASH存储器连续写入n字节
- void flash_memcpy(char *ptr, char *from, int len)
- {
- _DINT();
- FCTL3 = 0x0A500; /* Lock = 0 */
- FCTL1 = 0x0A540; /* Write = 1 */
- while (len)
- {
- *ptr++ = *from++;
- len--;
- }
- _EINT();
- }
复制代码
对于FLASH存储器数据读取就比较简单了,如下
- #define FSEG_A 0x01080 /* Flash Segment A start address */
- #define FSEG_B 0x01000 /* Flash Segment B start address */
- unsigned char Data[8];
- unsigned char *ptr;
- unsigned char i;
- ptr=(unsigned char *)FSEG_A;
- for (i=0;i<8;i++)
- Data[i]=*ptr++;
复制代码
此内容由EEWORLD论坛网友qwerghf原创,如需转载或用于商业用途需征得作者同意并注明出处