針對題主的問題,我想應該從以下幾個方面入手:
如果用外接的flash或者是eeprom進行儲存,flash一般是spi介面,考慮到電磁干擾,MCU的響應速度等問題,即使是採用MCU的硬體SPI模組進行通訊,SPI的clock時鐘最高也就1MHz左右,傳送1個位元組的資料大概需要10us,不考慮擦除flash的時間,儲存100個位元組的資料,如果考慮可靠性,需要讀取驗證,大概需要5ms左右的時間。
而eeprom一般採用IIC介面,與SPI介面類似,以高速IIC進行通訊,儲存100個位元組的資料至少需要5ms左右的時候。
以STM32F051為例,一個page為1kByte,一個block為64kByte,擦除一個page大概耗時約20ms,在整個擦除過程中,整個MCU是掛機的,也就是不執行任何操作。而FLASH的寫操作比較快,大概1個Byte耗時1us。
比如MCU透過12V-3.3V的LDO供電,則需要透過檢測12V的電壓來判斷是否斷電。
將12V透過電阻分壓之後,接入MCU的A/D檢測口來判斷是否掉電。
可以透過以下的步驟確認電容的大小:
檢測到掉電之後,可以不需要擦除FLASH內容,可以直接寫入資料,可以節省大量的時間。
針對題主的問題,我想應該從以下幾個方面入手:
儘量選用內部的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內容,可以直接寫入資料,可以節省大量的時間。