找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4654|回复: 4
收起左侧

自制ROM-Monitor仿真STC8A8K64S4A12(IAR平台)

[复制链接]
ID:351097 发表于 2020-3-14 17:01 | 显示全部楼层 |阅读模式
本帖最后由 没有你 于 2020-3-24 15:30 编辑

    之前发过帖子介绍如何在IAR建立STC8A8K64S4A12单片机工程,详情可以查看http://www.51hei.com/bbs/dpj-168481-1.html。虽然可以在IAR平台正常编译STC8A8K64S4A12工程,但是没有基于IAR平台的STC单片机的硬件在线调试工具。IAR平台有一个软件仿真工具simulator,这个工具很强大,一般被用来验证程序代码的逻辑功能。但由于是软件仿真,终究没法体现硬件的真实状态,比如变量存储地址等信息。STC官方针对keil平台有一个类似ROM-Monitor的调试工具:STC Monitor-51,但是无法在IAR平台使用,的确有点遗憾。自己花了点时间,仔细研究了一些IAR官方提供的官方资料,经过多次修改调试,总算搞出适配STC8A8K64S4A12单片的ROM-Monitor调试工具。有了ROM-Monitor调试工具,在IAR平台也能愉快玩耍STC8A单片机了。                                                                                                                                       一、ROM-Monitor简介。   
    ROM-Monitor是一种在线调试工具,利用单片机构成下位机和上位机进行通信来实现程序调试。使用时,需要先将ROM-Monitor固件烧录到单片机里面,这样单片机就成为下位机,然后将单片机连接PC上位机。在单片机和上位机的通信过程中,上位机首先会识别ROM-Monitor固件的设备,然后将需要调试的代码传到下位机。对于下位机来讲,就是执行的应用程序的下载。完成后,下位机就按照上位机的调试指令进行操作,调试指令有全速运行、单步、断点设置和暂停等。只要单片机拥有串口,并且支持IAP,基本上就可以用ROM-Monitor调试。但是ROM-Monitor也有缺点,比如需要占用单片机的程序空间和串口资源。
二、ROM-Monitor的使用条件。
    本次基于STC8A8K64S4A12单片机的ROM-Monitor所占资源如下所示:
    1、串口1(P3_0、P3_1)
    2、4K程序空间(0x0000-0x0FFF)
    3、XDATA:128字节(0x0000-0x0080)
    串口1主要是和IAR上位机通信用的,另外用到了串口中断,所以在调试时,不要用到串口1的任何资源,不要关闭串口中断和总中断。ROM-Monitor占用4K的程序空间,地址从0x0000-0x0FFF。所以应用程序代码起始地址要设定从0x1000开始。另外,应用程序代码不能往任何中断向量地址写代码,也就是说无法调试硬件中断,只能用查询方式判断中断标志位来调试中断。    ROM-Monitor占用128字节的xdata的RAM空间,主要是用来保护和恢复应用程序现场的。每次上位机发数据给下位机,都会触发串口1中断,在中断处理中,会保存应用程序的PSW、DPH和DPL等寄存器内容,然后将内部ram地址0x00-0x80的内容和xdata地址0x0000-0x0080中内容做交换,最后跳转到ROM-Monitor主程序,执行上位机的指令操作。等到完成上位机的指令操作后,下位机会再次将内部ram地址0x00-0x80的内容和xdata地址0x0000-0x0080中内容做交换,还原应用程序的PSW、DPH、DPL等寄存器内容,最后通过中断返回到应用程序。
    如果没有指定变量存放地址,每次上电单片机自动分配给变量的RAM地址都是不一样的。可能有人会担心单片机可能会把xdata的0x0000-0x0080这个地址分配其他变量使用,那岂不是会破坏ROM-Monitor的正常运行吗?其实这个担心是多余的,因为ROM-Monitor指定在xdata的0x0000地址申请一个占128个字节的大数组全局变量,而且单片机上电首先会执行ROM-Monitor程序,所以应用程序是无法在xdata的0x0000-0x0080申请其他变量的。

   ROM-Monitor设置断点是软件断点,理论上可以设置很多个断点。但是,实际上不要设置太多断点,太多断点会影响调试的效率,一般设置1-10个断点为宜。另外,不要在同一个函数设置多个断点,可能会导致错误的发生。如果要调试一个函数,只需要在函数里面设一个断点,等到程序执行到断点处,再单步调试即可。
三、IAR平的debugger功能
    IAR平台需要通过ddf后缀的硬件描述文件来识别单片机的所有寄存器地址,硬件描述文就是芯片的说明书。编写和测试STC8A8K64S12.ddf文件花了我不少时间,纯手打,眼力校验,差点就吐了。
    ROM-Monitor支持存储读写功能,调试过程中,IAR都会实时更新存储器的内容。如下图所示
读取内部资源.JPG

    在菜单栏view中,选择memory,就可以调出memory页面。通过ROM-Monitor,IAR可以读写全部ROM地址和RAM地址的内容。memory总共划分成6个页面,即iData、xData、sfr、code、Data和pData。以STC8A8K64S12单片机为例,其中iData表示内部ram空间0x00-0xff的内容,xData表示外部ram空间0x0000-0x1fff的内容,sfr表示位于内部ram从0x80-0xff寄存器的内容,code表示内部rom空间0x0000-0xffff的内容,Data表示内部ram从0x00-0x7f的内容,pData表示外部ram空间0x0000-0x00ff的内容。比如切换到code页面,可以清楚查看ROM-Monitor和应用程序的存储地址和内容,其中ROM-Monitor使用地址0x0000-0x0fff,禁止修改这个区域的任何数据,否则会损坏ROM-Monitor固件。由于全部存储都已经可视化,我们可以很方便地做一些存储的测试实验,比如下图测试写RAM空间:
ram写入.JPG

    在xdata指定一个起始地址为0x0400的数组,数组长度为100个字节,然后依次为数组从100-0赋值。xdata页面可以清楚地显示数组的地址也是从0x0400开始,数值也是完全对应的,数值显示格式是十六进制的。测试写ROM空间也是可以直接通过这种方式验证的,非常方便和实用。下面介绍一下寄存器的读写功能。
    寄存器的查看可以通过sfr页面查看位于0x80-0xff的寄存器地址和内容,如下图所示:
sfr.JPG

    不过这种方式要自己根据地址去查找对应寄存器名称,很不方便。IAR提供一种查看寄存器的方式,通过读取ddf硬件描述文件将寄存器的名字和地址对应起来,罗列在栏目中,比较直观。在菜单栏view中,选择registers,就可以调出register页面。如下图所示:
寄存器.JPG

    IAR允许同时打开四个registers栏目,每个栏目显示不同功能类寄存器组的内容,如果要切换显示其他寄存器,可以右键选择要切换的寄存器,如下图所示:
寄存器.png

    基本上STC8A8K64S12所有的寄存器都可以找到,寄存器的名称都是严格按照STC8的datasheet编写。如果要查看寄存器的某个位的状态,可以点击在寄存器名称的前的“+”图标。比如要查看ADC寄存器的各个位,如下图所示:
ADC.JPG

    有些寄存器某些位不存在,则用“-----”代替。有些名称占据多个位,则在其后标注序号,比如上图ADC_CHS占据四个位,从高位到低位依次标注为:ADC_CHS3、ADC_CHS2、ADC_CHS1、ADC_CHS0。
    只要在栏目点击寄存器的数值,就可以填写修改的数值,修改是立即生效的,非常方便。比如我要点亮P5.5引脚的LED灯,只需要将P5端口修改为0xDF,或者直接往P5_5写0。对于一些位于片外RAM空间0xfe00-0xffff的寄存器,ROM-Monitor访问这部分寄存器前会保存P_SW2寄存器的内容,再使能P_SW2寄存器的EAXFR位,访问结束后,再还原之前的P_SW2寄存器内容,所以IAR可以正常读写这些寄存器。但是,应用程序代码如果要正常访问这些寄存器,要先使能P_SW2寄存器的EAXFR位。
   需要注意的是,有些寄存器不要随意更改,比如改变时钟的分频系数。这样会导致串口1的波特率发送改变,那ROM-Monitor就无法和IAR正常通信。串口1用到P3_0和P3_1,所以不要修改P3端口这两个位的内容。如果直接将IAP_CONTR寄存器的值修改为0x60,会导致单片机重启,ROM-Monitor和IAR的通信也会失败。
   寄存器选择栏目。我新增了一个ROM-parameter,这个其实不是STC8A8K64S4A12寄存器的内容,这些是STC-ISP软件在烧录时添加到ROM的一些特殊参数,比如7位出厂序列号、bandgap(内部基准电压)和唤醒频率等参数。由于ROM-Monitor下载应用程序前会先擦除0x1000-0xffff的内容,这会把这些参数也一并擦除了。为了保存这些数据,ROM-Monitor在擦除数据前,会先找出这部分数据,然后复制到ROM-Monitor中没有使用到的ROM区域。在ddf硬件描述文件将这部分ROM区域也列举成寄存器,这样IAR就能正常访问,如下图所示:
出厂序列号.JPG

    从上图可以看出,ROM-parameter里的Device_ID:F62884625356AF,bandgap:0x53d=1341mV,这和STC-ISP列出的信息完全一致。如果STC-ISP没有勾选“在程序区的结束处添加重要测试参数”,那就只有Device_ID,没有其他参数。下图是STC官方STC8的datasheet手册的存储器特殊参数的地址说明:
特殊值.JPG

    通过上图,可以知道STC8A系列不同容量单片机的出厂序列号存放地址,只要遍历这些地址,就能读取出厂序列号。更重要的是,可以根据出厂序列号存放的地址,准确判断单片机的ROM大小。这样,ROM-Monitor就可以计算出所需擦除的ROM空间大小,可以动态适配其他型号的STC8A单片机。如果单片机的ROM空间只有60K,我硬要擦除到64K,那会导致单片机卡死。
四、ROM-Monitor的使用说明。
    1、烧录ROM-Monitor固件
    下载ROM-Monitor.JPG
    打开附件提供的ROM-Monitor for STC8A V1.1.hex文件,使用STC官方提供的STC-ISP软件烧录文件,IRC频率选择24M。由于我使用的单片机是STC8A8K64S4A12,这个型号很奇葩,需要指定EEPROM的大小,一定要选择64K。这样对于ROM空间0x0000-0xffff地址空间,单片机就能正常读写,不然会卡死。下面列举datasheet手册一些STC8A单片机的IAP读写区域,如下图所示:
IAP.JPG

    除了STC8A8K64S12需要用户自定义,其他几款单片机的ROM全部地址空间都支持IAP方式读写,ROM的擦除和读写主要是利用IAP技术实现的,ROM-Monotor下载调试应用程序也是基于IAP技术。
    2、支持的STC8A单片机系列
    理论上,所有ROM空间大于4K、外部RAM空间大于128字节、并且支持IAP的8051单片机都可以用ROM-Monitor。不过不同品牌的单片机有差异性,特别是IAP操作方式的差异,导致不同的单片机需要定制不同的ROM-Monitor。本次测试的单片机型号为STC8A8K64S4A12,ROM-Monitor暂时只适用于STC8A系列的单片机。由于手头没有其他STC8A单片机,没做测试,所以不能保证所有型号的STC8A单片机都能正常使用。
    3、修改链接配置文件
    因为ROM-Monitor位于ROM空间0x0000-0x0fff,所以应用程序需要指定从0x1000处开始。在D:\IAR_8051_10\8051\config\devices\STC目录找到打开对应xcl后缀的链接配置文件,将-D_CODE0_START=0修改成-D_CODE0_START=0x1000,点击保存即可。
    linker.JPG
    在Option→Linker里,在Linker configuartion file栏,勾选override default,选择对应的xcl链接配置文件。
    4、选择debugger工具
debugger.JPG

    在Option→Debugger里,Device选择ROM-Monitor,勾选Override default,选择对应的ddf后缀的硬件描述文件。
rom_monitor1.JPG

    在Option→Debugger→ROM-Monitor→Download里,勾选Verify download。这个选项是验证应用程序下载完整性,建议勾选。
rom_monitor2.JPG

    Option→Debugger→ROM-Monitor→Serial Ports里,选择正确的串口号,波特率可以选择9600、38400、57600、115200,不过建议选择115200,因为调试速度会快很多。右边On Reset栏,Toggle DTR和Toggle RTS不用勾选。DTR和RTS是串口芯片的两个输出引脚,一般是连接到单片机Reset引脚,这样上位机就可以翻转DTR或者RTS来让单片机硬件复位。很多STC8A开发板都没有连接,本次ROM-Monitor利用软件复位代替硬件复位。其他选项按照图示选择即可。

    5、开始调试
    ddbugger.png
    直接点击上图‘“download and Debug”按键,ROM-Monitor会自动下载应用程序,然后进入调试模式。
   reset.png
    如果要重新返回到程序起点,点击上图“Reset”按键即可。
   make.png
    如果修改了应用程序语句,可以点击上图“Make_Restart_Debugger”,IAR会退出调试模式,然后重新编译程序,并且在编译完成后,再次进入调试模式,ROM-Monitor即时也会下载最新的应用程序。
stop.png

    如果要退出调试模式,可以点击上图“Stop Debugging”。
    6、一些错误的处理
    ①、如果出现断点冲突的弹窗,要先把断点取消,然后点击“Reset”按键,或者点击“Make_Restart_Debugger”按键。
    ②、如果点击“download and Debug”按键,一直没有响应,请检测串口通信端口是否正确,然后把开发板断点再上电。
    ③、如果在调试过程中途出现ROM-Monitor没有响应的情况,请检测代码是否使用到ROM-Monitor的串口资源,或者更改了系统时钟频率;
    ④、如果不小心修改了ROM-Monitor的固件,比如代码使用了中断向量地址,可能会导致ROM-Monitor固件损坏,这时就算重新断电再上电也没用,需要重新用STC-ISP烧录ROM-Monitor固件。

五、附件说明
    附件包含三个文件夹:
    1、IAR平台STC兼容文件
    2、OLED工程
    3、ROM-Monitor固件
    其中IAR平台STC兼容文件主要是STC8A系列单片机的头文件、链接配置和硬件描述文件。需要复制到IAR指定安装目录,详细可以查看说明。OLED工程是本次测试工程,可以直接编译测试,用来评估ROM-Monitor的功能。ROM-Monitor固件包含ROM-Monitor for STC8A V1.1.hex,使用前需要先烧录到STC8A单片机里。
六、简单对比IAR平台的ROM-Monitor for STC8A和KEIL平台的STC Monitor-51 对比.JPG
    其中片内特殊寄存器指片内位于0x80-0xff之间的寄存器,片外特殊寄存器指位于0xfe00-ffff之间的寄存器。STC Monitor-51不支持显示位于片外的特殊寄存器,即无法显示I2C外设、系统时钟和增强型PWM外设的所有寄存器的状态。而ROM-Monitor for STC8A支持显示全部特殊寄存器,支持实时读和写全部特殊寄存器。 占用资源.JPG
    对于STC8系列STC Monitor-51不占用ROM空间的情况,个人认为这只是不占用用户ROM空间,STC官方针对STC8系列单片机特意加大了系统区空间大小,STC Monitor-51应该被存放在系统区,这个系统区也是STC单片机固化bootloader的区域,腾出6K的空间给STC Monitor-51用。系统区是无法被用户是直接访问的。另外,STC的IAP系列的单片机的系统区大小没有增加,所以STC Monitor-51需要占用6k的用户ROM空间。
    对于RAM空间的占用,STC Monitor-51占用空间不是768bytes,就是1024bytes,需要单片机拥有至少1024K以上片外RAM空间才能正常仿真。假如单片机片外RAM只有1024bytes,那仿真时,用户只能使用片内256bytes的RAM空间。而ROM-Monitor for STC8A仅占用128bytes的片外RAM空间。
    如果对IAR平台感兴趣的话,可以下载查看。跨平台移植不易,希望得到大家的支持。         b站视频演示地址:https://b23.tv/BV1oE411A7Lw
    下面是实物图
实物图.jpg




调试工程文件.rar

439.19 KB, 下载次数: 47, 下载积分: 黑币 -5

三个文件压缩包

回复

使用道具 举报

ID:739441 发表于 2021-3-22 14:57 | 显示全部楼层
1:如果程序里面用到了比如串口中断,比如定时器中断,是不是就不可以使用仿真了啊?
2:如果有中断使用了,但是使用的keil 是否可以仿真呢?
回复

使用道具 举报

ID:351097 发表于 2021-3-24 12:58 | 显示全部楼层
jiangyan111 发表于 2021-3-22 14:57
1:如果程序里面用到了比如串口中断,比如定时器中断,是不是就不可以使用仿真了啊?
2:如果有中断使用了 ...

串口1被用于和IAR通信了,所以应用程序里面不能用串口1,可以使用STC8A的其他串口资源。
回复

使用道具 举报

ID:617016 发表于 2021-5-30 10:33 | 显示全部楼层
楼主能开源 ROM-Monitor for STC8A 的源码工程吗?
回复

使用道具 举报

ID:106977 发表于 2021-5-30 13:28 | 显示全部楼层
除非你这个调试功能相比STC官方驱动在Keil下的调试有显著优点,否则实用价值不大!调试过程是个相对繁琐的过程,需要简单方便!环节一多,不知道是在调试谁?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表