本应用笔记探讨了高速微控制器片上存储器功能之外的存储器扩展用途。在 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 线路,则可以使用上述示例中演示的锁存库地址方案。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !