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