03.07 請教單片機掉電後,如何快速的保存數據問題?

達達兔DADAtoo


針對題主的問題,我想應該從以下幾個方面入手:

儘量選用內部的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內容,可以直接寫入數據,可以節省大量的時間。


分享到:


相關文章: