本應(yīng)用筆記探討了高速微控制器片上存儲器功能之外的存儲器擴展用途。在 64kB 內(nèi)存映射之外檢查組交換。本說明重點討論了無 ROM程序擴展、簡單頁面擴展和庫切換時序。添加了程序示例以闡明此信息。
概述
高速微控制器系列的所有成員都設(shè)計用于直接處理高達 64kB 的 程序和數(shù)據(jù)存儲器。但是,有時應(yīng)用程序需要比現(xiàn)在更多的內(nèi)存 可在片上使用,也可通過使用 64kB 內(nèi)存映射。高速微控制器 該系列包括許多功能,可輕松解決大于 64kB. 位可尋址 I/O 端口允許對控制線進行單指令修改,可使用 在多個內(nèi)存設(shè)備之間切換或?qū)ず?。ROMSIZE功能允許輕松記憶 調(diào)整具有片上存儲器的設(shè)備的大小。
本應(yīng)用筆記討論了程序存儲器和數(shù)據(jù)存儲器的擴展。它細分為三大類:將無ROM器件的程序存儲器擴展到64kB以上,使用ROMsize功能將片上程序存儲器擴展到64kB以上,以及擴展數(shù)據(jù)存儲器。它首先介紹了銀行切換和軟件支持技術(shù)。
銀行轉(zhuǎn)換理論
超過 64kB 的擴展內(nèi)存訪問最常通過組交換完成。此技術(shù)使用一個或多個通用 I/O 行作為解碼行來尋址更多內(nèi)存。如果使用單個大容量存儲設(shè)備,則附加信號可直接用作地址線。如果使用幾個較小容量的存儲器器件,則可以將信號用作芯片選擇。由解碼邏輯切換的基本內(nèi)存單位稱為庫或頁面。例如,如果使用 I/O 線在兩個 64kB EPROM 之間切換,則內(nèi)存將包含兩個 64kB 頁。
使用分頁內(nèi)存方案的最大障礙可能是中斷向量表的位置。在大多數(shù)設(shè)備操作期間,軟件可以在頁面之間執(zhí)行有序切換。但是,當(dāng)發(fā)生中斷時,設(shè)備將立即跳轉(zhuǎn)到適當(dāng)?shù)氖噶康刂?,低?070h。此時軟件無法控制組配置,設(shè)備將嘗試跳到當(dāng)前組的低端以查找向量表。
有兩種方法可以解決此問題。最簡單的方法是在每個頁面的低端復(fù)制中斷向量表。這樣,無論當(dāng)前內(nèi)存配置如何,中斷向量表將始終可用。但是,這種方法有許多缺點。這是對程序存儲器的低效使用,因為中斷向量表(大約 120 字節(jié))和中斷服務(wù)例程必須在每一頁上復(fù)制。此外,某些編譯器不直接 支持跨頁面復(fù)制數(shù)據(jù),使程序生成復(fù)雜化。更有效的方法是保留內(nèi)存的較低部分,其中包括中斷向量表,以便不對其進行分頁。這個“公共區(qū)域”可以從任何擴展的銀行直接訪問,而無需修改 銀行選擇機制。每當(dāng)處理器在此公共區(qū)域執(zhí)行代碼提取時,硬件都會強制內(nèi)存訪問此區(qū)域,而不管當(dāng)前頁面如何。精心設(shè)計將允許保存以前的銀行地址,以便在公共存儲器中的操作完成時設(shè)備將自動返回。通過將中斷服務(wù)例程與中斷向量表一起放置在位于內(nèi)存低端的公共區(qū)域中,可以減少中斷服務(wù)例程的執(zhí)行時間。本應(yīng)用筆記中的大多數(shù)示例將存儲器的下部區(qū)域指定為公共區(qū)域。
內(nèi)存擴展的軟件支持
要使分頁內(nèi)存方案正常工作,必須將代碼分成頁,并為軟件提供在頁之間切換的方法。切換頁面時必須小心,以免干擾指令流。對此有兩種主要方法。首先是“即時”切換頁面。下面的簡單頁面擴展示例中演示了這一點。此方法使程序執(zhí)行直接從一個展開的頁面跳轉(zhuǎn)到另一個展開的頁面。必須謹慎行事,以便銀行切換將發(fā)生在與下一個銀行中下一條指令的開始相對應(yīng)的位置。未能正確對齊指令可能會導(dǎo)致下一次操作碼提取發(fā)生在多字節(jié)指令的中間,從而導(dǎo)致完全失去程序控制。
更好的方法是從不受更改影響的位置更改銀行。這通常是內(nèi)存中的常見或未分頁位置,例如中斷向量表所在的保留位置。對較低內(nèi)存的任何訪問都會通過硬件自動切換到公共內(nèi)存。這消除了上述簡單頁面擴展的代碼對齊困難,并且無需在每個內(nèi)存頁面上復(fù)制中斷向量和/或中斷服務(wù)例程。
許多編譯器和鏈接器直接支持庫切換,其中許多都包含用于頁面切換的庫函數(shù)。編譯器隨附的文檔將提供有關(guān)其擴展內(nèi)存支持的信息。匯編語言支持的簡要示例列在下面的一些示例之后。
如果將多個頁面編程到單個EPROM中,則必須小心謹慎。許多EPROM程序員使用文件中指定的地址計算程序偏移,這可能導(dǎo)致代碼放錯位置。例如,假設(shè)分頁方案涉及從 8000h 到 FFFFh 映射到程序空間的代碼頁。如果設(shè)計人員希望在EPROM中定位10000h的頁面,他或她通常會在將文件加載到編程器時在EPROM中選擇10000h的偏移量。但是,十六進制文件中的所有地址都從 8000h 開始,設(shè)備程序員會將其添加到 10000h。這會無意中將頁面置于 18000h,這不是預(yù)期的結(jié)果。各種器件編程器以不同的方式實現(xiàn)偏移,建議設(shè)計人員查閱器件編程器隨附的文檔以獲得最佳解決方案。
無 ROM 程序擴展
由于沒有片內(nèi)程序存儲器,DS80C320的程序存儲器擴展相對簡單。這里介紹了三種擴展程序內(nèi)存的方法。第一種涉及通過復(fù)制向量表和重疊頁面來擴展相對少量的內(nèi)存。第二個示例使用公共庫作為中斷向量和中斷服務(wù)例程,并使用多個通用 I/O 行對內(nèi)存進行頁面存儲。最后一個示例使用鎖存地址來尋址大量內(nèi)存,而無需使用其他通用 I/O 行。
簡單的頁面擴展
此示例顯示了添加相對少量程序內(nèi)存的最簡單方法。單個通用I/O線用于提供高達128kB的程序存儲器。使用單個27C010 128k字節(jié)EPROM,并分為兩個重疊的內(nèi)存塊。一條通用 I/O 線路(在本例中為 P1.0)用于提供組開關(guān)控制。它由 74F74 鎖存,該 1F<> 時鐘位于 /PSEN 信號的上升沿。這會將組開關(guān)與內(nèi)存周期同步??梢酝茢啻朔椒?,通過使用額外的 I/O 行來添加更多的內(nèi)存。此示例的硬件配置如圖 <> 所示。
圖1.簡單的頁面擴展示例硬件。
然而,硬件的簡單性是以一些軟件復(fù)雜性為代價的。此示例使用兩個庫,這兩個庫都包含內(nèi)存下部的中斷向量表。這是必要的,因為當(dāng)設(shè)備復(fù)位時,P1.0 將很高,強制復(fù)位矢量地址為 10000h。此外,從任一頁面執(zhí)行代碼時都可能發(fā)生中斷,因此中斷向量必須在沒有軟件干預(yù)的情況下可用。中斷向量表從位置 115h 到 00000h 和 00070h 到 10000h 消耗大約 10070 個字節(jié)。如果每個頁面上都需要重復(fù)中斷服務(wù)例程,則可能需要額外的空間。
圖2.簡單的頁面擴展示例內(nèi)存映射。
當(dāng)頁面切換保持在最低限度(即執(zhí)行直接運行代碼)時,此方法最有效。如果中斷例程(不僅僅是向量)足夠小,可以在每個頁面上復(fù)制,則代碼效率將得到提高。使用 MOVC 指令訪問的數(shù)據(jù)表或字符串應(yīng)與指令位于同一頁面上。
此方法直接修改頁面,而不修改程序計數(shù)器。這意味著新頁面中的起始位置在新頁面中的銀行切換例程末尾將相同。因此,頁面之間的指令位置至關(guān)重要。圖3顯示了MOV P1、A指令和組選擇信號之間的時序關(guān)系。在此示例中,MOV 指令位于位置 5A10h,新頁面上的第一條指令位于 5A14h。
控制組選擇的端口引腳將在MOV指令后的第一個周期內(nèi)發(fā)生變化。在執(zhí)行第二個NOP期間,74F74鎖存器使新的組選擇在預(yù)取時有效。新頁面上的第一條指令必須位于第二個 NOP 之后的地址。
還有其他修改端口引腳的方法,該方案將使用 2 個周期指令(如 MOV 直接、直接)和 1 個周期指令(如 SETB 位)。銀行轉(zhuǎn)換指令只有兩個要求。新頁面上的第一條指令必須位于第二個 NOP 之后的地址。此外,執(zhí)行 MOV 指令的指令不得是 MOVX。MOVX 指令時序因拉伸周期而異,可能會干擾指令流。
圖3.銀行切換時序圖。
使用 I/O 的公用頁擴展
以下兩個示例使用公共塊方法來處理中斷向量放置問題。這樣可以縮短中斷服務(wù)時間,并簡化代碼構(gòu)造。這兩個示例都采用分頁方案,每個分頁 16 頁,每頁 32kB。第 0 頁(映射到 0000h 到 7FFFh)是公共區(qū)域,包含中斷向量表和中斷服務(wù)例程。地址行 A15 確定是尋址公共塊還是 15 個展開頁面中的一個。
此示例說明如何使用端口 512 或 0 上的通用 I/1 線路作為組交換控制來尋址高達 3kB 的 ROM。Bank 0 是從 32 到 0FFFh 的單個 7kB 頁面。此公共區(qū)域?qū)袛嘞蛄亢统S玫淖永?。擴展內(nèi)存將包含在從 15h 到 FFFFh 的 32 頁 8000kB 中。 組控制由 4 個通用 I/O 引腳提供。內(nèi)存映射如圖 4 所示。
圖4.公共頁擴展內(nèi)存示例內(nèi)存映射。
硬件配置如圖 5 所示。組控制由 P1.0-3 提供,由 4 個 AND 門解碼,僅需一個 IC 封裝。當(dāng) A15 較低時,設(shè)備被迫僅訪問較低的 32kB 內(nèi)存。這樣就消除了在內(nèi)存不足的情況下訪問中斷向量表時軟件干預(yù)的需要。此示例使用 27C040 512KB EPROM。
圖5.DS80C320擴展存儲器硬件配置示例。
以下軟件示例顯示了一個匯編語言例程,用于使用 I/O 行跳轉(zhuǎn)到任何庫中的新位置,如圖 5 所示。在調(diào)用銀行交換機子例程之前,軟件會將新地址和銀行號推送到堆棧上。然后,它調(diào)用一個子例程,該子例程從堆棧中彈出新的銀行地址并將其放置在 P1.0-3 上。然后修改堆棧,以便后續(xù)的 RET 指令將返回到新的程序位置。這是在匯編代碼中實現(xiàn)庫切換的多種可能方法之一的簡單演示。
使用鎖存數(shù)據(jù)的公共頁面擴展
上述設(shè)計的一個缺點是它需要 I/O 線路作為組控制。某些 I/O 密集型應(yīng)用程序可能無法為組交換騰出端口引腳。以下示例使用萊迪思半導(dǎo)體GAL26V12可編程邏輯器件(PLD)鎖存組選擇信號,而不是使用專用I/O引腳。此方法使用與上一個示例相同的內(nèi)存映射,但無法訪問從 FFE0h 到 FFFFh 的數(shù)據(jù)內(nèi)存。這 32 個字節(jié)無法訪問,因為 A5 到 A0 未解碼,允許使用更小、成本更低的 PLD。解碼更多的地址行將減少無法訪問的數(shù)據(jù)存儲器的數(shù)量,但需要更復(fù)雜的解碼機制。
GAL26V12 基于寫入 MOVX 數(shù)據(jù)存儲器執(zhí)行組切換功能。從FFE0h到FFFFh的任何數(shù)據(jù)存儲器寫入都會被解碼,寫入該地址的數(shù)據(jù)的低四位用于配置組開關(guān)選擇線。硬件配置如圖 6 所示。
PLD 的源文件如圖所示。它掃描所選范圍內(nèi)的任何地址,并將數(shù)據(jù)的下半字節(jié)鎖定到存儲設(shè)備的A15-A18上。尋址 80000h 之間的位置將暫時清除庫選擇行,強制 EPROM 從組 0 (0000h-7FFFh) 讀取。一旦下半部分存儲器操作完成,對上半部分存儲器(8000h-FFFFh)的訪問將自動返回到前一個組,因為組地址仍鎖在PLD的寄存器輸出中。
雖然各種PLD都適合此應(yīng)用,但任何使用的器件都必須在上電時將其輸出復(fù)位至0。這是必要的,因為在上電時,器件必須能夠訪問位于組 0000 中 0h 處的復(fù)位矢量。選擇PLD時,設(shè)計人員應(yīng)注意,許多標(biāo)準(zhǔn)可編程邏輯器件的設(shè)計使其輸出在復(fù)位時變?yōu)楦唠娖健?/p>
圖6.DS80C320鎖存地址存儲器硬件示例
以下軟件示例顯示了一個匯編語言例程,該例程使用鎖存數(shù)據(jù)跳轉(zhuǎn)到任何庫中的新位置,如圖 6 所示。在調(diào)用銀行交換機子例程之前,軟件會將新地址和銀行號推送到堆棧上。然后,它調(diào)用一個彈出新銀行地址的子例程 從堆棧中寫出并將其寫出到位置 FFFFh,在那里它被鎖定為新的銀行地址。然后修改堆棧,以便后續(xù)的 RET 指令將返回到新的程序位置。
使用 ROMSIZE 功能
ROMSIZE功能允許軟件動態(tài)重新配置程序存儲器大小,允許部分程序存儲器在片內(nèi)和片外之間切換。它提供了一種將程序存儲器增加到64kB和片上存儲器的簡單方法。此外,它還簡化了為外部可編程存儲器(如閃存、EEPROM 或非易失性 SRAM (NV SRAM))構(gòu)建引導(dǎo)加載程序的任務(wù)。
使用ROMSIZE功能非常簡單。位 RMS2、RMS1、RMS0 (ROMSIZE.2-0) 選擇片上存儲器的最大數(shù)量。ROMSIZE 選擇位受定時訪問保護,以確保最大的軟件可靠性。超出 ROMSIZE 寄存器定義范圍的任何程序存儲器訪問都將通過端口 0 和 2 自動從外部獲取。在具有 ROMSIZE 功能的設(shè)備上執(zhí)行外部代碼獲取的方式與在高速微控制器系列的所有成員上執(zhí)行的方式相同。提醒設(shè)計人員,如果端口 0 和 2 將用于外部存儲器訪問,則不應(yīng)將它們用作通用 I/O 端口。
在跳轉(zhuǎn)到新地址范圍之前,修改 ROMSIZE 寄存器后必須有 2 個機器周期延遲,例如執(zhí)行 2 個 NOP 指令。在此操作期間必須禁用中斷,因為在更改內(nèi)存映射期間跳轉(zhuǎn)到中斷向量可能會導(dǎo)致不穩(wěn)定的結(jié)果。重新配置片上存儲器量的步驟如下:
跳轉(zhuǎn)到程序內(nèi)存中不受更改影響的位置
通過清除 EA 位來禁用中斷 (IE.7)
將 AAh 寫入定時訪問寄存器 (TA;C7h)
將 55 小時寫入定時訪問寄存器 (TA;C7h)
修改 ROM 大小選擇位 (RMS2-0)
延遲 2 個機器周期(2 個 NOP 指令)
通過設(shè)置 EA 位 (IE.7) 啟用中斷
使用 ROMSIZE 功能在片上和片外存儲器之間切換時,有許多軟件注意事項。ROM尺寸選擇寄存器的修改必須從程序存儲器位置進行,該位置在片上存儲器配置之前和之后都有效。組裝或編譯程序時必須小心,以便所有模塊都位于正確的起始地址,包括中斷向量表。
如果選擇0kB片上存儲器選項,則必須采取額外的預(yù)防措施。將較低的1kB程序存儲器從片內(nèi)切換到片外時,有必要在片外存儲器中復(fù)制中斷向量表。通常,應(yīng)用會發(fā)現(xiàn)將片上存儲器減少不小于1kB是最有用的。這將最大化可尋址的外部存儲器范圍,同時將中斷向量保持在片上。當(dāng)片上存儲器僅用作引導(dǎo)加載程序時,0kB選項最有用。
通過 ROMSIZE 功能將內(nèi)存擴展到 64kB 以上
與ROMsize功能一起尋址超過64kB的外部存儲器與ROMless方法類似。主要區(qū)別在于,ROMSIZE特性允許設(shè)計人員使用片上程序存儲器作為“公共”模塊。這簡化了外部硬件的構(gòu)造,因為公共塊存儲器信號(示例中的A15信號)不必解碼。
使用ROMSIZE功能進行設(shè)計的關(guān)鍵是將片上存儲器以最有效的存儲器利用率和最簡單的解碼方法集成到存儲器映射中。這個問題有很多方法,但這里只介紹一種。本示例使用 16kB 片上存儲器,外加位于 48C27 040kB EPROM 中的 512 個 400kB 擴展存儲器。這提供了<>kB的總程序內(nèi)存。中斷向量和服務(wù)例程包含在片上存儲器中,以便快速訪問。
圖7所示為一種與集成87kB片內(nèi)EPROM的DS520C16配合使用的存儲器圖。請注意,不使用每個外部頁面上從 0000h 到 3FFFh 的程序內(nèi)存。這大大簡化了存儲器解碼的設(shè)計,不需要外部邏輯,也少了一條I/O線。圖 8 顯示了如何使用三條 I/O 線直接解碼器件的上部地址線。此配置的軟件類似于前面示例中介紹的軟件。
也可以將 ROMSIZE 功能與 MOVX 總線上的鎖存銀行地址結(jié)合使用。與無ROM示例類似,此方法不需要專用的I/O引腳進行組切換。由于片上程序存儲器的使用允許更簡單的解碼電路,因此可以使用更便宜的PLD。
圖7.ROMSIZE 功能通用頁擴展內(nèi)存映射。
圖8.ROMSIZE 具有公共頁 I/O 擴展功能。
擴展微控制器使用的數(shù)據(jù)存儲器量是最簡單的存儲器擴展形式。由于不可能干擾程序執(zhí)行,因此時間安排并不那么重要。通用I/O線可以直接連接到存儲設(shè)備的地址線或芯片使能。在內(nèi)存操作之前,可以直接修改相應(yīng)的端口引腳以訪問正確的頁面。如果應(yīng)用程序需要所有可用的 I/O 線路,則可以使用上述示例中演示的鎖存庫地址方案。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7933瀏覽量
154111 -
寄存器
+關(guān)注
關(guān)注
31文章
5430瀏覽量
123964 -
存儲器
+關(guān)注
關(guān)注
38文章
7643瀏覽量
166859
發(fā)布評論請先 登錄
NuMicro M2351系列微控制器的安全特色與應(yīng)用
從高速微控制器系列向超高速閃存微控制器的升級
從高速微控制器系列向超高速閃存微控制器的升級
如何對微控制器進行省電管理
什么是微控制器?如何編程微控制器?
HT32微控制器的嵌入式Flash內(nèi)存來模擬EEPROM的軟件方法

AN4803 在STM32微控制器上使用IBIS高速SI仿真和使用HyperLynx-SI進行板級仿真

使用超高速閃存微控制器實現(xiàn)快速內(nèi)存傳輸

評論