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