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

📄 flash.c

📁 430做的一种门控系统的程序
💻 C
字号:
/*********************************************************** 
文件名称: flash.c
作 者: ADVANCE-007
版 本: V1.0  2007-03-17
说 明: FLASH存储器读写、擦除。时钟源:MCLK 4MHz
修改记录:  
***********************************************************/ 
#include  <msp430x14x.h>
#include "DATATYPE.H"
#include "flash.h"
#include "Delay.h"
/*********************************************************** 
函数名称: void FlashErase(unsigned int adr)
函数功能: 段擦除
入口参数: adr:要擦除的段内的任一地址
出口参数: void
备 注: 擦除,写 FLASH的函数不要经常使用,若经常使用会减少MCU寿命
***********************************************************/ 
void FlashErase(unsigned int adr)  
{
	unsigned char *p0;

	FCTL2=FWKEY+FSSEL_1+FN3+FN4;//外部时钟 MCLK 24分频
	FCTL3=FWKEY;
	while(FlashBusy()==1);	//等待FLASH存储器完成操作
	
	FCTL1=FWKEY+ERASE;
	p0=(unsigned char *)adr;
	*p0=0;			//向段内地址任意写,启动擦除操作
	
	while(FlashBusy()==1);	//等待FLASH存储器完成操作
	
	FCTL1=FWKEY;
	FCTL3=FWKEY+LOCK;
}

/*********************************************************** 
函数名称: unsigned char FlashBusy(void)  
函数功能: 测试FLASH是否忙
入口参数: adr:要擦除的段内的任一地址
出口参数: 1:忙   0:不忙
备 注: 
***********************************************************/ 
unsigned char FlashBusy(void)  
{
if((FCTL3&BUSY)==BUSY)
		return 1;
	else
		return 0;
}

/*********************************************************** 
函数名称: void FlashWW(unsigned int Adr,unsigned int DataW)  
函数功能: 字编程
入口参数:  Adr:要编程的地址,注意:不是指针类型,应当是偶地址
            DataW:要编程的字
出口参数: void
备 注: 擦除,写 FLASH的函数不要经常使用,若经常使用会减少MCU寿命
***********************************************************/ 
void FlashWW(unsigned int Adr,unsigned int DataW)  
{
	FCTL1=FWKEY+WRT;
	FCTL2=FWKEY+FSSEL_1+FN3+FN4;//外部时钟 MCLK 24分频
	FCTL3=FWKEY;
	while(FlashBusy()==1);	//等待FLASH存储器完成操作
	
   *((unsigned int *)Adr)=DataW;
	FCTL1=FWKEY;
	FCTL3=FWKEY+LOCK;	
}

/*********************************************************** 
函数名称: void FlashWB(unsigned int Adr,unsigned char DataB)
函数功能: 字编程
入口参数:  Adr:指向要编程的地址,注意:不是指针类型
            DataB:要编程的字节
出口参数: void
备 注: 擦除,写 FLASH的函数不要经常使用,若经常使用会减少MCU寿命
***********************************************************/ 
void FlashWB(unsigned int Adr,unsigned char DataB)  
{
	FCTL1=FWKEY+WRT;
	FCTL2=FWKEY+FSSEL_1+FN3+FN4;
	FCTL3=FWKEY;
	while(FlashBusy()==1);	//等待FLASH存储器完成操作
	
	*((unsigned char *)Adr)=DataB;
	FCTL1=FWKEY;
	FCTL3=FWKEY+LOCK;
}

/*********************************************************** 
函数名称: unsigned char FlashRead(unsigned int Adr)
函数功能: 读取字节
入口参数:  Adr:FLASH中的地址,注意:不是指针类型
出口参数: 地址中的数据
备 注: 
***********************************************************/ 
unsigned char FlashReadByte(unsigned int Adr)
{
       return *((unsigned char *)Adr);
}

/*********************************************************** 
函数名称: unsigned char FlashRead(unsigned int Adr)
函数功能: 擦除一段FLASH , 然后写一个数组进去
入口参数:  Adr:FLASH中的地址,注意:不是指针类型
            *pBuffer 要写入的数组
            n_byte:要写入的字节数
出口参数: 地址中的数据
备 注: 擦除,写 FLASH的函数不要经常使用,若经常使用会减少MCU寿命
***********************************************************/ 
void FlashEraseWriteSeg(unsigned int Adr,uint8 *pBuffer,uint8 n_byte)//unsigned int DataB   
{  
    unsigned char q0;
    FlashErase( Adr );//擦除一段FLASH操作 
    delay_1ms();
    for(q0=0;q0<n_byte;q0++)//while(*pBuffer)//直到发送完毕
    {
        FlashWB(Adr,*pBuffer);     //字节编程
        pBuffer++;Adr++;
        delay_1ms();
    }
}

void FlashEraseWrite_5(unsigned int Adr,uint8 *pBuffer,uint8 n_byte)
{
unsigned char q0;
FlashErase(Adr);//擦除一段FLASH操作
for(q0=0;q0<n_byte;q0++)//n_byte
    {
        FlashWB(Adr,*pBuffer); Adr ++;  pBuffer ++;  //= 1; //
    }
}


uchar Flash_Array[Flash_Array_Len];
//uchar *Flash_Array;
void FlashReadSeg_21(unsigned int Adr, uint8 n_byte)
{
    uint8 q0;
    for(q0=0;q0<n_byte;q0++)//n_byte
    {
        Flash_Array[q0]= FlashReadByte(Adr); 
        Adr++; //Flash_Array++;  
    }
    /*
    Flash_Array[0] = FlashReadByte(Adr);Adr++;//Flash_Array++;
    Flash_Array[1] = FlashReadByte(Adr);Adr++;//Flash_Array++;
    Flash_Array[2] = FlashReadByte(Adr);Adr++;
    Flash_Array[3] = FlashReadByte(Adr);Adr++;
    Flash_Array[4] = FlashReadByte(Adr); 
    */
    //return Flash_Array;
}
/***********************************************************
函数名称: unsigned char FlashRead(unsigned int Adr)
函数功能: 擦除一段FLASH , 然后写一个数组进去
入口参数:  Adr:FLASH中的地址,注意:不是指针类型
            n_byte:要读取的字节数
出口参数: 地址中的数据
备 注:
 调用示例
uchar *BUF;
BUF=FlashReadSeg( );
***********************************************************/ 
uchar *FlashReadSeg(unsigned int Adr ,uint8 n_byte)
{  
    uchar q0, *Flash_Array;
    for( q0=0; q0<n_byte; q0++)
    {
        Flash_Array[q0] = FlashReadByte(Adr);
        Adr++;
    }
    return Flash_Array;
}

//修改某地址的单个字节,然后写入FLASH段中 的函数
void FlashModifyByte_WriteSeg(uint Adr ,uint8 DataB)
{
    //uchar q0;
    //uchar BUF_temp[Flash_Array_Len];
    FlashReadSeg_21(Flash_Default_Adr, Flash_Array_Len);
    /*for( q0=0; q0<Flash_Array_Len; q0++)
    {
        BUF_temp[q0] = Flash_Array[q0];
    }
    BUF_temp[ (Adr - Flash_Default_Adr) ] = DataB;
    FlashEraseWriteSeg(Flash_Default_Adr,BUF_temp,Flash_Array_Len);*/
    Flash_Array[ (Adr - Flash_Default_Adr) ] = DataB;
    FlashEraseWriteSeg(Flash_Default_Adr,Flash_Array,Flash_Array_Len);
}


//
//void FlashEraseWriteSeg(unsigned int Adr,uint8 *pBuffer,uint8 n_byte)
void FlashModify_N_Byte_WriteSeg( uint Adr, uint8 *pBuffer,uint8 n_byte)
{
    uchar q0;
    for( q0=0; q0<n_byte; q0++)
    {
        Flash_Array[ (q0 + Adr - Flash_Default_Adr) ] = pBuffer[q0];
    }
    FlashEraseWriteSeg(Flash_Default_Adr,Flash_Array,Flash_Array_Len);    
}

⌨️ 快捷键说明

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