?? flash11.c
字號:
#include <msp430x14x.h>
/*
149中的flash塊大小為512字節,可保存常數表,
為修改存儲器時不影響程序區,在*149.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
//--------------------------------------------------------------------------------------
monitor void Flash_clr(int *ptr)
{
FCTL3 = FWKEY; /* Lock = 0 */
FCTL1 = FWKEY+ERASE; /* Erase = 1 */
*((int *) ptr) = 0; /* Erase flash segment */
_EINT(); //因為擦除時間較長,為不影響主程序時鐘中斷
while ((FCTL3 & BUSY)!=0){}
}
//--------------------------------------------------------------------------------------
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;
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++)
{
*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
(int *)read_ptr = (int *) FSEG_BAK;
(int *)write_ptr = (int *) fptr;
fptr = (int)ptr+num;
for (i = 0; i < 512; i++, read_ptr++, write_ptr++)
{
if ((write_ptr >= ptr) && (write_ptr < (uchar *)fptr))
{
*write_ptr = *data;
data++;
}
else
*write_ptr = *read_ptr;
}
Flash_secure();
}
//--------------------------------------------------------------------------------------
//寫入的數據任意個、可以跨頁
void Flash_replaceArray(uchar *ptr, uchar *data,int num)
{
uint loopnum,offset,page,i,num1,address;
uint base,npage,start;
address=(int)ptr;
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;
}
Flash_replaceArray1((uchar *)address,(uchar*)((int)data+start),num1);
base+=page;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -