📄 +
字号:
#include <msp430x14x.h>
#define MAXNUM 32 /*存储的总数据量(字节),最大128*/
/*由于每个数据都需要备份,总数据量越小速度越快,不要留太多余量*/
/*后面存储、读取函数可用的存储地址空间为0~(MAXNUM-1)*/
#define FLASH_SAVEADDR (0x1080) /*Flash数据存储区首地址(InfoB)*/
#define FLASH_COPYADDR (0x1000) /*Flash备份存储区首地址(InfoA)*/
union LongChar //长整字节 复合结构
{ unsigned long int Long;
struct ByteL4
{ unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;
};
union FloatChar //浮点字节 复合结构
{ float Float;
struct ByteF4
{ unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;
};
unsigned char FLASH_PSR;
#define DISABLE_INT; FLASH_PSR=__get_SR_register();_DINT();
#define RESTORE_INT; if(FLASH_PSR & GIE) _EINT();
/****************************************************************************
* 名 称:Flash_Init()
* 功 能:对Flash时钟进行初始化设置
* 入口参数:无
* 出口参数:无
* 说 明: 如需使用后面的读写函数,在程序开始必须先调用该初始化函数
配置Flash时钟必须在257~476KHz之间!!
****************************************************************************/
void Flash_Init(void)
{
FCTL2 = FWKEY + FSSEL_2 + FN1; // 默认 SMCLK/3 =349KHz
}
/* Flash时钟必须在257~476KHz之间, */
/* 分频系数= 32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1 */
// Flash时钟选择:
/* FSSEL_0 Flash clock select: 0 - ACLK */
/* FSSEL_1 Flash clock select: 1 - MCLK */
/* FSSEL_2 Flash clock select: 2 - SMCLK */
/****************************************************************************
* 名 称:Flash_Busy()
* 功 能:Flash忙等待
* 入口参数:无
* 出口参数:无
* 说 明: 若Flash忙则等待,直到Flash操作完成(空闲)才返回。
****************************************************************************/
void Flash_Busy()
{
while((FCTL3 & BUSY) == BUSY){_NOP();} //Busy
}
/****************************************************************************
* 名 称:Flash_Erase()
* 功 能:擦除Flash的一个数据块
* 入口参数:Addr:被擦除数据块的首地址
* 出口参数:无
****************************************************************************/
void Flash_Erase(unsigned int Addr)
{ unsigned char *Flash_ptr;
Flash_ptr=(unsigned char *)Addr;
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
DISABLE_INT;
*Flash_ptr = 0; // Dummy write to erase Flash segment B
Flash_Busy(); //Busy
RESTORE_INT;
FCTL1 = FWKEY; // Lock
FCTL3 = FWKEY+LOCK; // Set Lock bit
}
/****************************************************************************
* 名 称:Flash_CopyA2B()
* 功 能:将数据区的内容拷贝到备份区
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Flash_CopyA2B()
{
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR; // Initialize Flash segment B pointer
Flash_Erase(FLASH_COPYADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
*Flash_ptrB++ = *Flash_ptrA++; // copy value segment A to segment B
Flash_Busy(); //Busy
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 称:Flash_write_char()
* 功 能:向Flash中写入一个字节(Char型变量)
* 入口参数:Addr:存放数据的地址
Data:待写入的数据
* 出口参数:无
* 范 例:Flash_write_char(0,123);将常数123写入0单元
Flash_write_char(1,a);将整型变量a写入1单元
****************************************************************************/
void Flash_write_char (unsigned int Addr,unsigned char Data)
{
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_CopyA2B(); //Flash内的数据先保存起来
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment B pointer
Flash_Erase(FLASH_SAVEADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
if(i==Addr)
{
*Flash_ptrA++ =Data; // Save Data
Flash_Busy(); //Busy
Flash_ptrB++;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢复Flash内的其他数据
Flash_Busy(); //Busy
}
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 称:Flash_read_char()
* 功 能:从Flash中读取一个字节
* 入口参数:Addr:存放数据的地址
* 出口参数:读回的数据
****************************************************************************/
unsigned char Flash_read_char (unsigned int Addr)
{ unsigned char Data;
unsigned char *Flash_ptrA; // Segment A pointer
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Data=*(Flash_ptrA+Addr);
return(Data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -