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

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

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

MAXQ7665扇區(qū)可擦除程序和數(shù)據(jù)閃存的應(yīng)用內(nèi)編程

星星科技指導(dǎo)員 ? 來源:ADI ? 作者:ADI ? 2023-02-20 11:05 ? 次閱讀

本應(yīng)用筆記介紹如何使用內(nèi)置實用程序ROM擦除/寫入MAXQ7665微控制器(μC)中的程序和數(shù)據(jù)閃存。此信息僅適用于帶扇形可擦除(SE)閃存的基于MAXQ7665閃存的微控制器(μC)。

介紹

本應(yīng)用筆記介紹如何管理帶有扇形可擦除(SE)閃存的MAXQ7665閃存微控制器(μC)中的內(nèi)部數(shù)據(jù)和程序閃存。此討論包括有關(guān)執(zhí)行程序閃存的應(yīng)用程序內(nèi)編程 (IAP) 的一般信息。

內(nèi)存映射

本節(jié)詳細介紹MAXQ7665器件各種存儲器大小的一般閃存信息和存儲器組織。MAX7665器件提供兩種類型的閃存。本文檔僅介紹帶SE閃存的MAXQ7665器件,不適用于尋頁(PE)器件。有關(guān)MAXQ7665 PE器件的信息,請參考應(yīng)用筆記“MAXQ7665頁面可擦除(PE)程序和數(shù)據(jù)閃存的應(yīng)用內(nèi)編程(IAP)”。

表 1 顯示了 128KB、64KB、48KB 和 32KB 設(shè)備的閃存映射。可能存在其它閃存選項,因此請參考MAXQ7665數(shù)據(jù)資料以獲取完整列表。

表 1.閃存映射

poYBAGPy44GAI_GWAACqrYHPCxE343.gif?imgver=1

使用閃存存儲數(shù)據(jù)

閃存可用于可靠地存儲系統(tǒng)數(shù)據(jù),這些數(shù)據(jù)需要在系統(tǒng)運行期間進行一次或定期編程。雖然閃存的任何扇區(qū)都可用于存儲數(shù)據(jù),但兩個4K x 16扇區(qū)通常提供最佳選擇。與EEPROM不同,MAXQ7665上的閃存不能被文字擦除。必須一次擦除完整的扇區(qū)。擦除扇區(qū)通常需要 0.7 秒,但在最壞的情況下可能需要長達 15 秒的時間。在此期間,用戶代碼將停止,因此不會發(fā)生其他處理。在選擇適合系統(tǒng)要求的軟件技術(shù)時,必須仔細考慮這些限制。對于大多數(shù)周期性數(shù)據(jù)存儲需求,有界隊列和/或銀行交換技術(shù)將滿足系統(tǒng)的可靠性要求和需求。下面是這兩種技術(shù)的簡單示例。

有界隊列

有界隊列是受固定數(shù)量的項目限制的隊列。每當(dāng)處理定期數(shù)據(jù)時,通常使用此技術(shù)。例如,4K x 16閃存扇區(qū)可以分為64個64字條目,這將導(dǎo)致表2中128kB部分的內(nèi)存映射。

初始化后,啟動例程可以掃描隊列條目以確定隊列中的下一個可用條目。隊列已滿后,必須先擦除該隊列,然后才能寫入另一個條目。(注意:如果需要所有條目,則還必須使用庫切換來維護所有數(shù)據(jù)。擦除閃存后,可以寫入新條目。這種方法的缺點是,如果在擦除過程中功率下降,則所有數(shù)據(jù)都可能丟失。如果有界隊列技術(shù)不符合系統(tǒng)的要求,則還需要進行銀行切換。

圖 1 說明了進入有界隊列的條目流。

有關(guān)簡單的 C 源代碼示例,請參閱附錄 A。

表 2.有界隊列內(nèi)存映射示例

閃光燈[ ]
隊列索引 數(shù)據(jù)閃存地址
63 0xFFC0-0xFFFF
62 0xFF80-0xFFBF
61 0xFF40-0xFF7F
. . . . . . . .
2 0xF080-0xF0BF
1 0xF040-0xF07F
0 0xF000-0xF03F

pYYBAGPy44KADZowAAA_ZPjbqpE456.gif?imgver=1

圖1.有界隊列流。

銀行切換

組交換是在長扇區(qū)擦除周期中防止數(shù)據(jù)丟失或損壞的有效方法。當(dāng)扇區(qū)大小僅略大于總數(shù)據(jù)大小時,此方法非常有效。組切換的缺點是它至少需要兩個閃存扇區(qū)。當(dāng)要寫入的總數(shù)據(jù)大小遠小于扇區(qū)大小時,最佳方法將庫交換和有界隊列技術(shù)結(jié)合起來。如果應(yīng)用需要組切換,MAXQ4的兩個16K x 7665閃存扇區(qū)可以用作數(shù)據(jù)存儲。

表3是使用兩個4K x 16閃存扇區(qū)時的內(nèi)存映射示例。圖 2 顯示了組交換寫入/擦除流程。

有關(guān)簡單的 C 源代碼示例,請參閱附錄 A。

表 3.組切換存儲器映射示例

閃存扇區(qū)
扇區(qū)編號 數(shù)據(jù)閃存地址
0 0xF000-0xFFFF
1 0xE000-0xEFFF

poYBAGPy44OAGMFmAAA1kCGdmTI699.gif?imgver=1

圖2.銀行切換流程。

有界隊列和銀行交換

同時使用有界隊列和銀行交換技術(shù)是最可靠和靈活的方法。當(dāng)需要存儲少量數(shù)據(jù)以定期刷新時,以及必須保持?jǐn)?shù)據(jù)完整性時,這種組合方法非常有效。表 4 顯示了使用劃分為 4 個相等條目的兩個 16K x 64 扇區(qū)的內(nèi)存映射示例。圖 3 說明了兩個扇區(qū)之間有界隊列中的數(shù)據(jù)流。

這種組合技術(shù)的編碼僅比單獨的有界隊列稍微復(fù)雜一些。有關(guān)簡單的 C 源代碼示例,請參閱附錄 A。

表 4.有界隊列內(nèi)存映射示例

富捷銀行0[ ]
隊列索引 數(shù)據(jù)閃存地址
63 0xFFC0-0xFFFF
62 0xFF80-0xFFBF
61 0xFF40-0xFF7F
. . . . . . . .
2 0xF080-0xF0BF
1 0xF040-0xF07F
0 0xF000-0xF03F
富捷銀行1[ ]
隊列索引 數(shù)據(jù)閃存地址
63 0xEFC0-0xEFFF
62 0xEF80-0xEFBF
61 0xEF40-0xEF7F
. . . . . . . .
2 0xE080-0xE0BF
1 0xE040-0xE07F
0 0xE000-0xE03F

pYYBAGPy44WASoEyAAA_J9FEqrA271.gif?imgver=1

圖3.有界隊列和銀行切換的流程圖。

實用程序 ROM 閃存例程

為了編程、擦除和驗證閃存,MAXQ7665微控制器在ROM (只讀存儲器)中提供了片內(nèi)閃存支持例程。有兩種方法可以訪問這些例程。第一種也是最快的方法是直接訪問,即直接調(diào)用例程。為此,請?zhí)峁┌韵滦械念^文件:

u16 flashEraseSector(void *);
u16 flashEraseAll(void);
u16 flashWrite(void *pAddress, u16 iData);

接下來,添加鏈接器定義以為每個例程分配適當(dāng)?shù)牡刂贰τ?IAR 鏈接器文件,添加的行如下所示:

-DflashEraseSector=0x8XXX
-DflashEraseAll=0x8XXX
-DflashWrite=0x8XXX

將 0x8XXX 替換為每個例程的相應(yīng)內(nèi)存地址。其他編譯器可能會使用不同的方法來添加這些引用。

注意:直接訪問方法不提供與未來 ROM 版本的向前兼容性。

間接尋址的第二種方法使用表查找。雖然此方法提供了與未來ROM版本更好的兼容性,但它消耗了更多的執(zhí)行時間。在下面描述的每個例程之后,程序集例程使用表查找方法來獲取 ROM 實用程序例程的地址。表 5 顯示了實用程序 ROM 提供的閃存例程。有關(guān)ROM實用程序的完整列表,請參考MAXQ7665用戶指南,該指南可在Maxim網(wǎng)站上找到。

表 5.閃存實用程序 ROM 例程

例程編號 例程名稱 入口點可 ROMTable = ROM[800Dh] 入口點物理地址
2 閃存擦除扇區(qū) 羅姆[可浪漫 + 1] 0x8XXX
3 閃光擦除全部 羅姆[可浪漫 + 2] 0x8XXX
15 閃寫 羅姆[可浪漫 + 14] 0x8XXX

閃寫

常規(guī): u16 flashWrite(void *pAddress, u16 iData)
總結(jié): 對單個字的閃存進行編程。
輸入: A[0] - 閃存中要寫入的字地址。
A[1] - 要寫入閃存的字值。
輸出: 攜帶:錯誤時設(shè)置,成功時清除。如果設(shè)置,則 A[0] 包含以下錯誤代碼之一: 1:由于軟件超時而導(dǎo)致的故障
2:硬件 (DQ5/FERR)
報告故障 4:
不支持
命令 SW_FERR - 出錯時設(shè)置,成功時清除。
筆記: 監(jiān)視器不得處于活動狀態(tài),或者監(jiān)視器超時必須設(shè)置足夠長的時間才能在不觸發(fā)重置的情況下完成此例程。

下面的匯編代碼示例使用間接尋址方法(查找表)調(diào)用 flashWrite() 實用例程。此例程可由 C 代碼調(diào)用。

; This routine is callable by C code using the following prototype
; u16 flashWrite(void *pAddress, u16 iData);
;
flashWrite:
    move APC, #0           ; No auto inc/dec of accumulator.
    move DP[0], #0800Dh    ; This is where the address of the table is
                           ; stored.
    move ACC, @DP[0]       ; Get the location of the routine table.
    add  #14               ; Add the index to the flashWrite routine.
    move DP[0], ACC
    move ACC, @DP[0]       ; Retrieve the address of the routine.
    call ACC               ; Execute the routine.
    ret                    ; Status returned in A[0].

常規(guī): u16 閃存擦除扇區(qū)(無效 *pAddress)
總結(jié): 擦除閃存的單個扇區(qū)。
輸入: A[0] - 位于要擦除的扇區(qū)中的地址。
輸出: 攜帶:錯誤時設(shè)置,成功時清除。如果設(shè)置,則 A[0] 包含以下錯誤代碼之一: 1:由于軟件超時而導(dǎo)致的故障
2:硬件 (DQ5/FERR)
報告故障 4:
不支持
命令 SW_FERR - 出錯時設(shè)置,成功時清除。
筆記:
監(jiān)視器不得處于活動狀態(tài),或者監(jiān)視器超時必須設(shè)置足夠長的時間才能在不觸發(fā)重置的情況下完成此例程。
; This routine is callable by C code using the following prototype
; u16 flashEraseSector(void *pAddress);
;
flashEraseSector:
    move APC, #0           ; No auto inc/dec of accumulator.
    move DP[0], #0800Dh    ; This is where the address of the table is
                           ; stored.
    move ACC, @DP[0]       ; Get the location of the routine table.
    add  #1                ; Add the index to the flashEraseSector routine.
    move DP[0], ACC
    move ACC, @DP[0]       ; Retrieve the address of the routine.
    call ACC               ; Execute the routine.
    ret                    ; Status returned in A[0]
常規(guī): 虛空閃光擦除全部(虛空)
總結(jié): 擦除整個程序和數(shù)據(jù)閃存,包括引導(dǎo)加載程序扇區(qū)。此例程通常不用于 IAP,因為必須非常小心以確保擦除/編程序列不會中斷。
輸入: 沒有
輸出: 攜帶:錯誤時設(shè)置,成功時清除。
SW_FERR - 出錯時設(shè)置,成功時清除。
筆記: 監(jiān)視器不得處于活動狀態(tài),或者監(jiān)視器超時必須設(shè)置足夠長的時間才能在不觸發(fā)重置的情況下完成此例程。
; This routine is callable by C code using the following prototype
; void flashEraseAll(void);
;
flashEraseAll:
    move APC, #0           ; No auto inc/dec of accumulator.
    move DP[0], #0800Dh    ; This is where the address of the table is
                           ; stored.
    move ACC, @DP[0]       ; Get the location of the routine table.
    add  #2                ; Add the index to the flashEraseAll routine.
    move DP[0], ACC
    move ACC, @DP[0]       ; Retrieve the address of the routine.
    call ACC               ; Execute the routine.
    ret

應(yīng)用程序內(nèi)編程 (IAP)

大多數(shù)基于閃存的系統(tǒng)必須能夠在系統(tǒng)安裝在最終產(chǎn)品中時更新固件。此過程稱為應(yīng)用程序內(nèi)編程 (IAP)。以下討論概述了創(chuàng)建 IAP 應(yīng)用程序的一般準(zhǔn)則。

上一節(jié)中概述的實用程序 ROM 閃存例程執(zhí)行擦除和寫入閃存 ROM 所需的所有操作。因此,最終用戶應(yīng)用程序可以在閃存上執(zhí)行操作。與任何其他子例程調(diào)用一樣,控件將在例程完成后返回到最終用戶的代碼。

在MAXQ7665的僅扇區(qū)擦除版本上執(zhí)行IAP序列時必須小心,因為不存在專用的引導(dǎo)加載程序閃存扇區(qū)。要設(shè)計完全容錯的 IAP,引導(dǎo)加載程序應(yīng)用程序必須與主應(yīng)用程序分開。這確保了即使在發(fā)生不完整的重編程序列后,也可以重試重編程過程。如果IAP必須容忍重編程過程中的斷電等故障,則選擇具有頁面擦除功能的MAXQ7665版本。這將允許引導(dǎo)加載程序應(yīng)用程序從0x0000(重置入口點)啟動,并與主應(yīng)用程序代碼完全分開。對于不需要完全容錯 IAP 的應(yīng)用程序,可以使用基于 RAM 的重新刷新例程來完成 IAP。

使用基于 RAM 的閃存例程的 IAP

當(dāng)不需要故障恢復(fù)時,可以使用基于RAM的閃存例程重新刷新MAXQ7665。此方法要求主應(yīng)用程序?qū)⒁粋€小的可重定位閃存編程例程復(fù)制到 RAM 中,然后跳轉(zhuǎn)到該例程。從 RAM 執(zhí)行代碼時,必須考慮幾個限制。

表 6.從 RAM 執(zhí)行代碼時的限制

南卡羅來納州。在執(zhí)行基于 RAM 的例程之前,UPA 必須設(shè)置為 0。這意味著應(yīng)用程序必須從代碼段 P0 和 P1 跳轉(zhuǎn)到 RAM 例程。
RAM 不能同時作為數(shù)據(jù)和程序訪問。這意味著只有寄存器和硬件堆??捎糜跀?shù)據(jù)存儲。
如果啟用了中斷,中斷向量必須指向 RAM 例程。通常,由于RAM重新刷新例程的簡單性,中斷被關(guān)閉并使用輪詢。

通常,閃存例程將通過UARTCAN接口進行通信。通常最好接收小數(shù)據(jù)包并發(fā)送確認(rèn),以允許更強大的錯誤恢復(fù)機制。圖 4 是一個流程圖,顯示了重新刷新例程的工作原理。如果在斷電前未成功完成重新編程,請記住,微控制器需要通過JTAG端口重新編程。

poYBAGPy44eAA79mAACFQA9nU7w172.jpg?imgver=1

圖4.簡化的 RAM 重新刷新例程的流程圖。

審核編輯:郭婷


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

    關(guān)注

    48

    文章

    7334

    瀏覽量

    150088
  • 閃存
    +關(guān)注

    關(guān)注

    16

    文章

    1745

    瀏覽量

    114573
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7365

    瀏覽量

    163088
收藏 人收藏

    評論

    相關(guān)推薦

    QSPI工作在QUAD模式下,擦除第一扇區(qū)成功,第二扇區(qū)失敗為什么?

    請教下,QSPI 為何工作在 QUAD模式下,擦除第一扇區(qū)所需要的時間基本上是OK,擦除第二扇區(qū) 所需要的時間怎么會是 0ms ???
    發(fā)表于 05-07 07:58

    ch375為什么只能讀0扇區(qū)?

    我是并口模擬的,沒有用庫,不過只能讀0扇區(qū)數(shù)據(jù),其它扇區(qū)讀到的數(shù)據(jù)都是00,請教各位大俠,幫幫忙,謝謝!??!串口部分的程序就不發(fā)了,我用的
    發(fā)表于 06-27 07:43

    STM32F746將數(shù)據(jù)寫入內(nèi)部閃存而不擦除整個扇區(qū)?

    我正在使用 stm32f746 和 touchGFX 開發(fā)一個項目。我需要將一些數(shù)據(jù)存儲到閃存中并在需要時更改它,我想我必須擦除整個扇區(qū),但我不想這樣做,因為我在每個
    發(fā)表于 02-03 10:41

    如何讓Mcuxpresso只擦除編程必要的“頁面”而不是“扇區(qū)”?

    我編寫了一個共享扇區(qū)的自定義引導(dǎo)加載程序和應(yīng)用程序。因此,我不希望程序員在對其中任何一個進行編程擦除
    發(fā)表于 05-16 08:54

    S32G2 QSPI串行NOR微米閃存扇區(qū)擦除命令的問題如何解決?

    MT35XU512ABA。 - otcal DDR 模式 - 寄存器讀取、數(shù)據(jù)讀取和頁面編程/寫入工作成功 問題:扇區(qū)擦除不起作用 我是 QSPI
    發(fā)表于 05-18 08:48

    MAXQ7665,MAXQ7665A, MAXQ7665B

    The MAXQ7665,MAXQ7665A, MAXQ7665B smart systems-on-a-chip (SoC) are data-acquisition systems based
    發(fā)表于 01-22 16:23 ?32次下載

    MAXQ7665C, MAXQ7665D pdf datas

    The MAXQ7665A–MAXQ7665D smart systems-on-a-chip (SoC) are data-acquisition systems based on a
    發(fā)表于 01-22 16:25 ?15次下載

    在應(yīng)用編程MAXQ微控制器中可分區(qū)擦除程序和數(shù)據(jù)閃存

    摘要:本應(yīng)用筆記介紹了MAXQ微控制器中的程序和數(shù)據(jù)閃存,以及如何使用內(nèi)置的應(yīng)用ROM對閃存進行擦/寫。本應(yīng)用筆記適用于所有使用分區(qū)
    發(fā)表于 04-23 17:16 ?680次閱讀
    在應(yīng)用<b class='flag-5'>編程</b><b class='flag-5'>MAXQ</b>微控制器中可分區(qū)<b class='flag-5'>擦除</b>的<b class='flag-5'>程序</b><b class='flag-5'>和數(shù)據(jù)</b><b class='flag-5'>閃存</b>

    在應(yīng)用編程MAXQ7665擦除程序和數(shù)據(jù)閃存-In-A

    in the MAXQ7665 microcontrollers (µC) using the built-in utility ROM. This information applies to those MAXQ7665 flash-based &mic
    發(fā)表于 05-01 10:41 ?1199次閱讀
    在應(yīng)用<b class='flag-5'>編程</b>的<b class='flag-5'>MAXQ7665</b>頁<b class='flag-5'>擦除</b>的<b class='flag-5'>程序</b><b class='flag-5'>和數(shù)據(jù)</b><b class='flag-5'>閃存</b>-In-A

    在應(yīng)用編程MAXQ7665部門擦除程序和數(shù)據(jù)閃存-In-A

    in the MAXQ7665 microcontrollers (µC) using the built-in utility ROM. This information applies only to the MAXQ7665 flash-based m
    發(fā)表于 05-01 10:42 ?1011次閱讀
    在應(yīng)用<b class='flag-5'>編程</b>的<b class='flag-5'>MAXQ7665</b>部門<b class='flag-5'>擦除</b><b class='flag-5'>程序</b><b class='flag-5'>和數(shù)據(jù)</b><b class='flag-5'>閃存</b>-In-A

    MAXQ7665評估板快速入門

    摘要:本應(yīng)用筆記是快速入門。它解釋了怎樣安裝并配置IAR Embedded Workbench?。此外,它提供簡要的說明來編譯、鏈接、調(diào)試MAXQ7665微控制器評估套件中的幾個實例工程。問題排查部
    發(fā)表于 05-02 10:42 ?710次閱讀
    <b class='flag-5'>MAXQ7665</b>評估板快速入門

    如何使用CAN引導(dǎo)加載程序MAXQ7665A中加載用戶應(yīng)用代碼

    CAN引導(dǎo)加載程序可通過CAN接口對MAXQ7665A微控制器進行編程。引導(dǎo)加載程序還可幫助設(shè)計人員更新/修改已在現(xiàn)場部署的產(chǎn)品的用戶應(yīng)用程序
    的頭像 發(fā)表于 02-21 16:40 ?661次閱讀
    如何使用CAN引導(dǎo)加載<b class='flag-5'>程序</b>在<b class='flag-5'>MAXQ7665</b>A中加載用戶應(yīng)用代碼

    MAXQ7665尋頁程序和數(shù)據(jù)閃存的應(yīng)用內(nèi)編程

    本應(yīng)用筆記介紹如何管理帶有頁面擦除(PE)閃存MAXQ7665閃存微控制器(μC)中的內(nèi)部數(shù)據(jù)程序
    的頭像 發(fā)表于 02-21 17:33 ?620次閱讀
    <b class='flag-5'>MAXQ7665</b>尋頁<b class='flag-5'>程序</b><b class='flag-5'>和數(shù)據(jù)</b><b class='flag-5'>閃存</b>的應(yīng)用<b class='flag-5'>內(nèi)</b><b class='flag-5'>編程</b>

    MAXQ7665扇區(qū)擦除程序和數(shù)據(jù)閃存的應(yīng)用內(nèi)編程(IAP)

    本應(yīng)用筆記介紹如何使用內(nèi)置實用程序ROM擦除/寫入MAXQ7665微控制器(μC)中的程序和數(shù)據(jù)閃存
    的頭像 發(fā)表于 06-13 15:45 ?526次閱讀
    <b class='flag-5'>MAXQ7665</b><b class='flag-5'>扇區(qū)</b><b class='flag-5'>可</b><b class='flag-5'>擦除</b><b class='flag-5'>程序</b><b class='flag-5'>和數(shù)據(jù)</b><b class='flag-5'>閃存</b>的應(yīng)用<b class='flag-5'>內(nèi)</b><b class='flag-5'>編程</b>(IAP)

    MAXQ7665尋頁(PE)程序和數(shù)據(jù)閃存的應(yīng)用內(nèi)編程(IAP)

    本應(yīng)用筆記介紹如何使用內(nèi)置實用程序ROM擦除/寫入MAXQ7665微控制器(μC)中的程序和數(shù)據(jù)閃存
    的頭像 發(fā)表于 06-16 11:37 ?1008次閱讀
    <b class='flag-5'>MAXQ7665</b>尋頁(PE)<b class='flag-5'>程序</b><b class='flag-5'>和數(shù)據(jù)</b><b class='flag-5'>閃存</b>的應(yīng)用<b class='flag-5'>內(nèi)</b><b class='flag-5'>編程</b>(IAP)