0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你是否真的會(huì)在Flash上存數(shù)據(jù)?

硬件攻城獅 ? 來(lái)源:工程師的廢紙簍 ? 作者:工程師的廢紙簍 ? 2022-09-20 14:17 ? 次閱讀

在應(yīng)用編程(IAP)應(yīng)該是MCU使用過(guò)程中常見(jiàn)的一種功能,MCU廠商為了加速用戶的產(chǎn)品開(kāi)發(fā),都會(huì)在其SDK中添加相關(guān)示例,而且也有不少用戶只需要簡(jiǎn)單的集成,就完成了該功能并實(shí)現(xiàn)產(chǎn)品的量產(chǎn)。但你是否真的會(huì)在Flash上存數(shù)據(jù)?

首先我們需要從片內(nèi)和片外存儲(chǔ)談起,MCU內(nèi)部的非易失性存儲(chǔ)器絕大多數(shù)都是基于FLASH的(也有少部分是EEPROM的,比如NXP LPC80x系列),MCU外部的非易失性存儲(chǔ)器可以有FLASH,EEPROM,其中EEPROM比較常見(jiàn)的是I2C接口,F(xiàn)LASH有NAND, NOR, SPI NOR等等。

實(shí)際應(yīng)該過(guò)程中,我們到底應(yīng)該怎么選擇呢?需要存儲(chǔ)的數(shù)據(jù)量大小是首要問(wèn)題,我們可以根據(jù)它來(lái)大致設(shè)定規(guī)則

7b84d120-38aa-11ed-ba43-dac502259ad0.png
  1. 當(dāng)數(shù)據(jù)量大于128MB時(shí),NAND FLASH或者SD(TF)卡是常見(jiàn)的選擇,但考慮到NAND FLASH會(huì)有壞塊的問(wèn)題,編寫(xiě)存儲(chǔ)軟件時(shí)需要考慮磨損均衡已經(jīng)壞塊管理的問(wèn)題,想要做的非??煽坎⒉蝗菀?。

  2. 當(dāng)數(shù)據(jù)量小于128MB,大于2MB時(shí),可以選擇NOR FLASH或EEPROM,EEPROM技術(shù)上的優(yōu)勢(shì)是耐久性好,可以反復(fù)多次編程,最高可達(dá)100W次的擦寫(xiě)循環(huán),NOR FLASH相比EEPROM容量會(huì)更大,平均成本更好,但是壽命會(huì)少個(gè)0,最大只能到10W次的擦寫(xiě)循環(huán)。

    EEPROM(AT24C02)

    7bb1fba0-38aa-11ed-ba43-dac502259ad0.png

    FLASH(IS25WP032)

    7bf6657e-38aa-11ed-ba43-dac502259ad0.png
  3. 當(dāng)數(shù)據(jù)量小于2MB時(shí),就可以考慮將其放入MCU內(nèi)部的FLASH中,一旦決定把數(shù)據(jù)放MCU內(nèi)部FLASH時(shí),就面臨兩個(gè)問(wèn)題:

    (1)MCU片內(nèi)FLASH承諾的壽命更短,一般可能是1~5W次,好像也有幾百次的,鑒于大佬已經(jīng)停線,這里就不點(diǎn)名了。關(guān)于這個(gè)參數(shù)切記要參考手冊(cè),不同廠家的參數(shù)不一樣,同一廠家的不同系列也可能有差異

    NXP Kinetis系列MCU

    7c1b6d9c-38aa-11ed-ba43-dac502259ad0.png

    STM32 F103xx

    7c36996e-38aa-11ed-ba43-dac502259ad0.png

    (2) 擦寫(xiě)過(guò)程可能需要關(guān)閉中斷,雖然這個(gè)不是必須的,但除非MCU的Datasheet明確有寫(xiě)支持,絕大多數(shù)MCU都是有這方面的要求,并且IAP編程的函數(shù)需要運(yùn)行于RAM或ROM中,因?yàn)椴翆?xiě)過(guò)程中,如果MCU沒(méi)有特殊的設(shè)計(jì)(比如下圖NXP KinetisK64系列帶有雙Block flash是可以支持WWR),該過(guò)程是無(wú)法進(jìn)行取指的,關(guān)中斷的目的是防止外部中斷觸發(fā)運(yùn)行于FLASH上的ISR,如果用戶不希望關(guān)中斷,則必須要將可能發(fā)生中斷的函數(shù)Relocate到RAM中

    7c54676e-38aa-11ed-ba43-dac502259ad0.png
    //RAM中執(zhí)行的編程函數(shù)
    static status_t flash_command_sequence(flash_config_t *config)
    {
        uint8_t registerValue;
    
    __set_PRIMASK(1);
    
    #if FLASH_DRIVER_IS_FLASH_RESIDENT
        /* clear RDCOLERR & ACCERR & FPVIOL flag in flash status register */
        FTFx->FSTAT = FTFx_FSTAT_RDCOLERR_MASK | FTFx_FSTAT_ACCERR_MASK | FTFx_FSTAT_FPVIOL_MASK;
    
        status_t returnCode = flash_check_execute_in_ram_function_info(config);
        if (kStatus_FLASH_Success != returnCode)
        {
        __set_PRIMASK(0);
            return returnCode;
        }
    
        /* We pass the ftfx_fstat address as a parameter to flash_run_comamnd() instead of using
         * pre-processed MICRO sentences or operating global variable in flash_run_comamnd()
         * to make sure that flash_run_command() will be compiled into position-independent code (PIC). */
        callFlashRunCommand((FTFx_REG8_ACCESS_TYPE)(&FTFx->FSTAT));
    __set_PRIMASK(0);
    #else
        /* clear RDCOLERR & ACCERR & FPVIOL flag in flash status register */
        FTFx->FSTAT = FTFx_FSTAT_RDCOLERR_MASK | FTFx_FSTAT_ACCERR_MASK | FTFx_FSTAT_FPVIOL_MASK;
    
        /* clear CCIF bit */
        FTFx->FSTAT = FTFx_FSTAT_CCIF_MASK;
    
        /* Check CCIF bit of the flash status register, wait till it is set.
         * IP team indicates that this loop will always complete. */
        while (!(FTFx->FSTAT & FTFx_FSTAT_CCIF_MASK))
        {
        }
    #endif /* FLASH_DRIVER_IS_FLASH_RESIDENT */
    
        /* Check error bits */
        /* Get flash status register value */
        registerValue = FTFx->FSTAT;
    
        /* checking access error */
        if (registerValue & FTFx_FSTAT_ACCERR_MASK)
        {
        __set_PRIMASK(0);
            return kStatus_FLASH_AccessError;
        }
        /* checking protection error */
        else if (registerValue & FTFx_FSTAT_FPVIOL_MASK)
        {
        __set_PRIMASK(0);
            return kStatus_FLASH_ProtectionViolation;
        }
        /* checking MGSTAT0 non-correctable error */
        else if (registerValue & FTFx_FSTAT_MGSTAT0_MASK)
        {
        __set_PRIMASK(0);
            return kStatus_FLASH_CommandFailure;
        }
        else
        {
        __set_PRIMASK(0);
            return kStatus_FLASH_Success;
        }
    }
    

    (3) 擦寫(xiě)時(shí)間對(duì)系統(tǒng)的影響,之前講過(guò)擦寫(xiě)過(guò)程是不能執(zhí)行FLASH code的,所以勢(shì)必會(huì)讓系統(tǒng)pending住,而這個(gè)pending時(shí)間可以在Datasheet中尋找答案,一般擦除是按照sector/block大小來(lái)的,編程時(shí)按照word或者page大小來(lái)的,擦除時(shí)間一般更長(zhǎng),對(duì)系統(tǒng)影響更大。用戶需要考慮的是系統(tǒng)是否可以接受每個(gè)控制周期,等待1個(gè)擦除最小單位的編程時(shí)間,這是由于有可能需要編程的數(shù)據(jù)比較大,如果同一時(shí)間更新勢(shì)必會(huì)影響到控制周期,但如果把擦寫(xiě)任務(wù)分配到每個(gè)控制周期,就可以將影響降低到最小,以NXPKinetis,擦除一個(gè)Sector典型值是14ms,每次寫(xiě)入Longword(8字節(jié))所需要的時(shí)間是65us,當(dāng)需要升級(jí)的時(shí)候,在接收到升級(jí)命令的第一幀處理時(shí),增加sector刪除命令,本次運(yùn)算周期會(huì)增加14ms的pending時(shí)間,然后每周期編程8字節(jié)數(shù)據(jù)。如果系統(tǒng)需要將數(shù)據(jù)存在內(nèi)部flash上,就必須接受某一個(gè)周期增加14ms的pending,隨著flash寫(xiě)入次數(shù)的增多,14ms還會(huì)增大到114ms

    7c7f3b88-38aa-11ed-ba43-dac502259ad0.png

在確定了上述問(wèn)題之后就可以完成存儲(chǔ)設(shè)備的選型,但軟件處理還需要注意以下幾個(gè)要點(diǎn),這些問(wèn)題MCU廠家一般是不會(huì)提供解決方案的,需要用戶根據(jù)自己的需求來(lái)完成:

  1. 冗余備份:有些時(shí)候用戶需要更新正在使用的參數(shù)/固件,考慮到更新失敗的情況下,需要支持參數(shù)/固件版本回退,所以需要兩片備份區(qū)進(jìn)行冗余備份。

    7c982d14-38aa-11ed-ba43-dac502259ad0.png
  2. Magic number or 校驗(yàn)碼:Magic number一般就是在FLASH編程結(jié)束時(shí)候,寫(xiě)一個(gè)位數(shù)較高的(64bit)值到固定地址,使用加載數(shù)據(jù)時(shí),先判斷Magic number是否正確,以此判斷編程過(guò)程是否完整,切記Magic number要在編程時(shí)先擦后寫(xiě)(第一個(gè)擦,最后一個(gè)寫(xiě)),否則無(wú)法起到驗(yàn)證效果。這種驗(yàn)證方式比較初級(jí),對(duì)于可靠性要求更高的場(chǎng)合,一般會(huì)使用校驗(yàn)碼的方式(CRC或者M(jìn)D5),特別是參數(shù)文件通過(guò)通信的方式傳輸?shù)組CU中,雖然通信過(guò)程可能也有校驗(yàn)(比如Modbus RTU的CRC),但是無(wú)法保證數(shù)據(jù)在RAM緩沖區(qū)不發(fā)生位翻轉(zhuǎn)的情況,大多數(shù)MCU都不支持ECC功能,在這種情況下是無(wú)法糾錯(cuò)的,如果對(duì)端設(shè)備會(huì)將文件的校驗(yàn)碼發(fā)過(guò)來(lái)進(jìn)行校驗(yàn),就可以避免該問(wèn)題的發(fā)生,雖然RAM出現(xiàn)位翻轉(zhuǎn)的概率非常低,但是如果發(fā)生位翻轉(zhuǎn)的參數(shù)是設(shè)備的保護(hù)點(diǎn)或者PWM死區(qū)值,一旦出現(xiàn)錯(cuò)誤,就可能會(huì)發(fā)生設(shè)備故障或損毀,甚至出現(xiàn)安全事故。

    7cd61ad4-38aa-11ed-ba43-dac502259ad0.png
  3. 編程過(guò)程掉電或復(fù)位:在編程的過(guò)程中出現(xiàn)掉電或者復(fù)位是經(jīng)常出現(xiàn)的一種異常情況。比如震動(dòng)導(dǎo)致電源接觸不良,或者系統(tǒng)異常導(dǎo)致看門(mén)狗無(wú)法喂狗都有可能出現(xiàn),還有使用POE電源對(duì)端設(shè)備直接斷電都有可能造成這種異常。所有一定要考慮在這種情況下的異常處理,比如上電加載數(shù)據(jù)的時(shí)候,如果校驗(yàn)失敗,可以使用一組安全數(shù)據(jù)或者更新前的數(shù)據(jù)。對(duì)于帶操作系統(tǒng)的應(yīng)用,建議硬件添加系統(tǒng)掉電檢測(cè)電路,在檢測(cè)到掉電事件(如24V掉電)發(fā)生時(shí),如果當(dāng)前沒(méi)有寫(xiě)入Flash,則lock住寫(xiě)入進(jìn)程,如果當(dāng)前正在寫(xiě)入Flash,則立即調(diào)用sync函數(shù),盡快將數(shù)據(jù)從緩存寫(xiě)入Flash(硬件上MCU VDD加個(gè)稍微大點(diǎn)的電容,多扛一段時(shí)間),不要等待系統(tǒng)后臺(tái)寫(xiě)入。

    7d10bdb0-38aa-11ed-ba43-dac502259ad0.png
  4. 二次編程:有些MCU內(nèi)部的Flash是帶有校驗(yàn)機(jī)制的,對(duì)于同一地址在擦除完成后,只能進(jìn)行一次編程,如果進(jìn)行二次編程寫(xiě)入不同數(shù)值進(jìn)去,可能會(huì)除非校驗(yàn)失敗,導(dǎo)致該地址無(wú)法正常讀寫(xiě)。

總結(jié),這里列了一個(gè)表格,當(dāng)需要IAP的時(shí)候,可以根據(jù)所選芯片的參數(shù)判斷是否滿足自身系統(tǒng)的需求(下表已經(jīng)填入示例數(shù)據(jù)):

NVM 擦除編程最小單元 擦除編程所用時(shí)間 擦除編程壽命 編程過(guò)程是否需要關(guān)中斷 編程數(shù)據(jù)的校驗(yàn) 編程過(guò)程中掉電/復(fù)位
EEPROM 不需要擦,可以按字節(jié)或者Page寫(xiě)入 寫(xiě)周期5ms 1000000 不需要 軟件添加 軟件添加
NOR FLASH Sector = 4K, 最小寫(xiě)入Page = 256B Sector擦70ms,Page寫(xiě)0.2ms 100000 不需要 軟件添加 軟件添加
MCU FLASH Sector = 2KB, 最小寫(xiě)入8Byte Sector擦14ms,寫(xiě)65us 50000 需要 軟件添加 軟件添加
審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16922

    瀏覽量

    349995
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1614

    瀏覽量

    147667
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6837

    瀏覽量

    88754

原文標(biāo)題:你真的會(huì)在Flash上存數(shù)據(jù)么

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    有單通道數(shù)據(jù)模塊嗎?

    請(qǐng)問(wèn),有單通道數(shù)據(jù)模塊嗎?應(yīng)用是系統(tǒng)網(wǎng)電斷電后,任然可以鎖數(shù)據(jù)狀態(tài)。要求鎖模塊能長(zhǎng)期單獨(dú)長(zhǎng)期供電。
    發(fā)表于 11-13 07:42

    DVEVM的Compact Flash(CF)支持

    電子發(fā)燒友網(wǎng)站提供《DVEVM的Compact Flash(CF)支持.pdf》資料免費(fèi)下載
    發(fā)表于 10-15 10:07 ?0次下載
    DVEVM<b class='flag-5'>上</b>的Compact <b class='flag-5'>Flash</b>(CF)支持

    求助,如何清除provisioning的數(shù)據(jù)

    esp-idf examplesprovisioningwifi_prov_mgr 第一次運(yùn)行后保存了一些數(shù)據(jù), 它不會(huì)在以后的電復(fù)位時(shí)運(yùn)行到配置代碼. 如何清除provisioning的數(shù)
    發(fā)表于 06-20 06:24

    NAND Flash的Vpp是什么?有何功能?

    NAND Flash的,指的是用于向閃存單元寫(xiě)入數(shù)據(jù)時(shí)使用的較高編程電壓。通常高于用于其他操作如讀取或擦除的正常工作電壓。
    的頭像 發(fā)表于 05-30 09:07 ?1716次閱讀

    STM32C8T6的GPIO口和電源引腳短路是否能讀取FLASH數(shù)據(jù)?

    使用STM32C8T6芯片讀取FLASH數(shù)據(jù)時(shí)發(fā)現(xiàn)其中一個(gè)GPIO口和電源引腳短路,用SWD接口連接電腦后顯示無(wú)法連接,數(shù)據(jù)比較重要,請(qǐng)問(wèn)這種情況下是否有辦法維修或者讀取
    發(fā)表于 05-21 06:08

    Ti60F100 內(nèi)外flash操作方案

    flash.程序先經(jīng)過(guò)外部flash的擦除,寫(xiě)入和讀出操作,再經(jīng)過(guò)外部flash的擦除,寫(xiě)入和讀出操作,每次讀出后會(huì)進(jìn)行數(shù)據(jù)的比較以判斷寫(xiě)入和讀出的
    的頭像 發(fā)表于 05-20 16:42 ?1373次閱讀
    Ti60F100 內(nèi)外<b class='flag-5'>flash</b>操作方案

    科技助力AI應(yīng)用落地:WTMDK2101-ZT1評(píng)估板實(shí)地評(píng)測(cè)與性能揭秘

    是知科技的 WTMDK2101的強(qiáng)大之處是精準(zhǔn)識(shí)別出嘯叫,并且能夠無(wú)聲處理,精準(zhǔn)度非常高且速度快。 4.5 嘯叫音抑制測(cè)試 接下來(lái)我們驗(yàn)證嘯音抑制功能,不知道是否有在 KTV 唱歌或者參加會(huì)議拿著
    發(fā)表于 05-16 16:38

    內(nèi)計(jì)算芯片研究進(jìn)展及應(yīng)用

    運(yùn)算。同時(shí),在核心電路的基礎(chǔ),根據(jù)算法特征設(shè)計(jì)芯片架構(gòu),以充分利用神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)流式的特點(diǎn)來(lái)實(shí)現(xiàn)芯片的并行化與流水線。在傳統(tǒng)NOR Flash陣列中,對(duì)某一個(gè)特定器件編程會(huì)不可避免地改變同一行
    的頭像 發(fā)表于 05-16 15:30 ?1171次閱讀
    <b class='flag-5'>存</b>內(nèi)計(jì)算芯片研究進(jìn)展及應(yīng)用

    J-FLASH在燒寫(xiě)時(shí)會(huì)將沒(méi)有數(shù)據(jù)的空白地址段寫(xiě)成0x00,是否可以修改J-FLASH配置文件將數(shù)據(jù)寫(xiě)成0xFF?

    J-FLASH在燒寫(xiě)時(shí),會(huì)將沒(méi)有數(shù)據(jù)的空白地址段寫(xiě)成0x00,是否可以修改J-FLASH配置文件將數(shù)據(jù)寫(xiě)成0xFF?
    發(fā)表于 04-19 08:12

    stm32 flash寫(xiě)數(shù)據(jù)怎么存儲(chǔ)的

    stm32 flash寫(xiě)數(shù)據(jù)怎么存儲(chǔ)的? STM32是一款廣泛應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā)的微控制器,它的Flash存儲(chǔ)器是其中一個(gè)重要的組成部分。在本文中,我將詳細(xì)介紹STM32 Flash
    的頭像 發(fā)表于 01-31 15:46 ?2213次閱讀

    data flash了兩個(gè)標(biāo)定參數(shù)后,不能正確讀寫(xiě)了是什么情況?

    data flash了兩個(gè)標(biāo)定參數(shù),運(yùn)行一直沒(méi)有問(wèn)題, 今天突然就不能正確讀寫(xiě)data flash,程序運(yùn)行是正常的,這是什么情況
    發(fā)表于 01-15 06:05

    ADuCM320 flash數(shù)據(jù)區(qū)擦/寫(xiě)操作時(shí),無(wú)法從這塊flash執(zhí)行程序怎么解決?

    我在UG看到說(shuō)在一塊128K flash擦除或?qū)懖僮鲿r(shí),就無(wú)法從這塊flash執(zhí)行程序,截圖如下。那么問(wèn)題來(lái)了,按照ADI的做法,0-
    發(fā)表于 01-11 06:34

    RFID和NFC之間的那些事兒,真的了解嗎?

    RFID和NFC之間的那些事兒,真的了解嗎?
    的頭像 發(fā)表于 12-15 09:38 ?1218次閱讀
    RFID和NFC之間的那些事兒,<b class='flag-5'>你</b><b class='flag-5'>真的</b>了解嗎?

    作為射頻工程師,真的會(huì)用“dB”?

    作為射頻工程師,真的會(huì)用“dB”?
    的頭像 發(fā)表于 12-06 14:51 ?529次閱讀
    作為射頻工程師,<b class='flag-5'>你</b><b class='flag-5'>真的</b>會(huì)用“dB”?

    Xilinx FPGA從spi flash啟動(dòng)配置數(shù)據(jù)時(shí)的地址問(wèn)題

    fpga 電時(shí),默認(rèn)是從 flash 的 0x00 地址開(kāi)始讀數(shù)據(jù)。如 UG470 文檔 page144 描述
    的頭像 發(fā)表于 11-29 09:20 ?839次閱讀
    Xilinx FPGA從spi <b class='flag-5'>flash</b>啟動(dòng)配置<b class='flag-5'>數(shù)據(jù)</b>時(shí)的地址問(wèn)題