單片機系統(tǒng)經(jīng)常需要存取一些少量的參數(shù),如串口的地址碼,波特率,等等,裝這些參數(shù)通過PC機進行設(shè)置,并存儲在本地,同時可以利用通訊端口來修改。
參數(shù)可以存儲在EEPROM中,可以放在外掛的存儲器上,或者RTC的后備域中,這樣是一種通用的方法。本處將參數(shù)存放于EEPROM中,因為現(xiàn)在大多數(shù)單片機都提供了片上EEPROM。參數(shù)按16位對齊,事實上可以格式化為任意類型。
/*------------------------------------------------------------Func: 加載參數(shù)到系統(tǒng)
Time: 2011-11-13
Ver.: V1.0
Note:
------------------------------------------------------------*/
void WFS_LoadParams(uint16 Addr,uint16 *Buffer,uint16 Length)
{
Addr<<=1;Length<<=1;
EEPROM_Read(Addr+2,(uint8 *)Buffer,Length);
}
參數(shù)按以上方法加載到內(nèi)存,注意參數(shù)的起始地址為2,這是因為前兩個字節(jié)區(qū)域要用來做校驗用。
/*------------------------------------------------------------Func: 保存參數(shù)
Time: 2011-11-13
Ver.: V1.0
Note:
------------------------------------------------------------*/
void WFS_SaveParams(uint16 Addr,uint16 *Buffer,uint16 Length)
{
Addr<<=1;Length<<=1;
EEPROM_Write(Addr+2,(uint8 *)Buffer,Length);
}
以上方法保存參數(shù)到EEPROM中,實際上與Load方法一一對應(yīng)。
/*------------------------------------------------------------Func: 參數(shù)系統(tǒng)初始化
Time: 2011-11-13
Ver.: V1.0
Note:
------------------------------------------------------------*/
uint8 WFS_InitParams(void *DefaultValues,uint16 Length)
{
uint16 D;
EEPROM_Read(0,(uint8 *)(&D),2);
if(D!=0x55AA){
D=0x55AA;
EEPROM_Write(0,(uint8 *)(&D),2);
EEPROM_Write(2,(uint8 *)DefaultValues,Length);
return 0xFF;
}
return 0x00;
}
參數(shù)的初始化方法,首先讀取EEPROM的0位置處的數(shù)據(jù),判斷是否為0x55AA合法標志,若不是0x55AA,則說明參數(shù)區(qū)為首次使用,需要進行初始化默認參數(shù)填充,于是將DefaultValues所指的默認值填入EEPROM中,并設(shè)置0x55AA標志,以后每次上電便會檢測到參數(shù)的合法性。
以下為使用示例,存儲了地址碼,波特率,數(shù)據(jù)位,停止位四個參數(shù),以及一個18字的數(shù)組。
const uint16 WFS_ParmasValue_Default[]={
1,9600,8,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
};
以下為參數(shù)進行初始化并加載到內(nèi)存:
WFS_InitParams(WFS_ParmasValue_Default,sizeof(WFS_ParmasValue_Default));WFS_LoadParams(0,&DevAddr,1);
WFS_LoadParams(1,&BaudRate,1);
WFS_LoadParams(2,&DataLength,1);
WFS_LoadParams(3,&StopBits,1);
WFS_LoadParams(4,Array,18);
以下為參數(shù)修改后進行保存:
BaudRate=115200;StopBits=2;
WFS_SaveParams(1,&BaudRate,1);
WFS_LoadParams(3,&StopBits,1);