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