?? flash.c
字號:
#include <msp430x14x.h>
/*
147中的flash塊大小為512字節,可保存常數表,
為修改存儲器時不影響程序區,在*147.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
#define FSEG1 0x08000 // Flash Segment 1 start address
#define FSEG2 0x08200 // Flash Segment 2 start address
#define FSEG3 0x08400 // Flash Segment 3 start address
#define FSEG4 0x08600 // Flash Segment 4 start address
#define FSEG5 0x08800 // Flash Segment 5 start address
#define FSEG6 0x08a00 // Flash Segment 6 start address
#define FSEG7 0x08c00 // Flash Segment 7 start address
#define FSEG8 0x08e00 // Flash Segment 8 start address
#define FSEG9 0x09000 // Flash Segment 9 start address
//----------------Flash段擦除-----------------------------------------------------------
void Flash_clr(int *ptr)
{
FCTL3 = FWKEY; // Lock = 0 ,FCTL3 =0X0A500
FCTL1 = FWKEY+ERASE; // Erase = 1 ,FCTL1 = 0X0A502
*ptr = 0; /* Erase flash segment */
//_EINT(); //因為擦除時間較長,為不影響主程序時鐘中斷
while ((FCTL3 & BUSY)!=0){};
}
//-----Flash 以字方式寫入一個數據----------------------------------------
void Flash_ww(int *dataptr,int word)
{
FCTL3 = FWKEY; // Lock = 0 ,FCTL3 =0X0A500
FCTL1 = FWKEY+WRT; // WRT = 1 ,FCTL1 = 0X0A540
*dataptr=word; //字寫入
}
//-----Flash 以字節方式寫入一個數據----------------------------------------
void Flash_wb(char *dataptr,char byte)
{
FCTL3 = FWKEY; // Lock = 0 ,FCTL3 =0X0A500
FCTL1 = FWKEY+WRT; // WRT = 1 ,FCTL1 = 0X0A540
*dataptr=byte; //字節寫入
}
//-----Flash 普通段以字方式寫入一段數據----------------------------------------
void FlashSeg_ww(int *seg_ptr,int *dataptr)
{
unsigned int i;
FCTL3 = FWKEY; // Lock = 0 ,FCTL3 =0X0A500
FCTL1 = FWKEY+WRT; // WRT = 1 ,FCTL1 = 0X0A540
//_EINT(); //因為時間較長,為不影響主程序時鐘中斷
for(i=0;i<256;i++)
*(seg_ptr+i)=*dataptr++;
}
//-----Flash 普通段以字節方式寫入一段數據----------------------------------------
void FlashSeg_wb(char *seg_ptr,char *dataptr)
{
unsigned int i;
FCTL3 = FWKEY; // Lock = 0 ,FCTL3 =0X0A500
FCTL1 = FWKEY+WRT; // WRT = 1 ,FCTL1 = 0X0A540
//_EINT(); //因為時間較長,為不影響主程序時鐘中斷
for(i=0;i<512;i++)
*(seg_ptr+i)=*dataptr++;
}
//-----Flash Information段以字方式寫入一段數據----------------------------------------
void Flash_InforSeg_ww(int *seg_ptr,int *dataptr)
{
unsigned char i;
FCTL3 = FWKEY; // Lock = 0 ,FCTL3 =0X0A500
FCTL1 = FWKEY+WRT; // WRT = 1 ,FCTL1 = 0X0A540
//_EINT(); //因為時間較長,為不影響主程序時鐘中斷
for(i=0;i<64;i++)
*(seg_ptr+i)=*dataptr++;
}
//-----Flash Information段以字節方式寫入一段數據----------------------------------------
void Flash_InforSeg_wb(char *seg_ptr,char *dataptr)
{
unsigned char i;
FCTL3 = FWKEY; // Lock = 0 ,FCTL3 =0X0A500
FCTL1 = FWKEY+WRT; // WRT = 1 ,FCTL1 = 0X0A540
//_EINT(); //因為時間較長,為不影響主程序時鐘中斷
for(i=0;i<128;i++)
*(seg_ptr+i)=*dataptr++;
}
//-----Flash 禁止擦除和寫入----------------------------------------
void Flash_secure(void)
{
FCTL1 = FWKEY; /* Erase, write = 0 */
FCTL3 = FWKEY+LOCK; /* Lock = 1 */
}
main ()
{
char data[512],*pt;
char xx;
unsigned int i;
WDTCTL=WDTPW+WDTHOLD;
for(i=0;i<512;i++)
data[i]=i;
FlashSeg_wb((char *)0xb000,data);
//Flash_clr((int *)0xb000);
Flash_wb((char *)0xb000,0x99);
Flash_ww((int *)0xb002,0x1100);
Flash_ww((int *)0xb004,0x2233);
pt=(char *)0xb000;
while(1)
{
xx=*pt++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -