?? flash.txt
字號:
函數功能描述
向指定的Flash存儲單元中寫入數據,目的在于保護數據,掉電不消失
函數定義void Flash_Write (unsigned int *flashdata,unsigned int *flashaddress)
其中指針flashdata表示需要存儲的數據
指針flashaddress表示指定的存儲單元
函數功能描述
讀指定的Flash存儲單元中的數據
函數定義unsigned int Flash_Read (unsigned int *flashdata,unsigned int *flashaddress)
其中指針flashdata表示需要讀出的數據
指針flashaddress表示指定的存儲單元
返回數據為指定存儲地址內的數據
讀寫流程概述:
一、讀FLASH
要用MOVC指令才能讀FLASH,這個比較簡單。
二、寫FLASH
嚴格按照下面的流程即可完成寫操作
1. 禁止中斷。
2. 置位FLWE(FLSCL.0),以允許由用戶軟件寫/擦除FLASH。
3. 置位PSEE(PSCTL.1),以允許FLASH 扇區擦除。
4. 置位PSWE(PSCTL.0),以允許FLASH 寫。
5. 用MOVX 指令向待擦除扇區內的任何一個地址寫入一個數據字節。
6. 清除PSEE 以禁止FLASH 扇區擦除。
7. 用MOVX 指令向剛擦除的扇區中所希望的地址寫入數據字節。重復該步直到所有字節都已寫入(目標扇區內)。
8. 清除PSWE 以禁止FLASH 寫,使MOVX 操作指向XRAM 數據空間。
9. 重新允許中斷。
三、指針
C語言里可沒有MOVC和MOVX,為了實現這兩個指令,需要定義指針。根據Keil C的語法可知,將變量(指針)聲明為code型和xdata型時
相應的賦值操作即對應于MOVC和MOVX。當然,如果用匯編語言就沒這個問題了。
下面給出一個最簡單的例子(在C8051F020及Keil uV2下調試通過,程序的功能是每次復位后P1口的輸出狀態為上次的取反)
#include<c8051f020.h>
unsigned char test; //保存輸出狀態
//在FLASH中保存輸出狀態
/*For reading*/
unsigned char code test_c ;//_at_ 0xCF20
/*For writing*/
unsigned char xdata test_x ;//_at_ 0xCF20;
void ReadState()
{ //從FLASH中讀取信號輸出狀態與PWM值
test=test_c;
}
void StoreState()
{ //此函數不可頻繁調用,對FLASH有損(壽命一般為100000次)
//在FLASH中寫入輸出狀態
EA=0; //為了避免對FLASH的誤寫,需禁止中斷
FLSCL = 0x81; //允許由用戶軟件寫/擦除FLASH
PSCTL = 0x03; //允許FLASH扇區擦除及FLASH寫
test_x=0; //擦除扇區
PSCTL &= 0xFD; //清除PSEE 以禁止FLASH 扇區擦除
test_x=~test; //輸出狀態按位取反后寫入FLASH
PSCTL = 0; //禁止FLASH寫
// FLSCL = 0x80; //disable FLASH writes
EA=1; //重新允許中斷
}
void main(void)
{ WDTCN=0xde;
WDTCN=0xad;
//Add initialization code here
P1MDOUT=0xff;
ReadState();
P1=test;
StoreState();
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -