盡量選用內部的flash來存儲數據,內部flash的讀寫速度快,可靠性高。

  如果用外置的flash或者是eeprom進行存儲,flash一般是spi接口,考慮到電磁干擾,MCU的響應速度等問題,即使是采用MCU的硬件SPI模塊進行通信,SPI的clock時鐘最高也就1MHz左右,發送1個字節的數據大概需要10us,不考慮擦除flash的時間,存儲100個字節的數據,如果考慮可靠性,需要讀取驗證,大概需要5ms左右的時間。

 而eeprom一般采用IIC接口,與SPI接口類似,以高速IIC進行通信,存儲100個字節的數據至少需要5ms左右的時候。

FLASH的特點是寫數據只能由1改寫為0,由0改寫為1需要整個page,或者整個sector,或者整個block進行擦除。

以STM32F051為例,一個page為1kByte,一個block為64kByte,擦除一個page大概耗時約20ms,在整個擦除過程中,整個MCU是掛機的,也就是不執行任何操作。而FLASH的寫操作比較快,大概1個Byte耗時1us。

需要有掉電檢測電路,掉電檢測需要通過檢測給MCU供電的LDO或者DC-DC的前級電壓。

比如MCU通過12V-3.3V的LDO供電,則需要通過檢測12V的電壓來判斷是否斷電。

將12V通過電阻分壓之后,接入MCU的A/D檢測口來判斷是否掉電。

MCU供電的LDO或者DC-DC的前級并聯足夠的電容,以確保電容的供電能保證MCU將數據寫入。

 可以通過以下的步驟確認電容的大小:

評估由掉電時前級電壓供電的工作電流大小,MCU一旦檢測到掉電,需要切掉耗電大的輸出,比如控制繼電器輸出的I/O口需要立即斷開。比如20mA。

確認LDO的最低輸入電壓,比如5.3

確認判斷掉電的電壓,比如10V,確認掉電開始到LDO最低輸入電壓之間的壓差,比如4.7V

確認寫入所有數據所需要的時間,比如20ms。

根據公式計算所需電容的容量,C=I*T/U=20mA*20mS/4.7V=85uF。可選擇100uF的電容。

MCU一旦檢測到掉電,需要切掉耗電大的輸出,比如控制繼電器輸出的I/O口需要立即斷開。

在正常工作時,事先準備一塊存儲空間,將其擦除成為0xFF。

檢測到掉電之后,可以不需要擦除FLASH內容,可以直接寫入數據,可以節省大量的時間。

單片機掉電怎么快速保存數據

紐扣電池的方式是不丟失數據,不需要保存到EEPROM。法拉電容可以用來不丟失數據(一般可以保存一個月),當然也可以用來存儲的EEPROM, 注意不要美每時每刻都保存的EEPROM,這樣錯率,壽命都會降低。