国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

你是否真的會在Flash上存數據?

硬件攻城獅 ? 來源:工程師的廢紙簍 ? 作者:工程師的廢紙簍 ? 2022-09-20 14:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在應用編程(IAP)應該是MCU使用過程中常見的一種功能,MCU廠商為了加速用戶的產品開發,都會在其SDK中添加相關示例,而且也有不少用戶只需要簡單的集成,就完成了該功能并實現產品的量產。但你是否真的會在Flash上存數據?

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

實際應該過程中,我們到底應該怎么選擇呢?需要存儲的數據量大小是首要問題,我們可以根據它來大致設定規則

7b84d120-38aa-11ed-ba43-dac502259ad0.png
  1. 當數據量大于128MB時,NAND FLASH或者SD(TF)卡是常見的選擇,但考慮到NAND FLASH會有壞塊的問題,編寫存儲軟件時需要考慮磨損均衡已經壞塊管理的問題,想要做的非??煽坎⒉蝗菀?。

  2. 當數據量小于128MB,大于2MB時,可以選擇NOR FLASH或EEPROM,EEPROM技術上的優勢是耐久性好,可以反復多次編程,最高可達100W次的擦寫循環,NOR FLASH相比EEPROM容量會更大,平均成本更好,但是壽命會少個0,最大只能到10W次的擦寫循環。

    EEPROM(AT24C02)

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

    FLASH(IS25WP032)

    7bf6657e-38aa-11ed-ba43-dac502259ad0.png
  3. 當數據量小于2MB時,就可以考慮將其放入MCU內部的FLASH中,一旦決定把數據放MCU內部FLASH時,就面臨兩個問題:

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

    NXP Kinetis系列MCU

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

    STM32 F103xx

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

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

    7c54676e-38aa-11ed-ba43-dac502259ad0.png
    //RAM中執行的編程函數
    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) 擦寫時間對系統的影響,之前講過擦寫過程是不能執行FLASH code的,所以勢必會讓系統pending住,而這個pending時間可以在Datasheet中尋找答案,一般擦除是按照sector/block大小來的,編程時按照word或者page大小來的,擦除時間一般更長,對系統影響更大。用戶需要考慮的是系統是否可以接受每個控制周期,等待1個擦除最小單位的編程時間,這是由于有可能需要編程的數據比較大,如果同一時間更新勢必會影響到控制周期,但如果把擦寫任務分配到每個控制周期,就可以將影響降低到最小,以NXPKinetis,擦除一個Sector典型值是14ms,每次寫入Longword(8字節)所需要的時間是65us,當需要升級的時候,在接收到升級命令的第一幀處理時,增加sector刪除命令,本次運算周期會增加14ms的pending時間,然后每周期編程8字節數據。如果系統需要將數據存在內部flash上,就必須接受某一個周期增加14ms的pending,隨著flash寫入次數的增多,14ms還會增大到114ms

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

在確定了上述問題之后就可以完成存儲設備的選型,但軟件處理還需要注意以下幾個要點,這些問題MCU廠家一般是不會提供解決方案的,需要用戶根據自己的需求來完成:

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

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

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

    7d10bdb0-38aa-11ed-ba43-dac502259ad0.png
  4. 二次編程:有些MCU內部的Flash是帶有校驗機制的,對于同一地址在擦除完成后,只能進行一次編程,如果進行二次編程寫入不同數值進去,可能會除非校驗失敗,導致該地址無法正常讀寫。

總結,這里列了一個表格,當需要IAP的時候,可以根據所選芯片的參數判斷是否滿足自身系統的需求(下表已經填入示例數據):

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    147

    文章

    18925

    瀏覽量

    398151
  • FlaSh
    +關注

    關注

    10

    文章

    1748

    瀏覽量

    155527
  • 數據
    +關注

    關注

    8

    文章

    7335

    瀏覽量

    94769

原文標題:你真的會在Flash上存數據么

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    變頻器是否真的省電?

    變頻器作為一種電力電子設備,在現代工業生產和民用領域中廣泛應用,其核心功能是通過調節電機工作頻率來實現轉速控制。關于“變頻器是否真的省電”這一問題,需要從技術原理、應用場景以及實際效果三個維度綜合分析,才能得出客觀結論。
    的頭像 發表于 02-27 17:00 ?290次閱讀

    ADAS 數據安全 晶存儲筑牢防線

    256GB eMMC以工業級可靠性與高耐用性,為ADAS系統提供大容量數據存儲解決方案,保障行車數據完整與系統穩定運行,滿足智能駕駛嚴苛需求。
    的頭像 發表于 02-25 09:55 ?1450次閱讀
    ADAS <b class='flag-5'>數據</b>安全 晶<b class='flag-5'>存</b>存儲筑牢防線

    LAT1216 Blue NRG-1/2 系列芯片 Flash 操作與 BLE 事件的互斥處理

    在許多基于 BlueNRG-1/2 系列芯片的低功耗藍牙的設計項目時,客戶通常會在 Flash的特定區域存儲定制的數據。然而需要特別注意的是,在 BlueNRG-1/2 方案中,用戶對Flas
    發表于 01-09 10:54 ?0次下載

    針對CW32芯片內部flash用戶數據嗎?

    針對CW32芯片,內部flash用戶數據嗎?就是如果不想加外部的flash,內部多余的flash能給外部使用嗎?有相關的示例么?寫入也需
    發表于 12-09 08:13

    的企業網絡,是否真的“跟得上”數字化轉型的腳步?

    前言在數字化轉型的浪潮中,您的企業是否也面臨這樣的網絡困境:分公司訪問云端系統頻繁卡頓,視頻會議屢屢中斷成為溝通的常態;跨地域數據傳輸緩慢,嚴重影響項目交付進度;盡管已投入大量成本部署多條專線,網絡
    的頭像 發表于 11-26 10:02 ?1311次閱讀
    <b class='flag-5'>你</b>的企業網絡,<b class='flag-5'>是否</b><b class='flag-5'>真的</b>“跟得上”數字化轉型的腳步?

    使用J-Flash來編程CW32 MCU

    (可選): 編程完成后,J-Flash提供了驗證選項,用于檢查閃存內容是否與原始固件文件一致。 執行驗證步驟以確保編程成功且沒有數據損壞。 9.斷開連接: 編程和驗證完成后,可以斷開
    發表于 11-25 07:00

    請問flashdb的flash操作接口是否可以異步?

    flash實際操作任務 這個任務設置優先級最低 這樣是否會造成flashdb內核的數據不一致情況產生導致崩潰呢?
    發表于 09-19 08:21

    NAND Flash的基本原理和結構

    NAND Flash是什么?NAND Flash(閃存)是一種非易失性存儲器技術,主要用于數據存儲。與傳統的DRAM或SRAM不同,NAND Flash在斷電后仍能保存
    的頭像 發表于 09-08 09:51 ?7034次閱讀
    NAND <b class='flag-5'>Flash</b>的基本原理和結構

    TLE9893是否支持在FLASH1運行代碼來擦除和編程FLASH1?

    芯片TLE9893是否支持在FLASH1運行代碼來擦除和編程FLASH1。在NVM-PROG_UCODE中,代碼在FLASH1
    發表于 08-13 08:14

    干擾可以提高測量精度,是真的嗎?

    一、前言 水可以引燃蠟燭,是真的嗎?是真的! 蛇怕雄黃,是真的嗎?是假的! 上述兩個現象,已經由央視 財經頻道《是真的嗎?》揭秘。 今天要探討的是: 干擾可以提高測量精度,是
    的頭像 發表于 08-04 09:28 ?702次閱讀
    干擾可以提高測量精度,是<b class='flag-5'>真的</b>嗎?

    請問flashdb的flash操作接口是否可以異步?

    實現 feed_dog(); } } HAL_FLASH_Lock(); on_ic_write_cnt++; return size; } 這個函數內將數據使用消息隊列的形式拋給flash實際操作任務 這個任務設置優先
    發表于 06-11 07:13

    MCU片Flash

    ? ? MCU片Flash是微控制器內部集成的非易失性存儲器,主要用于存儲程序代碼、常量數據及系統配置信息。其核心特性與功能如下: 一、定義與類型? 片
    的頭像 發表于 05-06 14:26 ?1261次閱讀

    STM32L476 Flash擦除失敗的原因?

    開發板MCU型號:STM32L476RG 同樣的固件在開發板中flash讀寫擦除操作都沒問題,但在產品中擦除函數返回成功,但flash中的數據其實并沒有擦除。 這兩款MCU在Flash
    發表于 04-23 08:26

    S32K311如何在Flash測試ECC?

    我有一些與目標 S32K311 Flash ECC 相關的問題 - ERM 是否負責 Code Flash 和 Data Flash
    發表于 04-14 08:47

    GD3162 INTB引腳是否會在啟動后變為低電平?

    嗨、NXP、這是關于柵極驅動器的 INTB 引腳的。如果柵極驅動器在初始電后出現故障,那么 INTB 引腳是否會在啟動后變為低電平?在這種情況下、INTB 引腳的轉換不會發生、并且不會調用 ISR
    發表于 04-10 07:35