1. 其閃存空間是分塊的64kB的閃存空間,共分5塊,由低到高分別為8kB(BLOCK0)、8kB(BLOCK1)、16kB(BLOCK2)、16kB(BLOCK3)以及16kB( BLOCK4);
2. 每一塊都可以單獨(dú)擦除;
3. 在程序中可以調(diào)用IAP功能對(duì)閃存中的每一字節(jié)進(jìn)行單獨(dú)編程。
正是由于上述三個(gè)特點(diǎn),在不外擴(kuò)展存儲(chǔ)器情況下,將程序空間剩余下的閃存空間作為數(shù)據(jù)空間,把單片機(jī)接收中斷采集到的信號(hào)通道、延遲時(shí)間等參數(shù)存儲(chǔ)下來,實(shí)現(xiàn)掉電數(shù)據(jù)保存。
軟件設(shè)計(jì)
整個(gè)延時(shí)模塊的軟件包括了PC機(jī)發(fā)送參數(shù)程序,單片機(jī)接收并存儲(chǔ)參數(shù)程序和FPGA信號(hào)延時(shí)處理程序。
PC機(jī)發(fā)送參數(shù)程序是用戶將PC機(jī)的串口與模塊連接,通過PC機(jī)的發(fā)送程序界面,很容易對(duì)信號(hào)進(jìn)行延時(shí)調(diào)整。發(fā)送程序采用VC作為編程語言,調(diào)用串口控件,設(shè)計(jì)方便且界面簡(jiǎn)潔,界面如圖3所示。發(fā)送的每個(gè)數(shù)據(jù)幀8位,包括延遲時(shí)間和信號(hào)通道兩個(gè)參數(shù),其中高三位是要調(diào)整的信號(hào)通道,后五位表示延遲的時(shí)間。發(fā)送程序中,對(duì)界面中的“+”或“?”進(jìn)行一次操作,PC就通過串口向單片機(jī)連續(xù)發(fā)送8路信號(hào)延時(shí)參數(shù),即只要調(diào)節(jié)了任一路信號(hào)的延時(shí),PC機(jī)就會(huì)連續(xù)發(fā)送8個(gè)數(shù)據(jù)幀。

單片機(jī)軟件設(shè)計(jì)
單片機(jī)主要完成與PC之間的通信,數(shù)據(jù)的存儲(chǔ)和上電數(shù)據(jù)的讀取。程序采用C51編寫,編譯采用當(dāng)前編譯效率最高的C51編譯器KEIL。軟件流程圖見圖4。
在P89C51RD2的64k閃存空間中,地址為0000H-7FFFH的32kB閃存空間作為程序空間,整個(gè)單片機(jī)程序編譯后為15k,所以32k的程序空間足夠大。余下的8000H?FFFFH的32kB 閃存空間留作數(shù)據(jù)存儲(chǔ)空間。兩塊數(shù)據(jù)存儲(chǔ)空間輪流使用,當(dāng)數(shù)據(jù)量存滿其中一塊時(shí)通過程序跳轉(zhuǎn)到另一塊,在使用前先將該塊擦除。
各函數(shù)介紹如下:
main()——主程序;
InitUart(void)——串口初始化;
IapInit(void)——IAP功能初始化,使用IAP功能前必調(diào)用;
PowerOnRead(void)——上電讀取最近一次存儲(chǔ)的參數(shù)。模塊對(duì)上電時(shí)間要求不苛刻,最新數(shù)據(jù)的地址可通過查表方式尋找。每一個(gè)數(shù)據(jù)幀占一個(gè)數(shù)據(jù)存儲(chǔ)空間,由于單片機(jī)每次中斷都接收到8個(gè)數(shù)據(jù)幀,所以將每8個(gè)數(shù)據(jù)存儲(chǔ)空間劃分成一組,這樣只要查詢每組的頭一個(gè)地址就能快捷地完成查詢,大大節(jié)省了查詢時(shí)間。
EraseBlock (uint AddressRestore)——判斷當(dāng)前數(shù)據(jù)存儲(chǔ)空間塊滿,并擦除;
RestoreData(void)——數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)存儲(chǔ)空間;
FPGADataUp(uchar DataRec)——更新FPGA接口數(shù)據(jù)。
在程序中,要多次調(diào)用BootROM固件中的子程序。由于IAP子程序接口是匯編語言,為了編寫方便,同時(shí)使程序框架明了,編寫了一個(gè)IAPLIB.A51匯編語言接口函數(shù)庫(kù)和IAPLIB.H頭文件。在程序中加上IAP.H頭文件,調(diào)用固件程序時(shí)就不需在C51程序中嵌入?yún)R編,而是像調(diào)用C語言函數(shù)一樣簡(jiǎn)單,這大大簡(jiǎn)化了編程。
評(píng)論