📄 flash.c
字号:
//参数:wAddr为地址,范围0x1100~0xFFDF 0xFFE0~0xFFFF是中断向量的地址
void ReadFlash(unsigned int wAddr,unsigned char bLen)//@"MYSET"//wAddr:要读取内容的地址 ;blen:读取内容的长度
{
unsigned char *bBuf=0;
unsigned int i = 0;
while (bLen--)
{
bBuf = (unsigned char *)wAddr++;
Temp[i] = *bBuf;
i++;
}
return ;
}
//字节编程
void WriteFlashB(unsigned int wAddr,unsigned char DataB)//@"MYSET"//wAddr:要编程的地址 ;DataB要编程的字节
{
_DINT();
FCTL1 = FWKEY+WRT;//打开写模式
FCTL3 = FWKEY; //写安全键值
while(FCTL3&BUSY==BUSY); //等待FLASH存储器完成操作
*((unsigned char *)wAddr) = DataB;
while(FCTL3&BUSY==BUSY); //等待FLASH存储器完成操作
FCTL1 = FWKEY;
FCTL3 = FWKEY+LOCK;
_EINT();
}
int EraseFlash(unsigned int wAddr)//@"MYSET"//wAddr:要擦除的段内的任一地址
{
_DINT();
unsigned char *P0=0;
while(FCTL3&BUSY==BUSY); //测试FLASH是否忙
P0 = (unsigned char *)wAddr;
FCTL1 = FWKEY+ERASE;//擦除单个段
FCTL3 = FWKEY; //写安全键值
*P0 = 0;
while(FCTL3&BUSY==BUSY); //等待FLASH存储器完成操作
FCTL3 = FWKEY+LOCK;
_EINT();
return 1;
}
void FLASH_Operation()
{
unsigned char q0;
unsigned int iq0;
unsigned char *pq0;
pq0 = FLASH_DATA;
FCTL2 = FWKEY + FSSEL_2 + FN0;//选择时钟源:SMCLK,2分频 + FN4 + FN1
EraseFlash(FLASH_B_ADR); //段擦除首地址0xF040
iq0 = FLASH_B_ADR;
for(q0=0;q0<N_Data;q0++)
{
WriteFlashB(iq0,*pq0); //写字节数据
iq0++; //字节地址+1
pq0++; //字节指针+1
}
ReadFlash(FLASH_B_ADR,N_Data);
for(int q0=0;q0<N_Data;q0++)
{
FLASH_DATA[q0] = Temp[q0];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -