RM新时代网站-首页

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

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

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

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

星星科技指導(dǎo)員 ? 來(lái)源:ADI ? 作者:ADI ? 2023-06-16 11:37 ? 次閱讀

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

介紹

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

內(nèi)存映射

本節(jié)詳細(xì)介紹MAXQ7665 μC系列各種存儲(chǔ)器尺寸的一般閃存信息和存儲(chǔ)器結(jié)構(gòu)。MAX7665器件提供三種類(lèi)型的閃存:扇區(qū)擦除、單字擦除和兩頁(yè)擦除。本文檔僅介紹帶PE閃存和兩頁(yè)擦除數(shù)據(jù)閃存的MAXQ7665器件;該討論不適用于僅扇區(qū)擦除設(shè)備或具有單字可擦除數(shù)據(jù)閃存的設(shè)備。

表1至表3分別顯示了從程序閃存、實(shí)用程序ROM和數(shù)據(jù)SRAM執(zhí)行代碼時(shí)16KB器件的存儲(chǔ)器映射。圖 1 和圖 2 顯示了 16KB 和 256B 程序閃存的扇區(qū)和頁(yè)面結(jié)構(gòu)。其他閃光燈選項(xiàng)可用;請(qǐng)參考MAXQ7665數(shù)據(jù)資料獲取完整列表。

表 1.16KB 內(nèi)存空間 — 從程序閃存執(zhí)行

表1

表 2.16KB 內(nèi)存空間 — 從實(shí)用程序 ROM 執(zhí)行

表2

表 3.16KB 內(nèi)存空間 — 從數(shù)據(jù) SRAM 執(zhí)行

表3

圖1.16KB程序閃存的扇區(qū)/頁(yè)面結(jié)構(gòu)。

圖1.16KB程序閃存的扇區(qū)/頁(yè)面結(jié)構(gòu)。

圖2.256B數(shù)據(jù)閃存的扇區(qū)/頁(yè)面結(jié)構(gòu)。

圖2.256B數(shù)據(jù)閃存的扇區(qū)/頁(yè)面結(jié)構(gòu)。

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

閃存可用于可靠地存儲(chǔ)系統(tǒng)數(shù)據(jù),這些數(shù)據(jù)需要在系統(tǒng)運(yùn)行期間進(jìn)行一次或定期編程。與EEPROM不同,MAXQ7665上的PE閃存不能被字節(jié)/字擦除。必須一次擦除兩頁(yè)。這通常需要 10 毫秒,但在最壞的情況下可能需要更長(zhǎng)的時(shí)間。在此期間,用戶代碼將停止,因此不會(huì)進(jìn)行其他處理。

有多種存儲(chǔ)數(shù)據(jù)到閃存的技術(shù),在為應(yīng)用程序選擇適當(dāng)?shù)姆椒〞r(shí),必須考慮幾個(gè)因素。應(yīng)用程序是否需要確保在新數(shù)據(jù)完全寫(xiě)入之前當(dāng)前數(shù)據(jù)保持不變?如果答案是肯定的,那么某種形式的組切換技術(shù)是必要的,這樣在寫(xiě)入新數(shù)據(jù)時(shí)不會(huì)丟失當(dāng)前數(shù)據(jù)。在產(chǎn)品的生命周期內(nèi)將發(fā)生多少個(gè)擦除/寫(xiě)入周期?如果擦除/寫(xiě)入周期數(shù)將超過(guò)數(shù)據(jù)手冊(cè)中規(guī)定的最大值,則使用綁定隊(duì)列方法可以將這些周期分散到數(shù)據(jù)閃存的多頁(yè)上,從而顯著增加總擦除/寫(xiě)入周期。對(duì)于大多數(shù)周期性數(shù)據(jù)存儲(chǔ)需求,銀行交換和/或有界隊(duì)列技術(shù)滿足系統(tǒng)的可靠性要求和需求。以下是每種技術(shù)的簡(jiǎn)單示例。

銀行切換

存儲(chǔ)體交換是在擦除/寫(xiě)入周期中防止數(shù)據(jù)丟失或損壞的有效方法。此方法通過(guò)始終維護(hù)至少一個(gè)數(shù)據(jù)副本來(lái)很好地工作。組交換的缺點(diǎn)是它需要的數(shù)據(jù)閃存量是有界隊(duì)列方法的兩倍。事實(shí)上,銀行切換實(shí)際上只是隊(duì)列大小為 2 的有界隊(duì)列方法。因此,有關(guān)如何實(shí)現(xiàn)有界隊(duì)列的詳細(xì)信息,請(qǐng)參閱下一節(jié)。

有界隊(duì)列

有界隊(duì)列是受固定數(shù)量的項(xiàng)限制的隊(duì)列,通常在處理定期數(shù)據(jù)時(shí)使用。有界隊(duì)列是通過(guò)創(chuàng)建與所需數(shù)據(jù)塊大小相等的“條目”的固定長(zhǎng)度隊(duì)列來(lái)形成的。條目大小特定于應(yīng)用程序,必須向上舍入到最接近的頁(yè)面擦除邊界。 注意 :可以擦除的最小大小為兩頁(yè)/字。雖然可以根據(jù)應(yīng)用程序要求以多種方式對(duì)數(shù)據(jù)閃存進(jìn)行分區(qū),但由于數(shù)據(jù)閃存施加的兩頁(yè)擦除限制,條目被限制為兩頁(yè)的倍數(shù)。例如,512 x 16 數(shù)據(jù)閃存可以分為 32 個(gè) 16 字條目,這將產(chǎn)生表 4 中的內(nèi)存映射。

初始化后,啟動(dòng)例程可以掃描隊(duì)列條目以確定隊(duì)列中的下一個(gè)可用條目。一旦隊(duì)列已滿,就可以使其包裝回開(kāi)頭。擦除數(shù)據(jù)閃存條目后,可以寫(xiě)入新條目。圖 3 說(shuō)明了進(jìn)入有界隊(duì)列的條目流。

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

表 4.有界隊(duì)列內(nèi)存映射示例| 閃光燈[ ] |

| ------------- |

| 隊(duì)列索引 | 數(shù)據(jù)閃存地址 |

| 31 | 0xC1F0-0xC1FF |

| 30 | 0xC1E0-0xC1EF |

| 29 | 0xC1D0-0xC1DF |

| . . . . | . . . . |

| 2 | 0xC020-0xC05F |

| 1 | 0xC010-0xC03F |

| 0 | 0xC000-0xC00F |

圖3.有界隊(duì)列流的圖示。

圖3.有界隊(duì)列流的圖示。

實(shí)用程序 ROM 閃存例程

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

u16 flashErasePage(void *);
u16 flashEraseSector(void *);
u16 flashEraseAll(void);

u16 dataFlashWrite(u16 *pAddress, u16 iData);
u16 dataFlashErasePage(void *);
u16 dataFlashEraseSector(void *);
u16 dataFlashEraseAll(void);

接下來(lái),添加鏈接器定義以為每個(gè)例程分配適當(dāng)?shù)牡刂?。?duì)于 IAR 鏈接器文件,添加的行如下所示:

-DflashEraseSector=0x8XXX
-DflashErasePage=0x8XXX
-DflashEraseAll=0x8XXX

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

flashWrite() 實(shí)用程序例程不能直接從 C 調(diào)用,因?yàn)?a target="_blank">參數(shù)傳遞與 C 語(yǔ)言不兼容。必須編寫(xiě)如下所示的小型程序集例程才能調(diào)用此函數(shù)。

注意:直接訪問(wèn)方法不提供與未來(lái) ROM 版本的向前兼容性。

第二種方法是通過(guò)表查找進(jìn)行間接訪問(wèn)。此方法提供了與未來(lái)ROM版本的更大兼容性,但消耗更多的執(zhí)行時(shí)間。在下面描述的每個(gè)例程之后,程序集例程使用表查找方法來(lái)獲取 ROM 實(shí)用程序例程的地址。表 5 顯示了實(shí)用程序 ROM 提供的閃存例程。有關(guān)實(shí)用程序ROM例程的完整列表,請(qǐng)參考MAXQ7665用戶指南。

表 5.閃存實(shí)用程序 ROM 例程| 例程編號(hào) | 例程名稱 | 入口點(diǎn)可 ROMTable = ROM[800Dh] | 入口點(diǎn)物理地址 |

| ---------------------------------------------------------------------- | ---------- | -------------------------------- | ---------------- |

| 1 | 閃寫(xiě) | 羅姆[可浪漫] | 0x8XXX |

| 2 | 閃光擦除頁(yè)面 | 羅姆[可浪漫 + 1] | 0x8XXX |

| 3 | 閃光擦除全部 | 羅姆[可浪漫 + 2] | 0x8XXX |

| 4 | 移動(dòng)DP0 | 羅姆[可浪漫 + 3] | 0x8XXX |

| 16 | 閃存擦除扇區(qū) | 羅姆[可浪漫 + 15] | 0x8XXX |

| 17 | 數(shù)據(jù)閃寫(xiě) | 羅姆[可浪漫 + 16] | 0x8XXX |

| 19 | 數(shù)據(jù)閃光擦除頁(yè)面 | 羅姆[可浪漫 + 18] | 0x8XXX |

| 20 | 數(shù)據(jù)閃存擦除扇區(qū) | 羅姆[可浪漫 + 19] | 0x8XXX |

| 21 | 數(shù)據(jù)閃存擦除全部 | 羅姆[可浪漫 + 20] | 0x8XXX |

閃寫(xiě)()| 常規(guī): | u16 flashWrite(u16 *pDest, u16 *pSrc) |

| ---------------------------------------------------- | ------------------------------------------ |

| 總結(jié): | 對(duì)單頁(yè)(32 字)的程序閃存進(jìn)行編程。 |

| 輸入: | DP[0] - 閃存中的目標(biāo)地址。
DP[1]—SRAM 中的源地址,包含 32 個(gè)要寫(xiě)入的數(shù)據(jù)字。 |

| 輸出: | 攜帶:錯(cuò)誤時(shí)設(shè)置,成功時(shí)清除。如果設(shè)置,則 A[0] 包含以下錯(cuò)誤代碼之一: 1:由于軟件超時(shí)而導(dǎo)致的故障
2:硬件 (DQ5/FERR)
報(bào)告故障 4:
不支持
命令 SW_FERR - 出錯(cuò)時(shí)設(shè)置,成功時(shí)清除。 |

| 筆記: | 監(jiān)視器不得處于活動(dòng)狀態(tài),或者監(jiān)視器超時(shí)必須設(shè)置足夠長(zhǎng)的時(shí)間才能在不觸發(fā)重置的情況下完成此例程。 |

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

; This routine is callable by C code using the following prototype
; u16 flashWrite(u16 *pDest, u16 *pSrc);
;
flashWrite:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #2           ; Set ACC to A[2].
    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.
    push DP[1]             ; Save Frame Pointer on the stack.
    move DP[0],A[0]        ; Move argument 0(dest address) to DP[0].
    move DP[1],A[1]        ; Move argument 1(src address) to DP[1].
    call ACC               ; Execute the routine.
    pop  DP[1]             ; Restore Frame Pointer.
    ret                    ; Status returned in A[0].

FlashErasePage()| 常規(guī): | u16 閃存擦除頁(yè)面(無(wú)效 *pAddress) |

| ---------------------------------------------- | ------------------------------------ |

| 總結(jié): | 擦除兩頁(yè)的程序閃存塊。 |

| 輸入: | A[0] - 位于要擦除的兩頁(yè)塊中的地址,即要擦除第 0 頁(yè)和第 1 頁(yè),A[0] 可以包含從 0x0000 到 0x001F 的任何地址。 |

| 輸出: | 攜帶:錯(cuò)誤時(shí)設(shè)置,成功時(shí)清除。如果設(shè)置,則 A[0] 包含以下錯(cuò)誤代碼之一: 1:由于軟件超時(shí)而導(dǎo)致的故障
2:硬件 (DQ5/FERR)
報(bào)告故障 4:
不支持
命令 SW_FERR - 出錯(cuò)時(shí)設(shè)置,成功時(shí)清除。 |

| 筆記: | 監(jiān)視器不得處于活動(dòng)狀態(tài),或者監(jiān)視器超時(shí)必須設(shè)置足夠長(zhǎng)的時(shí)間才能在不觸發(fā)重置的情況下完成此例程。 |

; This routine is callable by C code using the following prototype
; u16 flashErasePage(void *pAddress);
;
flashErasePage:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #1           ; Set ACC to A[1].
    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].

FlashEraseAll()| 常規(guī): | 虛空閃光擦除全部(虛空) |

| ------------------------------------ | -------------------------- |

| 總結(jié): | 擦除整個(gè)程序和數(shù)據(jù)閃存。此例程只能從 RAM 調(diào)用。 |

| 輸入: | 沒(méi)有 |

| 輸出: | 攜帶:錯(cuò)誤時(shí)設(shè)置,成功時(shí)清除。
SW_FERR - 出錯(cuò)時(shí)設(shè)置,成功時(shí)清除。 |

| 筆記: | 監(jiān)視器不得處于活動(dòng)狀態(tài),或者監(jiān)視器超時(shí)必須設(shè)置足夠長(zhǎng)的時(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 AP,  #0           ; Set ACC to A[0].
    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

移動(dòng)DP0| 常規(guī): | 移動(dòng)DP0 |

| ------------------- | --------- |

| 總結(jié): | 讀取閃存的一個(gè)字。 |

| 輸入: | DP[0] - 閃存中的源地址。添加0x8000以讀取程序閃存。 |

| 輸出: | GR將包含指定地址的數(shù)據(jù)。 |

| 筆記: | 不能直接從 C 調(diào)用此函數(shù),因?yàn)閰?shù)和返回寄存器與 C 調(diào)用約定不兼容。 |

下面的匯編代碼示例將 moveDP0 轉(zhuǎn)換為 C 可調(diào)用例程。如果速度對(duì)應(yīng)用程序至關(guān)重要,則應(yīng)為特定任務(wù)編寫(xiě)自定義匯編語(yǔ)言例程。有幾個(gè)像這樣的實(shí)用程序ROM例程將有助于從閃存寫(xiě)入有效的數(shù)據(jù)傳輸。

; This routine is callable by C code using the following prototype
; u16 flashRead(u16 *pAddress);
;
flashRead:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #1           ; Set ACC to A[1].
    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  #3                ; Add the index to the moveDP0 routine.
    move DP[0], ACC
    move ACC, @DP[0]       ; Retrieve the address of the routine.
    push DP[1]             ; Save Frame Pointer on the stack.
    move DP[0],A[0]        ; Move argument 0(src address) to DP[0].
    call ACC               ; Execute the routine.
    pop  DP[1]             ; Restore Frame Pointer.
    move A[0],GR
    ret                    ; Data word returned in A[0].

FlashEraseSector()| Routine: | u16 flashEraseSector(void *pAddress) |

| -------------------------------------------------- | -------------------------------------- |

| Summary: | Erases a single sector of program-flash memory. |

| Inputs: | A[0]—Address located in the sector to erase. |

| Outputs: | Carry: Set on error and cleared on success. If set, then A[0] contains one of the following error codes:
1: failure due to software timeout
2: failure reported by hardware (DQ5/FERR)
4: command not supported
SW_FERR—Set on error, cleared on success. |

| Notes: | The watchdog must not be active or the watchdog timeout must be set long enough to complete this routine without triggering a reset. |

; 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 AP,  #1           ; Set ACC to A[1].
    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  #15               ; 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].

數(shù)據(jù)閃存寫(xiě)入()| 常規(guī): | u16 dataFlashWrite(void *pAddress, u16 *pData) |

| ------------------------------------------------------------- | --------------------------------------------------- |

| 總結(jié): | 對(duì)單個(gè)字的數(shù)據(jù)閃存進(jìn)行編程。 |

| 輸入: | A[0] - 閃存中要寫(xiě)入的字地址。
A[1] — 要寫(xiě)入閃存的字值。 |

| 輸出: | 攜帶:錯(cuò)誤時(shí)設(shè)置,成功時(shí)清除。如果設(shè)置,則 A[0] 包含以下錯(cuò)誤代碼之一: 1:由于軟件超時(shí)而導(dǎo)致的故障
2:硬件 (DQ5/FERR)
報(bào)告的故障 4:
不支持
命令 SW_FER - 出錯(cuò)時(shí)設(shè)置,成功時(shí)清除。 |

| 筆記: | 監(jiān)視器不得處于活動(dòng)狀態(tài),或者監(jiān)視器超時(shí)必須設(shè)置足夠長(zhǎng)的時(shí)間才能在不觸發(fā)重置的情況下完成此例程。 |

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

; This routine is callable by C code using the following prototype
; u16 dataFlashWrite(void *pAddress, u16 iData);
;
dataFlashWrite:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #2           ; Set ACC to A[2].
    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  #16               ; 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].

DataFlashErasePage()| 常規(guī): | u16 dataFlashErasePage(void *pAddress) |

| ---------------------------------------------------- | ------------------------------------------ |

| 總結(jié): | 擦除兩頁(yè)數(shù)據(jù)閃存。 |

| 輸入: | A[0] - 位于要擦除的兩頁(yè)塊中的地址,即要擦除第 0 頁(yè)和第 1 頁(yè),A[0] 可以包含地址0x4000或0x4001。 |

| 輸出: | 攜帶:錯(cuò)誤時(shí)設(shè)置,成功時(shí)清除。如果設(shè)置,則 A[0] 包含以下錯(cuò)誤代碼之一: 1:由于軟件超時(shí)而導(dǎo)致的故障
2:硬件 (DQ5/FERR)
報(bào)告故障 4:
不支持
命令 SW_FERR - 出錯(cuò)時(shí)設(shè)置,成功時(shí)清除。 |

| 筆記: | 監(jiān)視器不得處于活動(dòng)狀態(tài),或者監(jiān)視器超時(shí)必須設(shè)置足夠長(zhǎng)的時(shí)間才能在不觸發(fā)重置的情況下完成此例程。 |

; This routine is callable by C code using the following prototype
; u16 dataFlashErasePage(void *pAddress);
;
dataFlashErasePage:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #1           ; Set ACC to A[1].
    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  #18               ; Add the index to the dataFlashErasePage 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].

DataFlashEraseSector()| 常規(guī): | u16 dataFlashEraseSector(void *pAddress) |

| ------------------------------------------------------ | -------------------------------------------- |

| 總結(jié): | 擦除數(shù)據(jù)閃存的單個(gè)扇區(qū)。 |

| 輸入: | A[0] - 位于要擦除的扇區(qū)中的地址。 |

| 輸出: | 攜帶:錯(cuò)誤時(shí)設(shè)置,成功時(shí)清除。如果設(shè)置,則 A[0] 包含以下錯(cuò)誤代碼之一: 1:由于軟件超時(shí)而導(dǎo)致的故障
2:硬件 (DQ5/FERR)
報(bào)告故障 4:
不支持
命令 SW_FERR - 出錯(cuò)時(shí)設(shè)置,成功時(shí)清除。 |

| 筆記: | 監(jiān)視器不得處于活動(dòng)狀態(tài),或者監(jiān)視器超時(shí)必須設(shè)置足夠長(zhǎng)的時(shí)間才能在不觸發(fā)重置的情況下完成此例程。 |

; This routine is callable by C code using the following prototype
; u16 dataFlashEraseSector(void *pAddress);
;
dataFlashEraseSector:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #1           ; Set ACC to A[1].
    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  #19               ; Add the index to the dataFlashEraseSector 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].

數(shù)據(jù)閃存擦除全部| 常規(guī): | void dataFlashEraseAll(void) |

| ------------------------------------------ | -------------------------------- |

| 總結(jié): | 擦除整個(gè)數(shù)據(jù)閃存。 |

| 輸入: | 沒(méi)有 |

| 輸出: | 攜帶:錯(cuò)誤時(shí)設(shè)置,成功時(shí)清除。
SW_FERR - 出錯(cuò)時(shí)設(shè)置,成功時(shí)清除。 |

| 筆記: | 監(jiān)視器不得處于活動(dòng)狀態(tài),或者監(jiān)視器超時(shí)必須設(shè)置足夠長(zhǎng)的時(shí)間才能在不觸發(fā)重置的情況下完成此例程。 |

; This routine is callable by C code using the following prototype
; void dataFlashEraseAll(void);
;
dataFlashEraseAll:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #0           ; Set ACC to A[0].
    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  #20               ; 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)的一個(gè)重要要求是能夠在系統(tǒng)安裝在最終產(chǎn)品中時(shí)更新固件。此過(guò)程稱為應(yīng)用程序內(nèi)編程 (IAP)。本節(jié)將概述創(chuàng)建 IAP 應(yīng)用程序的一般準(zhǔn)則。

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

對(duì)于可靠的 IAP,引導(dǎo)加載程序應(yīng)用程序必須與主應(yīng)用程序分開(kāi)。這確保了即使在發(fā)生不完整的重編程序列后,也可以重試重編程過(guò)程。

引導(dǎo)加載程序

ROM 在初始化后跳轉(zhuǎn)到尋址 0x0000 。因此,引導(dǎo)加載程序應(yīng)用程序的入口點(diǎn)必須放在0x0000處。引導(dǎo)加載程序應(yīng)用程序可以根據(jù)需要擴(kuò)展到任意數(shù)量的閃存扇區(qū)/頁(yè)面,但使用的任何頁(yè)面都不適用于用戶的應(yīng)用程序代碼。表6列出了擦除和寫(xiě)入閃存時(shí)必須滿足的具體要求。

表 6.調(diào)用閃存實(shí)用程序 ROM 例程的要求
不能從執(zhí)行代碼的同一閃存頁(yè)中擦除或編程。這通常不是問(wèn)題,因?yàn)樵?IAP 期間絕不應(yīng)擦除閃存引導(dǎo)加載程序應(yīng)用程序。
在調(diào)用 flashEraseSector() 或 flashErasePage() 例程之前,必須將監(jiān)視器超時(shí)設(shè)置得足夠長(zhǎng),以便完成此例程,而不會(huì)觸發(fā)重置。如果在擦除完成之前出現(xiàn)看門(mén)狗超時(shí),它將重置器件。
因?yàn)橄到y(tǒng)控制寄存器位,SC。UPA,必須設(shè)置為 0 才能訪問(wèn)實(shí)用程序 ROM,實(shí)用程序 ROM 例程不能直接從程序內(nèi)存地址調(diào)用≥ 0x8000。如果需要從上層內(nèi)存 (≥ 0x8000) 中的程序訪問(wèn)實(shí)用程序 ROM 例程,則程序必須通過(guò)駐留在下層內(nèi)存中的例程間接調(diào)用 ROM 例程 (< 0x8000)。此限制有效地將引導(dǎo)加載程序限制為 = 64KB (32KB x 16)。

圖4中的流程圖顯示了MAXQ7665退出復(fù)位狀態(tài)時(shí)的作用。在診斷ROM本身并驗(yàn)證閃存已準(zhǔn)備就緒后,ROM初始化代碼將直接跳轉(zhuǎn)到地址 0x0000 。

圖4.簡(jiǎn)化ROM初始化的流程圖。

圖4.簡(jiǎn)化ROM初始化的流程圖。

圖 5 流程圖顯示了一個(gè)簡(jiǎn)單的引導(dǎo)加載程序應(yīng)用程序如何運(yùn)行。一個(gè)簡(jiǎn)單的應(yīng)用程序標(biāo)頭可能如下所示:

typedef struct {
    u16 iSize;  // The size of the application in words
    u32 iCRC;   // The CRC of the application
    u8 ID[8];   // ID string for current application
} APPLICATION_HEADER;

使用此標(biāo)頭中的信息,引導(dǎo)加載程序可以檢查主應(yīng)用程序的有效性,并在請(qǐng)求時(shí)報(bào)告版本標(biāo)識(shí)。

圖5.簡(jiǎn)化的閃存引導(dǎo)加載程序的流程圖。

圖5.簡(jiǎn)化的閃存引導(dǎo)加載程序的流程圖。

編程順序本身非常簡(jiǎn)單。通過(guò)調(diào)用 flashEraseSector() 和/或 flashErasePage() 擦除包含主應(yīng)用程序代碼的每個(gè)扇區(qū)/頁(yè)面。然后通過(guò)為每 32 個(gè)需要編程的單詞調(diào)用 flashWrite() 一次寫(xiě)一頁(yè)。我們建議您先擦除包含應(yīng)用程序標(biāo)題的頁(yè)面,最后對(duì)CRC數(shù)據(jù)進(jìn)行編程,以最大程度地減少CRC匹配錯(cuò)誤的可能性。重新刷新通過(guò)串行端口獲取數(shù)據(jù)的微控制器的一個(gè)非常簡(jiǎn)單的例程如下所示:

/*
// VerySimpleReFlash()
//    As simple as it gets.
//    Step 1. Wait for erase command, then erase flash.
//    Step 2. Wait for program command, program flash one word at a time.
*/
void VerySimpleReFlash()
{
u16 iStatus;             // The status returned from flash utility ROM calls
s32 iSize;               // The size of the main code to program
u16 *pAddress = 0x2000;  // The starting address of the main application
u16 i;

    InitializeCOMM();    // Can be CAN or UART.
    WaitForEraseCommand();

    // Assume that application starts at the beginning of a sector.
    for (i=C_START_SECTOR;i< c_secstor_end;++i) {="" istatus="flashEraseSector(C_ADDRESS_SECTOR_1);" if="" (istatus="" !="0)" break;="" }="" slowdownwatchdogupdate();="" watchdog="" enabled="" slow="" down="" to="" prevent="" a="" timeout.="" sendflasherasedresponse(istatus);="" updatewatchdog();="" timeout="" (istatus)="" resetmicro();="" isize="WaitForProgramCommand();" while="" (isize="" > 0)
    {
        u16 iData[32];
        Get32WordsFromCOMM(iData);
        iStatus = flashWrite(pAddress, iData);
        if (iStatus)
            break;
        pAddress += 32;
        iSize -= 32;
        UpdateWatchdog();    // Prevent timeout
    }

    SendFlashWriteResponse(iStatus);
    ResetMicro();
}
< /c_secstor_end;++i) >
審核編輯:郭婷
聲明:本文內(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)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7542

    瀏覽量

    151316
  • ROM
    ROM
    +關(guān)注

    關(guān)注

    4

    文章

    563

    瀏覽量

    85731
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1019

    瀏覽量

    81560
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何利用引導(dǎo)程序實(shí)現(xiàn)在程序內(nèi)編程IAP

    好的程序),需要外部電路輔助實(shí)現(xiàn),而IAP則是通過(guò)將Flash映射為兩個(gè)區(qū)域,一部分為用戶引導(dǎo)程序區(qū)BOOT,一部分為用戶程序,利用引導(dǎo)程序
    發(fā)表于 02-15 07:20

    STM32F10xxx閃存編程手冊(cè)

    的內(nèi)容。然而,IAP要求至少有一部分程序已經(jīng)使用ICP燒到閃存存儲(chǔ)器中。閃存接口是在AHB協(xié)議上實(shí)現(xiàn)了對(duì)指令和數(shù)據(jù)的訪問(wèn),它通過(guò)對(duì)存儲(chǔ)器的預(yù)
    發(fā)表于 09-26 06:18

    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次下載

    如何使用的CAN引導(dǎo)加載用戶應(yīng)用代碼MAXQ7665A-Ho

    and the modifications needed to support the user application code on the MAXQ7665A microcontroller. OverviewThe CAN bootloader en
    發(fā)表于 04-23 16:18 ?1105次閱讀
    如何使用的CAN引導(dǎo)加載用戶應(yīng)用代碼<b class='flag-5'>MAXQ7665</b>A-Ho

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

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

    在應(yīng)用編程MAXQ7665頁(yè)擦除的程序和數(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 ?1241次閱讀
    在應(yīng)用<b class='flag-5'>編程</b>的<b class='flag-5'>MAXQ7665</b><b class='flag-5'>頁(yè)</b>擦除的<b class='flag-5'>程序</b><b class='flag-5'>和數(shù)據(jù)</b><b class='flag-5'>閃存</b>-In-A

    在應(yīng)用編程MAXQ7665部門(mén)擦除程序和數(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 ?1052次閱讀
    在應(yīng)用<b class='flag-5'>編程</b>的<b class='flag-5'>MAXQ7665</b>部門(mén)擦除<b class='flag-5'>程序</b><b class='flag-5'>和數(shù)據(jù)</b><b class='flag-5'>閃存</b>-In-A

    MAXQ7665評(píng)估板快速入門(mén)

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

    具有單字擦除數(shù)據(jù)閃存MAXQ7665C 頁(yè)可擦除 (PE) 閃存的在應(yīng)用編程 (IAP)

    發(fā)表于 11-18 23:45 ?0次下載
    具有單字擦除<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>閃存</b>的 <b class='flag-5'>MAXQ7665</b>C <b class='flag-5'>頁(yè)</b>可擦除 (<b class='flag-5'>PE</b>) <b class='flag-5'>閃存</b>的在應(yīng)用<b class='flag-5'>編程</b> (<b class='flag-5'>IAP</b>)

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

    本應(yīng)用筆記介紹如何管理帶有扇形可擦除(SE)閃存MAXQ7665閃存微控制器(μC)中的內(nèi)部數(shù)據(jù)程序
    的頭像 發(fā)表于 02-20 11:05 ?709次閱讀
    <b class='flag-5'>MAXQ7665</b>扇區(qū)可擦除<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>

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

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

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

    本應(yīng)用筆記介紹如何管理帶有頁(yè)面擦除(PE閃存MAXQ7665閃存微控制器(μC)中的內(nèi)部數(shù)據(jù)程序
    的頭像 發(fā)表于 02-21 17:33 ?728次閱讀
    <b class='flag-5'>MAXQ7665</b><b class='flag-5'>尋</b><b class='flag-5'>頁(yè)</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)置實(shí)用程序ROM擦除/寫(xiě)入MAXQ7665微控制器(μC)中的程序和數(shù)據(jù)閃存。此信息僅適用于帶扇形可擦除(SE)
    的頭像 發(fā)表于 06-13 15:45 ?618次閱讀
    <b class='flag-5'>MAXQ7665</b>扇區(qū)可擦除<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>(<b class='flag-5'>IAP</b>)

    如何對(duì)STM8S和STM8A閃存程序存儲(chǔ)器和數(shù)據(jù)EEPROM進(jìn)行編程

    電子發(fā)燒友網(wǎng)站提供《如何對(duì)STM8S和STM8A閃存程序存儲(chǔ)器和數(shù)據(jù)EEPROM進(jìn)行編程.pdf》資料免費(fèi)下載
    發(fā)表于 10-07 16:05 ?2次下載
    如何對(duì)STM8S和STM8A<b class='flag-5'>閃存</b><b class='flag-5'>程序</b>存儲(chǔ)器<b class='flag-5'>和數(shù)據(jù)</b>EEPROM進(jìn)行<b class='flag-5'>編程</b>
    RM新时代网站-首页