嵌入式调试实战:从ICS05PW命令集到现代调试器底层原理
1. 项目概述与调试器核心价值在嵌入式开发这条路上摸爬滚打了十几年我越来越觉得一个趁手的调试器其价值绝不亚于你手头最精良的示波器或逻辑分析仪。它不仅仅是“找BUG”的工具更是你与芯片内部世界直接对话的桥梁。今天要深入聊的就是一款在特定历史时期扮演过重要角色的开发工具——ICS05PW及其背后那一整套调试命令集。这套命令集虽然源自一款较早期的M68HC705系列微控制器仿真器但其设计思想和命令逻辑却深刻地影响了后来许多嵌入式调试工具的设计。理解它不仅能让你驾驭老旧的遗留项目更能让你洞悉现代IDE中那些图形化调试按钮背后的底层原理。简单来说ICS05PW是一个集成了软件模拟器和硬件在线调试功能的开发环境。它的核心价值在于为开发者提供了对目标MCU微控制器单元的完全控制权你可以让程序“指哪停哪”断点可以随时“窥探”内存和寄存器的状态内存/寄存器查看与修改甚至可以“伪造”外部世界的信号模拟端口输入、中断从而在受控的环境中精准地复现和定位那些只在特定条件下才会出现的诡异问题。这对于开发汽车电子、工业控制或早期消费电子等对可靠性要求极高的产品来说是必不可少的环节。接下来我将把这套命令集掰开揉碎从内存操作到断点控制结合我实际调试中的大量案例为你呈现一份详尽的实战指南。2. 调试环境搭建与核心命令分类解析在深入每个命令之前我们必须先建立起对调试器工作模式的整体认知。ICS05PW支持两种主要模式纯软件模拟Simulator和通过ICS05电路板进行的硬件在线调试In-Circuit Debugger。这两种模式下的命令行为有时会有微妙差异这是理解后续所有操作的前提。2.1 模拟器模式与硬件调试模式的区别这是使用ICS05PW时第一个需要厘清的概念。当你没有连接实际的硬件电路板ICS05 POD时调试器运行在纯软件模拟模式。此时MCU的所有行为包括端口引脚电平、中断信号都完全由软件模型和你的调试命令决定。例如INPUTA、INPUTB、IRQ这些命令可以自由地设置模拟输入值用来测试你的端口读取代码或中断服务例程。关键注意事项一旦通过POD n命令例如POD 1连接COM1口成功连接到实际的ICS05硬件板调试器的控制权就会部分移交。此时端口A、B的输入值以及IRQ引脚的状态将直接来自物理电路板。你再执行INPUTB 01这样的命令是无效的系统会忽略它因为真实硬件信号具有最高优先级。这个设计是为了确保调试环境能真实反映硬件状态避免模拟信号掩盖了实际的硬件连接问题。我早期就曾在这里踩过坑在连接硬件后依然试图用命令强制拉低某个输入引脚来测试结果程序毫无反应排查了半天才发现命令已被静默忽略。2.2 命令集的逻辑分类为了方便理解和记忆我们可以将ICS05PW的调试命令分为以下几大类这个分类方式也适用于理解其他调试器程序加载与符号管理类负责将编译好的机器码S-record文件和包含变量/函数地址信息的映射文件Map file加载到调试环境中建立源代码与机器码的关联。核心命令是LOAD和LOADMAP。执行控制类控制程序如何运行是调试的核心。包括单步执行STEP/SS、连续运行、运行到指定地址STEPTIL、复位RESET,RESETGO等。状态查看与修改类这是调试的“眼睛”和“手”。可以查看和修改内存MD,MM、CPU寄存器REG,PC,SP,N,Z等CCR位、端口寄存器PORTA,PORTB,INPUTS。断点管理类设置BR、清除NOBR、查看SHOWBREAKS程序暂停点是控制执行流程的关键。跟踪与日志类记录执行历史TRACE,SHOWTRACE和操作过程LOGFILE,SNAPSHOT用于分析复杂的、非确定性的问题。批处理与自动化类通过宏命令MACRO,MACROSTART,MACROEND将一系列调试操作脚本化提升重复性调试任务的效率。窗口与界面管理类控制调试器本身的界面布局如加载/保存桌面设置LOADDESK,SAVEDESK打开特定窗口STACK,SHOWCODE。理解这个分类框架后我们再深入每个具体命令时就能知其所在明其所用。3. 内存与寄存器的查看与修改实战调试的大部分时间其实都是在和内存、寄存器打交道。ICS05PW提供了直接而强大的命令来完成这些操作。3.1 内存查看MD/SHOW命令详解MD address或SHOW address命令用于从指定地址开始在内存窗口中显示内存内容。这个命令看似简单但有几个实战细节必须注意。命令格式与示例MD 0200 // 显示从地址0x0200开始的内存区域 SHOW 100 // 与MD命令完全相同执行后内存窗口会以十六进制和ASCII两种形式显示一片连续内存。显示的范围取决于内存窗口的大小。这里有一个非常重要的技巧ICS05PW的内存空间是分段的包括RAM、ROMEPROM、寄存器区等。在查看之前你必须清楚你要查看的地址属于哪个区域。例如对于M68HC705P9用户RAM可能从0x0080开始而复位向量在0x1FFE-0x1FFF。如果你MD 1FFE看到的是ROM中的内容通常是编译后固件的一部分。实操心得我习惯在调试初始化代码时先用MD命令查看一下关键数据区如0x0080开始的RAM和复位向量区确认芯片上电后的初始状态和程序入口是否正确。特别是在进行多次调试会话后RAM中可能残留上次运行的数据这有时会干扰对新程序行为的判断。此时一个干净的复位RESET或重新加载LOAD是必要的。3.2 内存修改MM命令的灵活运用MM命令是动态调试的利器它允许你直接修改内存内容。其语法比MD更丰富也更容易出错。基础用法MM 90 // 弹出“修改内存”对话框定位到地址0x90可交互式修改 MM 300 00 // 直接向地址0x300写入值0x00 MM 100 00 01 10 11 // 向地址0x100开始连续写入4个字节0x00, 0x01, 0x10, 0x11不带数据参数的MM address会打开一个图形对话框这对于不熟悉命令行或需要修改多个非连续地址时非常方便。而带数据参数的格式则适合在脚本宏中进行批量初始化。高级用法与类型指定MM.W 200 1234 // 以16位字Word模式向地址0x200写入0x1234高字节在0x200低字节在0x201 MM.L 400 12345678 // 以32位长字Long模式向地址0x400写入0x12345678.B、.W、.L后缀指定了操作的数据宽度这对于处理多字节数据如整型数、指针至关重要。务必注意目标MCU的字节序Endianness。M68HC05系列是大端序Big-Endian即高位字节存储在低地址。所以MM.W 200 1234执行后MD 200会显示12MD 201会显示34。如果理解错了字节序在修改作为指针使用的内存时会导致程序跑飞到完全错误的地方这种BUG极其隐蔽。严重警告MM命令可以修改任何可寻址的内存包括程序代码区ROM/EPROM。在软件模拟器中修改代码区可能立即生效因为模拟器内存是可写的。但在硬件调试模式下向ROM区域写入通常是无效的或者会导致不可预知的行为。最安全的做法是只修改RAM区和内存映射的寄存器区。在修改寄存器前务必查阅芯片数据手册确认该寄存器是否可写以及每个位的含义避免改变关键配置导致系统崩溃。3.3 寄存器操作程序计数器与状态标志位控制程序流离不开对程序计数器PC和条件码寄存器CCR的操作。设置程序计数器PCPC address命令能直接改变PC的值从而改变下一条要执行的指令地址。这是一个非常强大的功能但也要慎用。PC 0200 // 将PC设置为0x0200程序将从这里开始执行如果接下来运行应用场景跳过故障代码当某段初始化代码有问题导致死循环时你可以用MD或反汇编查看代码找到问题代码段之后的正确地址然后用PC命令跳过去继续调试后续逻辑。但这只是权宜之计用于临时验证其他部分功能。重复测试某函数假设一个处理函数入口在0x0300你可以先设置好测试数据和堆栈然后反复执行PC 0300和STEP或GO来测试该函数在不同输入下的表现。修改条件码CCR位CCR寄存器中的标志位如负标志N、零标志Z、进位标志C直接影响条件分支指令如BNE,BCS的执行。ICS05PW允许你单独设置或清除它们。N 1 // 设置负标志位N1 Z 0 // 清除零标志位Z0 C 1 // 设置进位标志位C1实战技巧这在测试条件分支的逻辑时非常有用。例如你有一段代码在计算结果为负N1时跳转到错误处理例程。你可以在执行到条件判断指令前手动用N 1设置负标志然后单步执行观察程序是否按预期跳转。这比通过复杂的计算来触发标志位要直接高效得多。4. 程序执行控制与断点设置的艺术让程序按照你的意愿运行、暂停是调试的基本功。ICS05PW提供了从单步到连续运行的多粒度控制。4.1 单步执行汇编级与源码级汇编级单步STEP/ST/TSTEP或其别名ST、T命令每次执行一条机器指令汇编指令。这是最精细的控制粒度。STEP // 执行当前PC指向的一条指令 ST 4 // 连续执行4条指令执行后所有窗口寄存器、内存、代码都会刷新显示指令执行后的新状态。这对于理解每条指令的具体作用、检查算法在汇编层面的实现是否正确至关重要。源码级单步SSSS命令是面向高级语言如C调试的。它每次执行一条源代码语句这条语句可能对应多条机器指令。SS // 执行当前源代码行 SS 5 // 连续执行5行源代码要使用SS命令必须提前通过LOADMAP命令加载包含调试信息的映射文件.MAP。这样调试器才能知道源代码行与机器码地址的对应关系。常见问题如果你加载了.S19文件但没有加载.MAP文件或者.MAP文件与.S19文件不匹配比如修改源码后重新编译但忘了重新加载SS命令可能无法工作或者步进的位置很奇怪。此时你需要检查并重新加载正确的文件对。4.2 连续执行与条件暂停GO命令虽然输入片段中未直接列出但它是调试器的核心命令之一让程序从当前PC开始全速运行直到遇到断点、发生错误或被用户手动停止通常通过工具栏按钮或快捷键。更高级的控制是STEPTIL address命令它让程序连续运行直到程序计数器PC达到指定的地址。这比设置断点更轻量适用于“快速运行到某个感兴趣的区域附近”的场景。例如你的主循环在地址0x0500你可以用STEPTIL 04F0让程序快速执行到循环开始前然后再进行精细的单步调试。4.3 断点BR/NOBR的深入使用断点是调试的“路标”让你能在关键位置拦截程序。设置断点BRBR 0123 // 在地址0x0123处设置一个执行断点 BR 0123 R // 在地址0x0123处设置一个“读”内存断点当该地址被读取时触发 BR 0123 W // 在地址0x0123处设置一个“写”内存断点当该地址被写入时触发 BR 0123 RW // 在地址0x0123处设置一个“读写”内存断点执行断点是最常用的。内存访问断点读/写则是调试内存数据损坏、变量被意外修改等棘手问题的终极武器。例如一个全局变量g_flag的地址是0x0080它总是莫名其妙地被改变。你可以使用BR 0080 W设置一个写断点。一旦有任何指令哪怕是你完全没想到的某个中断服务程序向0x0080写入数据程序会立刻暂停你就可以检查是谁、在什么情况下修改了它。清除断点NOBRNOBR // 清除所有断点 NOBR 0123 // 清除地址0x0123处的断点管理断点SHOWBREAKS使用SHOWBREAKS命令可以打开断点窗口以列表形式查看所有已设置的断点包括它们的地址和类型。在这里你通常也可以直接点击来启用/禁用或删除断点这比纯命令行更方便。实操心得与避坑指南断点数量限制早期的硬件调试器或仿真芯片其断点资源可能非常有限例如只有2-4个硬件断点。虽然软件模拟器可能支持更多但养成节约使用断点的习惯是好的。优先在函数入口、循环开始/结束、条件判断处设置。ROM中的断点在真正的硬件调试中在ROM只读存储器中设置执行断点依赖的是调试器提供的特殊机制如替换指令为软件断点指令SWI。这可能会修改目标内存的一个字节。在极少数对代码完整性有严苛要求的场景下需要注意。但在软件模拟器中这通常不是问题。断点与代码修改如果你在调试过程中使用MM命令修改了已设置断点的代码区域断点可能会失效或行为异常。最稳妥的做法是修改代码后重新设置断点。断点不触发如果设置了断点但程序运行后没有停下请检查a) 断点地址是否正确是绝对地址还是标签b) 程序是否真的执行到了该地址可能被条件分支跳过c) 在硬件调试时该地址是否在有效的、可执行的存储器范围内。5. 外设模拟与IO调试INPUTx, PORTx, IRQ嵌入式程序离不开与外部世界的交互调试这些交互是难点。ICS05PW的模拟器模式提供了强大的外设模拟功能。5.1 模拟输入端口INPUTA/INPUTBINPUTA value和INPUTB value命令用于在软件模拟器中为端口A和端口B设置一个模拟的输入值。当MCU的程序执行读取相应端口数据方向寄存器为输入方向的引脚时读到的就是这个模拟值。命令示例与原理INPUTB 01 // 将端口B的模拟输入值设置为0x01二进制0000 0001假设你的程序里有一行代码是读取端口B的数据寄存器PORTB以获取开关状态。在模拟器中你可以通过INPUTB命令来模拟某个开关被按下对应位为0或1取决于电路是上拉还是下拉而无需连接真实的硬件。重要限制再次强调这个命令仅在未连接ICS05硬件板纯软件模拟模式时有效。一旦用POD命令连接了真实硬件端口输入值将由物理电路决定此命令被禁用。这是为了确保仿真的真实性。5.2 查看模拟输入值INPUTSINPUTS命令用于显示当前为端口A和端口B设置的模拟输入值。同样在连接硬件后它显示的是从实际硬件读取到的值。INPUTS // 可能的输出 // Port A - AA // Port B - 01这个命令在编写和测试端口扫描、键盘矩阵等代码时非常有用可以实时确认你设置的模拟输入是否已被系统接收。5.3 设置输出端口PORTA/PORTBPORTA value和PORTB value命令用于设置端口A和端口B的输出锁存器的值。注意这里是“输出锁存器”。即使某个引脚被配置为输入方向其输出锁存器仍然可以写入只是这个值不会驱动到引脚上。当该引脚 later 被重新配置为输出时锁存器中的值会立即输出到引脚。与INPUT命令的对比INPUTx模拟外部世界给MCU输入引脚的信号。PORTx设置MCU内部输出锁存器的值是MCU要输出到引脚上的信号当引脚为输出模式时。在硬件调试中的应用当连接了ICS05板时PORTA FF命令会将值0xFF发送到实际的硬件端口A你可以用万用表或逻辑分析仪在板子的对应引脚上测量到这个高电平信号。这可以用来测试你的驱动代码是否正确或者直接控制外部设备如点亮LED。5.4 模拟中断信号IRQ/INTIRQ命令INT是其别名用于在模拟器中设置MCU的IRQ中断引脚的状态高电平1或低电平0。IRQ 0 // 将IRQ引脚模拟为低电平 INT 1 // 将IRQ引脚模拟为高电平中断触发方式中断是否实际触发不仅取决于IRQ引脚的电平还取决于MOR寄存器中的IRQ位配置以及CCR中的中断屏蔽位I。MOR寄存器配置了IRQ是电平触发还是边沿触发。IRQ命令设置的是电平状态。如果需要模拟一个边沿你需要先设置一个电平执行几条指令STEP再改变电平来产生跳变沿。硬件连接时的行为和INPUTx命令一样当连接真实硬件后IRQ命令失效引脚状态由硬件电路决定。调试中断服务程序ISR的典型流程确保全局中断使能CCR的I位为0且IRQ中断已配置好。在ISR的入口处设置一个断点BR ISR_Entry_Addr。使用IRQ 0假设低电平触发模拟中断信号。执行GO命令让程序运行。如果一切设置正确程序应在ISR入口断点处停下。此时你可以检查堆栈、寄存器并单步调试ISR。6. 文件加载、符号管理与自动化宏高效的调试离不开良好的工程管理和自动化。ICS05PW在这方面提供了基础但实用的支持。6.1 程序与符号文件的加载LOAD, LOADMAPLOAD filename命令用于加载Motorola S-record格式.S19的可执行文件。S-record文件包含了机器码和它们需要被加载到的内存地址。LOAD MYPROG.S19 LOAD MYPROG // 扩展名.S19可省略 LOAD // 弹出文件选择对话框列出当前目录下所有.S19文件加载后如果S-record文件中定义了复位向量通常位于ROM末尾调试器会自动将PC设置为复位向量指向的地址即程序的开始。LOADMAP filename命令用于加载映射文件.MAP。这个文件由编译器/汇编器生成包含了源代码中的符号函数名、变量名与其最终内存地址的对应关系。LOADMAP MYPROG.MAP加载映射文件后你将获得两大好处源码级调试可以在代码窗口中看到高级语言如C源代码并使用SS命令进行源码级单步。符号化查看在设置断点、查看内存时可以直接使用符号名而非绝对地址。例如你可以用BR main在main函数入口设断点用MD gCounter查看全局变量gCounter的内容这大大提升了调试的直观性。常见问题排查“符号未找到”或源码不对应这几乎总是因为.S19文件和.MAP文件不匹配。确保你加载的是同一次编译产生的文件。每次修改源代码并重新编译后都必须重新加载这两个文件。使用SHOWMAP命令可以列出当前已加载的映射文件中所有的符号及其地址用于验证符号是否正确加载。6.2 宏命令自动化调试任务MACRO, MACROSTART, MACROEND当需要重复执行一系列调试命令时例如每次测试前都需要初始化一段内存、设置几个断点、配置端口手动输入既繁琐又容易出错。宏命令就是来解决这个问题的。执行宏文件MACRO/SCRIPTMACRO filename命令用于执行一个宏文件.MAC。宏文件是一个纯文本文件里面每一行都是一条有效的ICS05PW调试命令。MACRO INIT.MAC // 执行名为INIT.MAC的宏文件你可以创建一个INIT.MAC文件内容如下REM --- 初始化调试环境 --- LOAD MYAPP.S19 LOADMAP MYAPP.MAP BR main BR handle_interrupt PC RESET_VECTOR REM --- 初始化完成 ---这样每次启动调试会话只需执行一次MACRO INIT.MAC就能自动完成所有准备工作。录制宏MACROSTART, MACROEND如果你不确定宏文件该怎么写或者想快速记录一系列操作可以使用录制功能。MACROSTART TEST.MAC // 开始录制所有后续命令将保存到TEST.MAC INPUTA 55 INPUTB AA STEP 10 REG MACROEND // 停止录制并关闭文件录制完成后TEST.MAC文件中就记录了INPUTA 55、INPUTB AA、STEP 10和REG这四条命令。以后执行MACRO TEST.MAC就能重现这些操作。宏文件中的特殊命令REM text在宏文件中添加注释执行时会显示在状态窗口帮助理解当前步骤。WAIT在宏文件中插入暂停等待用户按键。这在需要人工干预的自动化流程中很有用。嵌套与深度宏文件可以嵌套调用其他宏文件使用MACRO命令最大深度为16层。这允许你构建模块化的调试脚本。7. 高级调试技巧与实战问题排查掌握了基本命令后一些高级功能和组合拳能让你在解决复杂问题时如虎添翼。7.1 跟踪执行历史TRACE, SHOWTRACE当程序行为异常但又不易通过断点捕捉时比如某处内存被意外写入但不知道是哪条指令干的执行跟踪Trace功能就派上用场了。启用与查看跟踪TRACE // 第一次执行启用跟踪再次执行则禁用跟踪 GO // 让程序运行一段 TRACE // 停止跟踪可选 SHOWTRACE // 打开跟踪窗口查看最近执行的1024条指令历史TRACE命令会开启一个环形缓冲区记录每条被执行指令的地址、操作码以及可能的相关寄存器状态。SHOWTRACE则以反汇编形式展示这些记录。这对于分析崩溃前的程序流、理解中断嵌套顺序、查找跑飞原因极其有效。注意事项开启跟踪会显著降低模拟器的执行速度因为每条指令都需要记录信息。因此通常只在需要捕获问题的那一小段代码执行期间开启它。7.2 堆栈分析STACK对于使用子程序调用、中断的复杂程序堆栈的管理至关重要。堆栈溢出是导致系统崩溃的常见原因。STACK // 打开堆栈窗口堆栈窗口会显示当前栈指针SP的位置以及从栈顶开始向下的一片内存区域的内容。你可以看到函数返回地址、保存的寄存器、局部变量等。结合单步执行观察SP的变化和堆栈内容可以验证函数调用约定是否正确中断现场保存是否完整。实战案例我曾调试一个系统偶尔会死机。通过STACK命令观察发现正常运行时SP在一个合理范围内波动而死机前SP的值会逐渐接近RAM的边界如0x00FF最终指向了非RAM区域如0x0100导致后续的PUSH或JSR操作破坏其他数据。这提示存在递归调用缺少退出条件或中断中进行了过深的函数调用。7.3 日志记录LOGFILE, SNAPSHOT将调试过程记录下来对于团队协作、问题回溯或生成测试报告非常有用。命令日志LOGFILE/LFLF DEBUG.LOG R // 开始记录日志写入DEBUG.LOG文件覆盖模式R LF DEBUG.LOG A // 开始记录日志追加到DEBUG.LOG文件A LF // 停止记录并关闭日志文件开启日志后你在状态窗口输入的所有命令以及系统的回显信息都会被同步记录到指定的文件中。这相当于一份完整的调试操作记录。窗口快照SNAPSHOTSNAPSHOT命令会将当前所有调试器窗口的文本内容如寄存器值、内存片段、代码位置追加到已打开的日志文件中。这比手动截屏更利于文本检索和对比。你可以在关键检查点如断点命中时、异常发生前执行SNAPSHOT记录下系统的完整状态。7.4 常见问题排查速查表下表总结了一些典型的调试问题现象、可能原因及排查命令问题现象可能原因排查步骤与命令程序加载后不运行1. 复位向量错误2. 加载地址不对1.MD 1FFE查看复位向量值假设地址2.PC vector_value手动设置PC后STEP断点无法触发1. 地址错误2. 代码未执行到该处3. 断点资源冲突硬件1.SHOWBREAKS确认断点地址2. 在断点前设置临时断点或使用STEPTIL3. 减少断点数量或用NOBR清除不必要断点变量值异常改变1. 指针越界2. 中断或任务冲突3. 堆栈溢出破坏1. 在变量地址设写断点(BR addr W)2. 检查中断使能和优先级3. 使用STACK命令监控SP中断不响应1. 全局中断未使能 (I1)2. 特定中断未使能/标志未清除3. IRQ引脚电平/边沿不对1.REG查看CCR的I位2. 查看相关外设寄存器3. 模拟时用IRQ命令硬件时测量引脚单步执行时程序“跑飞”1. 堆栈错误导致返回地址错误2. 程序修改了PC值3. 内存访问越界1. 单步观察SP和堆栈内容 (STACK)2. 检查有无JMP,RTS等指令3. 开启TRACE查看执行流源码与汇编不对应1. .MAP文件未加载或版本不匹配2. 优化级别过高1. 确认LOADMAP了正确文件用SHOWMAP检查符号2. 尝试低优化级别编译8. 连接真实硬件POD命令与编程器最终软件需要在真实硬件上运行。ICS05PW通过POD命令和PROGRAM命令桥接软件仿真与硬件世界。8.1 连接硬件板PODPOD n命令用于指定通过哪个串口COM1-COM8连接ICS05硬件调试板。POD 1 // 尝试连接COM1口上的ICS05板连接成功后调试器会返回硬件板上端口和引脚的状态以及硬件版本号。例如Port A - 80 Port B - 00 Reset - 1 IRQ - 1 Version - 01这证实了通信链路已建立。从此INPUTA/B、IRQ等模拟命令失效所有IO状态来自真实硬件。你可以用PORTA/B命令控制板载输出用REG、MD等命令实时查看MCU内部状态进行真正的在线调试。8.2 使用编程器PROGRAMPROGRAM命令会启动一个独立的编程器界面用于对目标MCU如M68HC705P9的EPROM进行编程、验证、擦除检查等操作。这对于将调试好的代码烧录到芯片中至关重要。进入编程器后会有一个选择窗口Pick Window提供一系列命令BC(Blank Check)检查芯片是否为空所有字节为0xFF。PE(Program EPROM only)仅编程EPROM区域。PM(Program MOR byte)编程MOR模式选择字节这决定了MCU的工作模式如时钟源、内存保护等非常重要设置错误可能导致芯片锁死或无法运行。PB(Program Both)先编程EPROM再编程MOR字节。VE(Verify)验证芯片中的内容与下载文件是否一致。SD(Specify Download File)指定要烧录的.S19文件。QU(Quit)退出编程器返回模拟器。烧录实战流程在模拟器中调试代码至稳定。使用PROGRAM命令进入编程器。用SD命令选择要烧录的.S19文件。执行BC确认芯片为空。执行PB进行完整编程EPROMMOR。执行VE进行验证。验证通过后QUIT退出。断开编程器将芯片置于目标板上电运行。关键警告MOR字节的编程需要格外小心。必须根据你的硬件设计例如使用的是外部晶体还是内部RC振荡器以及应用需求查阅芯片数据手册计算出正确的MOR值。一旦编程错误可能需要特殊的擦除流程才能恢复。