基于μPSD32xx系列單片機(jī)無(wú)線遠(yuǎn)程IAP的實(shí)現(xiàn)
IAP簡(jiǎn)介
IAP是應(yīng)用在Flash程序存儲(chǔ)器的一種編程模式??梢栽趹?yīng)用程序控制下,對(duì)程序存儲(chǔ)空間進(jìn)行讀取、擦除、寫(xiě)入操作。與ISP操作非常相似,不需要從電路板上取下芯片用編程器燒寫(xiě),都具有在線編程功能。兩者之間的不同點(diǎn)是:ISP通常是整片擦除、編程,在手工操作下通過(guò)PC串口下載程序到Flash,而IAP卻是在某段程序的控制下對(duì)另外一段程序Flash進(jìn)行讀寫(xiě)操作。
IAP的實(shí)現(xiàn)
IAP就是肩動(dòng)程序把新的用戶程序編程到指定的Flash中。對(duì)Flash程序存儲(chǔ)器的讀/寫(xiě)操作是實(shí)現(xiàn)IAP的關(guān)鍵,下面給予詳細(xì)介紹。
MCU可以像讀ROM器件那樣讀Flash存儲(chǔ)器,但只能使用特殊的擦除和編程指令對(duì)Flash存儲(chǔ)器進(jìn)行編程。
Flash存儲(chǔ)器在被編程之前必須先被擦除。Flash存儲(chǔ)器的一個(gè)字節(jié)被擦除為全1(FFh),通過(guò)設(shè)置選擇位為0來(lái)編程。MCU可一次擦除所有Flash存儲(chǔ)器或一個(gè)扇區(qū),不能按字節(jié)擦除,而MCU可以按字節(jié)編程。一旦MCU發(fā)出Flash存儲(chǔ)器編程/擦除指令,可以通過(guò)幾種方法判斷是否編程/擦除完畢,程序中用到了下面兩種判斷方法來(lái)對(duì)Flash進(jìn)行編程。
數(shù)據(jù)輪詢法
數(shù)據(jù)輪詢法的編程由函數(shù)unsigned char flash_boot_write_with_poll(volatile uchar xdata*addr,uchar dat)完成。當(dāng)從監(jiān)控中心接收的命令是要求用數(shù)據(jù)輪詢法對(duì)舊用戶程序更新時(shí),主程序中就會(huì)調(diào)用此函數(shù),MCU發(fā)出一個(gè)編程指令,內(nèi)置的算法就開(kāi)始運(yùn)行。出錯(cuò)標(biāo)志(DQ5)位為1標(biāo)志編程周期超時(shí),為0標(biāo)志沒(méi)有出錯(cuò)。MCU可以讀取被編程扇區(qū)任意位置的數(shù)據(jù)輪詢(DQ7)位和出錯(cuò)標(biāo)志位。
數(shù)據(jù)跳轉(zhuǎn)法
數(shù)據(jù)跳轉(zhuǎn)法的編程由函數(shù)unsigned char flash_write_with_toggle(volatile uchar xdata*addr,uchar dat)完成。編程周期與數(shù)據(jù)輪詢法大致相同,區(qū)別在于MCU讀的不是DQ7,而是數(shù)據(jù)跳轉(zhuǎn)標(biāo)志(DQ6)位。在編程期間,DQ6位一直跳轉(zhuǎn),直到編程周期完成。DQ5位為1標(biāo)志編程周期超時(shí),為0標(biāo)志沒(méi)有出錯(cuò)。MCU可以讀取被編程扇區(qū)任意位置的DQ6位和DQ5位。
另外,此芯片還有Flash存儲(chǔ)器扇區(qū)保護(hù)功能:主Flash和第二Flash存儲(chǔ)器的每個(gè)扇區(qū)都可以被單獨(dú)地保護(hù),防止被編程和擦除。該功能為所有的編程或擦除失效提供了額外的數(shù)據(jù)安全保障。
在本設(shè)計(jì)中,第二Flash的CSBOOT1扇區(qū)保存了門控的一些固定卡號(hào),此扇區(qū)應(yīng)被保護(hù)。第二Flash的其余幾個(gè)扇區(qū)都作為備用,保存一些電源或空調(diào)參數(shù)以及需要添加的門控卡號(hào),這些數(shù)據(jù)都是可變的,所以不被保護(hù)??梢酝ㄟ^(guò)JTAG口或器件編程器設(shè)置使Flash存儲(chǔ)扇區(qū)被保護(hù)或解除保護(hù)。MCU可以通過(guò)讀扇區(qū)保護(hù)寄存器(CSIOP塊里)來(lái)讀取扇區(qū)保護(hù)狀態(tài),但不能改變它。
IAP功能的主程序設(shè)計(jì)
系統(tǒng)上電后,程序首先在啟動(dòng)扇區(qū)內(nèi)運(yùn)行,等待上位機(jī)發(fā)來(lái)的命令,根據(jù)命令執(zhí)行相應(yīng)操作(見(jiàn)圖2)。超時(shí)或沒(méi)有命令發(fā)來(lái)就自動(dòng)切換到用戶程序。需要更新用戶程序時(shí),切換回啟動(dòng)程序。
異常處理
系統(tǒng)工作中主要有掉電、通信中斷、誤碼這三種情況會(huì)導(dǎo)致程序升級(jí)失敗。以下簡(jiǎn)單介紹本設(shè)計(jì)所采取的一些保護(hù)措施。
第一種情況,考慮到環(huán)境導(dǎo)致的電源穩(wěn)定性差和雷電、繼電器等高壓信號(hào)的干擾。系統(tǒng)采用了高隔離度DC/DC電源模塊把外界地和系統(tǒng)地隔離開(kāi),并且在容易受干擾的串口部分加入了高速光耦進(jìn)行隔離;第二種情況,系統(tǒng)用到了串口、GPRS/GSM、TCP/IP組合成的復(fù)雜通信網(wǎng)絡(luò)。由于只要有一個(gè)通信故障就會(huì)造成上、下位機(jī)之間的通信失敗,所以,為了防止因通信失敗而造成系統(tǒng)癱瘓,程序中用Eeprom_Init函數(shù)在通信失敗或掉電情況下對(duì)數(shù)據(jù)進(jìn)行恢復(fù)和修理;第三種情況,在上、下位機(jī)通信過(guò)程中,盡管通信正常,但由于數(shù)據(jù)量大,有產(chǎn)生誤碼的可能性。因此,程序中對(duì)接收到的每一幀數(shù)據(jù)都先檢驗(yàn)幀類型,然后對(duì)其作4字節(jié)的校驗(yàn)和判斷。如果校驗(yàn)有誤,將錯(cuò)誤信息類型回傳給上位機(jī)重發(fā),直到數(shù)據(jù)完全正確,才將這一幀數(shù)據(jù)保存到Flash相應(yīng)地址里。
結(jié)語(yǔ)
本文所介紹的無(wú)線遠(yuǎn)程IAP的實(shí)現(xiàn)是基于μPSD32xx系列單片機(jī),且已在無(wú)線基站動(dòng)態(tài)環(huán)境監(jiān)控系統(tǒng)項(xiàng)目中使用,極大地方便了系統(tǒng)程序的及時(shí)更新,可靠性也得到了驗(yàn)證??梢灾苯討?yīng)用到各種電力、水資源和其它無(wú)線監(jiān)控系統(tǒng)中。
參考文獻(xiàn):
[1]. GPRS datasheet http://www.dzsc.com/datasheet/GPRS_1594650.html.
[2]. DDC datasheet http://www.dzsc.com/datasheet/DDC_1870710.html.
[3]. Maxim datasheet http://www.dzsc.com/datasheet/Maxim_1062568.html.
[4]. MAX202CPE datasheet http://www.dzsc.com/datasheet/MAX202CPE_1015502.html.
[5]. 74LS11 datasheet http://www.dzsc.com/datasheet/74LS11_1493173.html.
[6]. Q2406B datasheet http://www.dzsc.com/datasheet/Q2406B_561524.html.
[7]. ROM datasheet http://www.dzsc.com/datasheet/ROM_1188413.html.
評(píng)論