📄 flash.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 + -