摘要:本文介紹了兩個(gè)固件,用作Teridian? 71M6521電表IC的演示程序,版本號為4.8p。這些固件有助于改善71M6521在功率模式之間轉(zhuǎn)換時(shí)的可靠性,并在器件恢復(fù)工作模式后提供適當(dāng)?shù)?a href="http://www.brongaenegriffin.com/tags/實(shí)時(shí)時(shí)鐘/" target="_blank">實(shí)時(shí)時(shí)鐘(RTC)修正。文章討論了程序修改及設(shè)計(jì)細(xì)節(jié),便于用戶對現(xiàn)有固件進(jìn)行必要的更新。?
?
概述
微調(diào)“保險(xiǎn)絲”
微調(diào)“保險(xiǎn)絲”實(shí)際上指的是一組非易失(NV)存儲(chǔ)器,在Maxim的Teridian電表IC生產(chǎn)過程中用于調(diào)整IC的模擬和數(shù)字特征參數(shù)。器件出廠后,微調(diào)“保險(xiǎn)絲”內(nèi)存儲(chǔ)的內(nèi)容不再改變,用于后續(xù)產(chǎn)品中的參數(shù)補(bǔ)償,例如,用來微調(diào)VREF電壓,使其穩(wěn)定在1.195 VDC ,誤差不超過±1mV;還可用于調(diào)整VBIAS內(nèi)部電壓,使其穩(wěn)定在目標(biāo)值。
IC工作期間,按照固定的時(shí)間間隔讀取微調(diào)“保險(xiǎn)絲”的數(shù)值,由IC內(nèi)部的硬件電路進(jìn)行適當(dāng)?shù)膮?shù)調(diào)整。從“保險(xiǎn)絲”讀取的數(shù)據(jù)送入硬件控制電路和位于I/O RAM的保險(xiǎn)絲寄存器(圖1)。71M6521系列產(chǎn)品中共包含7個(gè)獨(dú)立的微調(diào)“保險(xiǎn)絲”數(shù)值,向I/O RAM寄存器0x20FD (TRIMSEL)寫入1-7之間的任何數(shù)值,可從I/O RAM寄存器0x20FF (TRIM)中讀取相應(yīng)的“保險(xiǎn)絲”數(shù)據(jù)。
圖1. 微調(diào)保險(xiǎn)絲工作原理
錯(cuò)誤讀取微調(diào)“保險(xiǎn)絲”
71M6521 IC支持三種低功耗模式(休眠模式、LCD單獨(dú)有效模式以及關(guān)斷模式)。低功耗模式下,無法支持IC正常工作的電流消耗。
在極端的電磁干擾(EMI)環(huán)境下,或者是當(dāng)電源超乎尋常地反復(fù)斷電的情況下,可能會(huì)影響到“保險(xiǎn)絲”數(shù)據(jù)的讀取和參數(shù)調(diào)整,錯(cuò)誤地讀取到某個(gè)“保險(xiǎn)絲”數(shù)據(jù)。發(fā)生這種情況時(shí),可能導(dǎo)致幾種錯(cuò)誤結(jié)果。當(dāng)電源發(fā)生高速“振蕩”,使得71M6521在工作模式與關(guān)斷模式之間反復(fù)切換時(shí),將會(huì)提高器件故障的概率,當(dāng)交流電緩慢爬升、下降,而后續(xù)使用的是“軟”電源時(shí),很容易發(fā)生這種狀況。電源振蕩導(dǎo)致71M6521在正常供電(正常工作模式)和低功耗(關(guān)斷)模式之間頻繁切換,由于“保險(xiǎn)絲”讀取錯(cuò)誤導(dǎo)致器件故障的可能性非常小,只有當(dāng)電表在長達(dá)若干天,甚至幾個(gè)星期的時(shí)間內(nèi)頻繁斷電時(shí),才有可能看到故障狀況。
“保險(xiǎn)絲”讀取錯(cuò)誤導(dǎo)致IC工作故障可能有幾種不同的表現(xiàn)形式,具體取決于錯(cuò)誤讀取的“保險(xiǎn)絲”數(shù)據(jù)。故障現(xiàn)象可能是以下幾種情況之一:
MPU軟件運(yùn)行在未知狀態(tài),但依據(jù)固件的不同,有些情況下可能終止內(nèi)部時(shí)鐘,使看門狗定時(shí)器無法復(fù)位電表。
產(chǎn)生未知的內(nèi)部電源電壓和檢測門限,這種情況下可能導(dǎo)致外部電源作用到V1引腳,在喚醒時(shí)鐘尚未建立的前提下進(jìn)入休眠模式。有些情況下,不恰當(dāng)?shù)爻跏蓟瘍?nèi)部電源達(dá)到一個(gè)超時(shí)限制時(shí),可能導(dǎo)致RTC計(jì)時(shí)錯(cuò)誤。
在電表中從根本上消除EMI可能不太現(xiàn)實(shí),但是,在器件進(jìn)入關(guān)斷模式時(shí)通過測試IC的微調(diào)“保險(xiǎn)絲”,固件可以檢測并避免發(fā)生上述故障。
新版本演示程序解決的另一問題是RTC時(shí)間偏移的修正。早期軟件中所包含的RTC程序集成了長期抖動(dòng)導(dǎo)致RTC偏差的修正,復(fù)位后進(jìn)行調(diào)整。
改進(jìn)程序的應(yīng)用示例
本應(yīng)用筆記介紹的程序支持所有版本的71M6521,包括71M6521BE、71M6521DE和71M6521FE。Maxim推薦在帶有備份電池的新設(shè)計(jì)中采用固件修正。
功率模式切換期間可能產(chǎn)生的失效
71M6521中的微調(diào)“保險(xiǎn)絲”由控制邏輯保證,重復(fù)上電或極端EMI可能影響微調(diào)“保險(xiǎn)絲”的數(shù)據(jù)讀取。失效原因包括:
電表頻繁斷電或出現(xiàn)極端EMI。
電表從工作狀態(tài)進(jìn)入關(guān)斷模式,新的鋰電池供電的情況下,錯(cuò)誤地讀取微調(diào)“保險(xiǎn)絲”的數(shù)據(jù)。電池電壓(典型值為3.6 VDC)與71M6521正常工作時(shí)的電壓(典型值為3.3 VDC)不同,導(dǎo)致失效。
配備電池的電表似乎更容易受到影響,因?yàn)椴粠щ姵氐碾姳碓谥麟娫磾嚯姴⒃俅紊想姾螅軌蚪?jīng)歷一次干凈的復(fù)位(POR)過程。
在供電模式轉(zhuǎn)換期間,可能引發(fā)上文提及的失效現(xiàn)象,但很難準(zhǔn)確定位具體故障,因?yàn)檫@取決于諸多因素:斷電或EMI、電表固件、電池選擇、電源設(shè)計(jì)等,這些都會(huì)影響到微調(diào)“保險(xiǎn)絲”的讀取錯(cuò)誤。大多數(shù)電表即使在極端測試條件下,也不會(huì)發(fā)生故障。
當(dāng)電表返回正常工作模式時(shí),電源能夠支持更大的工作電流,即可提供微調(diào)自校準(zhǔn)數(shù)據(jù)。但可能需要重新恢復(fù)電表的工作狀態(tài)。
RTC失效事件
RTC程序用于補(bǔ)償電表在低功耗模式下產(chǎn)生的時(shí)間偏差,但并非在啟動(dòng)時(shí)同步調(diào)整,而會(huì)累計(jì)抖動(dòng)產(chǎn)生的漂移。
4.8p演示程序
程序測試
實(shí)際測試時(shí)為演示板配備了新電池,配置顯示默認(rèn)值(顯示RTC的時(shí)鐘)。然后,在8周內(nèi)每隔10秒重復(fù)一次交流電的斷電/上電。簡單地把電源穩(wěn)定在標(biāo)稱交流電壓,然后開始測試。好的設(shè)計(jì)應(yīng)該能夠正確地恢復(fù)系統(tǒng)工作,合理顯示時(shí)間信息。程序經(jīng)過8周測試后沒有出現(xiàn)失效。
軟件的影響
4.8p演示程序能夠在運(yùn)行main()之前出發(fā)PLL_OK中斷,保證在固件初始化期間能夠檢測到掉電故障并進(jìn)行相應(yīng)的處理。必須謹(jǐn)慎管理其它中斷操作,以避免出現(xiàn)嚴(yán)重的故障現(xiàn)象。
任何情況下,4.8p演示軟件都可以在喚醒定時(shí)器中保持一個(gè)非零數(shù)值。正常工作時(shí),喚醒定時(shí)器不會(huì)計(jì)數(shù)或觸發(fā)喚醒過程,除非IC意外進(jìn)入休眠或僅顯示LCD模式。發(fā)生這種事件時(shí),將觸發(fā)喚醒定時(shí)器工作,喚醒電表并從故障狀態(tài)下恢復(fù)電表工作。
程序存儲(chǔ)位置
目標(biāo)代碼應(yīng)該把修正程序放置在閃存的前8KB。Keil? IDE中,可以在項(xiàng)目平臺更改目標(biāo)程序,選擇<點(diǎn)擊鼠標(biāo)右鍵>optionsBL_51 Locate TabCode Space。演示程序中,該指令置于存儲(chǔ)器盡可能低的位置:
?C_C51STARTUP,?PR?_?PLL_ISR?BATMODES_20,?PR?_?BATMODE_CHANGE?BATMODES_20,
?C_C51STARTUP包含演示程序的啟動(dòng)代碼。
?PR?_?PLL_ISR?BATMODES_20SAFE,?PR?_?BATMODE_CHANGE?BATMODES_20SAFE執(zhí)行PLL_OK中斷例程時(shí)需要。
PLL_OK中斷
以下程序應(yīng)該置于PLL_OK中斷例程,檢測到關(guān)斷模式時(shí)運(yùn)行。4.8p mainatmodes_20.c中給出了經(jīng)過測試的程序代碼。
?
extern void trim_test(void) small reentrant; EA = 0; CONFIG0 = 0; // Make sure we are running as fast as we can. IFLAGS = (~IE_PLLFALL_) & (~IE_PLLRISE_); // force an edge to occur WAKE = 0x81; // force a wake timer wake if sleep is forced trim_test(); // From start-up code.
?
評論