⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 msp430单片机的flash的不同用法的编程
💻 C
字号:
#include  <msp430x14x.h>


/*
147中的flash块大小为512字节,可保存常数表,
为修改存储器时不影响程序区,在*147.xcl中修改const的存储位置为e000-ffdf 共8k字节,
de00-dfff共512字节用来进行flash修改时的备份存储,
*/
#define FSEG_A 0x01080  // Flash Segment A start address
#define FSEG_B 0x01000  // Flash Segment B start address
//#define FSEG_BAK	0xde00	//back address
#define FSEG1 0x08000  // Flash Segment 1 start address
#define FSEG2 0x08200  // Flash Segment 2 start address
#define FSEG3 0x08400  // Flash Segment 3 start address
#define FSEG4 0x08600  // Flash Segment 4 start address
#define FSEG5 0x08800  // Flash Segment 5 start address
#define FSEG6 0x08a00  // Flash Segment 6 start address
#define FSEG7 0x08c00  // Flash Segment 7 start address
#define FSEG8 0x08e00  // Flash Segment 8 start address
#define FSEG9 0x09000  // Flash Segment 9 start address

//----------------Flash段擦除-----------------------------------------------------------
 void Flash_clr(int *ptr)
{
FCTL3 = FWKEY;        		// Lock = 0  ,FCTL3 =0X0A500
FCTL1 = FWKEY+ERASE;        		// Erase = 1 ,FCTL1 = 0X0A502
 *ptr = 0;     		/* Erase flash segment */
//_EINT();	//因为擦除时间较长,为不影响主程序时钟中断
while ((FCTL3 & BUSY)!=0){};
}


//-----Flash 以字方式写入一个数据----------------------------------------
 void Flash_ww(int *dataptr,int word)
{
 
 FCTL3 = FWKEY;        		// Lock = 0  ,FCTL3 =0X0A500
 FCTL1 = FWKEY+WRT;        		// WRT = 1 ,FCTL1 = 0X0A540
 *dataptr=word;               //字写入
}


//-----Flash 以字节方式写入一个数据----------------------------------------
 void Flash_wb(char *dataptr,char byte)
 {
 
 FCTL3 = FWKEY;        		// Lock = 0  ,FCTL3 =0X0A500
 FCTL1 = FWKEY+WRT;             // WRT = 1 ,FCTL1 = 0X0A540
 *dataptr=byte;               //字节写入
 }
 
//-----Flash 普通段以字方式写入一段数据----------------------------------------
void FlashSeg_ww(int *seg_ptr,int *dataptr)
 {
 unsigned int i;
 FCTL3 = FWKEY;        		// Lock = 0  ,FCTL3 =0X0A500
 FCTL1 = FWKEY+WRT;        	// WRT = 1 ,FCTL1 = 0X0A540
 //_EINT();	//因为时间较长,为不影响主程序时钟中断
 for(i=0;i<256;i++)
    *(seg_ptr+i)=*dataptr++;
 }
 
 //-----Flash 普通段以字节方式写入一段数据----------------------------------------
void FlashSeg_wb(char *seg_ptr,char *dataptr)
{
 unsigned int i;
 FCTL3 = FWKEY;        		// Lock = 0  ,FCTL3 =0X0A500
 FCTL1 = FWKEY+WRT;        	// WRT = 1 ,FCTL1 = 0X0A540
 //_EINT();	//因为时间较长,为不影响主程序时钟中断
 for(i=0;i<512;i++)
    *(seg_ptr+i)=*dataptr++;
}
 
//-----Flash Information段以字方式写入一段数据----------------------------------------
 void Flash_InforSeg_ww(int *seg_ptr,int *dataptr)
{
 unsigned char i;
 FCTL3 = FWKEY;        		// Lock = 0  ,FCTL3 =0X0A500
 FCTL1 = FWKEY+WRT;    		// WRT = 1 ,FCTL1 = 0X0A540
 //_EINT();	//因为时间较长,为不影响主程序时钟中断
 for(i=0;i<64;i++)
    *(seg_ptr+i)=*dataptr++;
}

//-----Flash Information段以字节方式写入一段数据----------------------------------------
void Flash_InforSeg_wb(char *seg_ptr,char *dataptr)
{
 unsigned char i;
 FCTL3 = FWKEY;        		// Lock = 0  ,FCTL3 =0X0A500
 FCTL1 = FWKEY+WRT;        	// WRT = 1 ,FCTL1 = 0X0A540
 
 //_EINT();	//因为时间较长,为不影响主程序时钟中断
 for(i=0;i<128;i++)
    *(seg_ptr+i)=*dataptr++;
}
 
//-----Flash 禁止擦除和写入----------------------------------------
 void Flash_secure(void)
{
FCTL1 = FWKEY;        		/* Erase, write = 0 */
FCTL3 = FWKEY+LOCK;        		/* Lock = 1 */
}


main ()
{
 char data[512],*pt;
 char xx;
 unsigned int i;
 
 WDTCTL=WDTPW+WDTHOLD;
 for(i=0;i<512;i++)
  data[i]=i;
 FlashSeg_wb((char *)0xb000,data);
 //Flash_clr((int *)0xb000);
 Flash_wb((char *)0xb000,0x99);
 Flash_ww((int *)0xb002,0x1100);
 Flash_ww((int *)0xb004,0x2233);
 pt=(char *)0xb000;
 while(1)
 {
  xx=*pt++;
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -