51單片機(jī)如何存儲采集的數(shù)據(jù)?51單片機(jī)的程序存儲器有片內(nèi)和片外兩部分。
而且無論片內(nèi)程序存儲器還是片外程序存儲器,它們的地址都是共享的。如果片內(nèi)為4kROM,則地址為0x0000-0x0FFF,0x1000-0xFFFF的地址空間為外部ROM。外部ROM的0x0000-0x0FFF這部分可以用嗎?這個(gè)取決于單片機(jī)EA引腳的電平值。當(dāng)EA=1時(shí),這部分內(nèi)部ROM被使用,這部分外部ROM被浪費(fèi)。當(dāng)EA=0時(shí),使用外部ROM,內(nèi)部ROM被浪費(fèi)。用匯編的MOVC指令從代碼段中讀取數(shù)據(jù),單片機(jī)會根據(jù)MOVC指令、
51單片機(jī)如何存儲數(shù)據(jù)?
沒有不知道要保存哪種數(shù)據(jù),斷電保護(hù)還是緩存?如果是為了保存不受掉電保護(hù)的緩存數(shù)據(jù),可以使用單片機(jī)內(nèi)部的RAM空間,包括20H~7FH的直接尋址區(qū),不被SFR占用的80H~FFH的間接尋址區(qū),也可以使用STC單片機(jī)內(nèi)部的擴(kuò)展RAM。
如果是保存掉電保護(hù)的數(shù)據(jù),可以在單片機(jī)外面掛上flash或者
請教單片機(jī)掉電后,如何快速的保存數(shù)據(jù)問題?
;關(guān)于這個(gè)問題,我認(rèn)為我們應(yīng)該從以下幾個(gè)方面著手:盡量使用內(nèi)部閃存存儲數(shù)據(jù)。內(nèi)部flash讀寫速度快,可靠性高。
如果使用外部flash或eeprom進(jìn)行存儲,flash通常是一個(gè)spi接口。考慮到電磁干擾和MCU的響應(yīng)速度,即使使用MCU的硬件SPI模塊進(jìn)行通信,SPI的最大時(shí)鐘也在1MHz左右,發(fā)送一個(gè)字節(jié)的數(shù)據(jù)大約需要10us。不考慮擦除閃存的時(shí)間,存儲100字節(jié)的數(shù)據(jù)大約需要5ms。如果考慮可靠性,需要閱讀和驗(yàn)證。
Eeprom一般采用IIC接口,類似SPI接口,高速IIC存儲100字節(jié)數(shù)據(jù)至少需要5ms。
FLASH的特點(diǎn)是寫數(shù)據(jù)只能從1重寫到0,從0重寫到1需要擦除整個(gè)頁面,或者整個(gè)扇區(qū),或者整個(gè)塊。
以STM32F051為例。一個(gè)頁面是1kb,一個(gè)塊是64kByte。擦除一頁大約需要20毫秒。在整個(gè)擦除過程中,整個(gè)MCU被掛起,即不執(zhí)行任何操作。和FLASH的寫操作比較快,大約1字節(jié)需要1us。
需要掉電檢測電路,掉電檢測需要檢測給MCU供電的LDO或DC-DC的前級電壓。
比如MCU采用12V-3.3VLDO供電,需要檢測12V的電壓來決定是否斷電。
通過電阻分壓12V的電壓,然后連接到MCU的A/D檢測口,判斷是否斷電。
MCU供電的LDO或DC-DC的前級并聯(lián)足夠的電容,保證電容的供電能保證MCU能寫數(shù)據(jù)。
電容器的尺寸可通過以下步驟確定:
評估斷電時(shí)前一電壓提供的工作電流。一旦單片機(jī)檢測到掉電,就需要切斷耗電輸出,比如控制繼電器輸出的I/O口。比如20mA。
確認(rèn)LDO的最低輸入電壓,如5.3。
確認(rèn)判斷斷電的電壓,如10V,確認(rèn)斷電開始與LDO最低輸入電壓的電壓差,如4.7V
確認(rèn)寫入所有數(shù)據(jù)所需的時(shí)間,例如20ms。
根據(jù)公式計(jì)算所需電容,C=I*T/U=20mA*20mS/4.7V=85uF。可以選擇100uF的電容。
一旦MCU檢測到掉電,需要切斷耗電輸出,比如控制繼電器輸出的I/O口需要立即斷開。
在正常操作中,預(yù)先準(zhǔn)備一個(gè)存儲空間并將其擦除到0xFF中。
檢測到掉電后,可以直接寫入數(shù)據(jù),無需擦除FLASH內(nèi)容,可以節(jié)省大量時(shí)間。