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

📄 flash.c

📁 MSP430中可以修改内部存储器任意大小数据的源码
💻 C
字号:
#include  <msp430x14x.h>
#include "def.h"
#include "mmath.h"
 
/*
   
135中的flash块大小为512字节,在该软件中主要修改保存费率和校准数据的常数表,
在430硬件配置文件文件*135.xcl中修改const的存储位置为f000-ffdf 共4k字节,
ee00-efff共512字节用来进行flash修改时的备份存储,
*/
 
 
#define FSEG_A 0x01080  // Flash Segment A start address
#define FSEG_B 0x01000  // Flash Segment B start address
#define FSEG_BAK	0xee00	//back address
#define FSEG_CONST 0x0f000  
 //正常操作标志,正常时通过函数Flash_replaceArray进入,AccessFlashMark=0xaa
 //否则视为非正常
uchar AccessFlashMark;
 
void Flash_replaceArray(uchar *ptr, uchar *data,int num);
//--------------------------------------------------------------------------------------
monitor void Flash_clr(int *ptr)
{
	if (AccessFlashMark!=0xaa)
	return;
FCTL3 = FWKEY;        		// Lock = 0 
FCTL1 = FWKEY+ERASE;        		// Erase = 1 

*((int *) ptr) = 0;     		// Erase flash segment 
	while ((FCTL3 & BUSY)!=0)
	{
	delay(1);//因为擦除时间较长,为不影响主程序时钟中断
	}
}


//--------------------------------------------------------------------------------------
monitor void Flash_secure(void)
{
FCTL1 = FWKEY;        		// Erase, write = 0 
FCTL3 = FWKEY+LOCK;        		// Lock = 1 
}
 


//--------------------------------------------------------------------------------------
//写入的数据少于512个并且不跨页
monitor void Flash_replaceArray1(uchar *ptr, uchar *data,int num)
{
uchar *read_ptr;
uchar *write_ptr;
int *iread_ptr;
int *iwrite_ptr;
int fptr=(int)ptr & 0xfe00;
int i;
  
	if (AccessFlashMark!=0xaa)
	goto endf;
Flash_clr((int *) FSEG_BAK);

//Set to write mode to prepare for copy
FCTL3 = FWKEY;          // Lock = 0 
FCTL1 = FWKEY+WRT;          // WRT = 1 

//Copy block B to A
iread_ptr = (int *) fptr;
iwrite_ptr = (int *) FSEG_BAK;
	for (i = 0;  i < 256;  i++)
	{                
	delay(1);
		if (AccessFlashMark!=0xaa)
		goto endf;
	*iwrite_ptr++ = *iread_ptr++;
	}
Flash_clr((int *) fptr);
                                                                
//Set to write mode to prepare for copy
FCTL3 = FWKEY;          // Lock = 0 
FCTL1 = FWKEY+WRT;          // WRT = 1 

//Copy block A to B, slipping in the new value at the right location
read_ptr = (uchar *) FSEG_BAK;
write_ptr = (uchar *) fptr;
fptr = (int)ptr+num;
	for (i = 0;  i < 512;  i++, read_ptr++, write_ptr++)
	{        
	delay(1);
		if (AccessFlashMark!=0xaa)
		goto endf;
		if ((uint)write_ptr<FSEG_CONST)
		goto endf;
		if ((write_ptr >= ptr) && (write_ptr < (uchar *)fptr))
		{
		*write_ptr = *data;
		data++;
		}
		else
		*write_ptr = *read_ptr;
	}
endf:
Flash_secure();
}

//--------------------------------------------------------------------------------------
//写入的数据任意个、可以跨页
void Flash_replaceArray(uchar *ptr, uchar *data,int num)
{
uint 	loopnum,offset,page,i,num1,address;
uint 	base,npage,start;


AccessFlashMark=0xaa;
address=(int)ptr;

	if (AccessFlashMark!=0xaa)
	goto endfalsh;
	if (address<FSEG_CONST)
	goto endfalsh;
num1=(int)ptr+num;
page=511;
base=address & (~page);
offset=address & page;
page++;
loopnum=(offset+num-1)/page;
	for(i=0;i<=loopnum;i++)
	{
	npage=i*page; 
		if (i==0)
		{
			if (loopnum>=1) num1=page-offset;
			else 	num1=num;
		start=0;
		}
		else if(i==loopnum)
		{
		address=base;
		start=npage-offset;
		num1=num+offset-npage;
		}
		else 
		{
		address=base;
		start=npage-offset;
		num1=page;
		}
		if (AccessFlashMark!=0xaa)
		goto endfalsh;
	Flash_replaceArray1((uchar *)address,(uchar*)((int)data+start),num1);
	base+=page;
	}
endfalsh:
AccessFlashMark=0;
}

⌨️ 快捷键说明

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