比如,如果你需要查看PA11的引脚,就写为(PORTA & 0x00000800)>> 11(0x00000800可以写为0x0800)。因为为PA11,所以写PORTA,从上宏定义可知,因为11脚对应的是0x0800,所以就&0x0800,因为是11脚就右移11位。
设置好引脚之后,在View下勾选上更新窗口,这样的话仿真时各种数据会实时更新,逻辑分析仪也就可以看到实时波形。
设置好之后点击运行,就可以在逻辑分析仪窗口看到该引脚的状态实时波形。
Watch窗口
Watch创口可以用来观察全局变量,只要将需要观察的全局变量复制到下面的窗口中,运行之后就可以看到数据的变化。
比如这里是观察一个结构体数组变量的情况,那个数据的值是多少、是什么类型一目了然。
当然,这里没法看局部变量,要看局部变量的话还是要用堆栈局部变量窗口。
堆栈局部变量窗口
你可能会问,什么是堆、栈?点这!
什么是堆栈?
内存分配方式有三种:
[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
[3]从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
简言之,我们可以通过这个串口观察申请在堆栈区的变量,另外实测发现静态变量也是可以看的。总之,通过Watch窗口和堆栈窗口我们可以查看几乎所有的变量。
Peripherals窗口
它是用来仿真时观察和修改芯片的在外设寄存器用的,第一个System Viewer可以通过箭头所指的地方直接查看。
但是! 这是一个通用的选项,即涵盖了所有的外设,这上边可以查看的外设在我们的芯片型号上不一定有。比如我选用的是STM32VBT6只有3个串口,而这里可以看5个串口!而SyetemViwer下边的是外设是根据前文配置仿真时配置的Dialog DLL和Parameter决定的,所以要使用这个功能,必须要把Dialog DLL和Parameter配置为你要仿真的芯片型号。
另外两者的界面也有一些差别,看一哈
左图是System Viwer的界面,直接显示了改外设的所有寄存器极其每个位的值。右图是另一个界面,可以相对前者比较直观一些。
二、硬件/在线仿真
2.1 仿真器通信协议/接口
目前主流的协议是JTAG协议和SWD协议,一般常用的仿真器也是同时支持这两种协议/接口的。
JTAG协议/接口
JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。JTAG的工作原理可以归结为:在器件内部定义一个TAP(Test Access Port,测试访问口),通过专用的JTAG测试工具对内部节点进行测试和调试。一个含有JTAG Debug接口模块的CPU,只要时钟正常,就可以通过JTAG接口访问CPU的内部寄存器、挂在CPU总线上的设备以及内置模块的寄存器。
JTAG有5根线与目标CPU相连,TMS、TCK、TDI、TDO、NTRST:
- TMS:测试模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;
- TCK:测试时钟输入;
- TDI:测试数据输入,数据通过TDI引脚输入JTAG接口;
- TDO:测试数据输出,数据通过TDO引 脚从JTAG接口输出;
- NTRST:JTAG模块复位
其中在引脚紧缺的时候NTRST复位引脚可以不用。
SWD协议/接口
SWD全称Serial Wire Debug,是ARM为嵌入式设备推出的一种简单的调试接口,这种接口通过一条双向数据线和一条时钟线实现对于ARM核心的调试。
SWD需要3根线与目标MCU相连,SWDIO,SWDCLK和GND。
- SWDIO 为双向Data口,主机到目标的数据传送。
- SWDCLK 为时钟口,主机驱动。
- GND GND脚。
关于SWD的协议的具体内容,可以参考这位篇文章。还不满足的话可以参考这篇硕士论《WD协议的研究及ARM程序下载器的设计》。
RDI协议/接口
远程调试接口(Remote Debug Interface),是ARM公司提出的标准调试接口,主要用于ARM芯片的仿真,由于各个IDE厂商使用的调试接口各自独立,硬件无法进行跨平台的调试。现在众多的IDE厂家都逐步采用标准RDI作为ARM仿真器的调试接口,因此使跨平台的硬件调试成为可能。EasyJTAG由于使用标准RDI调试接口,因此在任何使用标准RDI接口的IDE调试环境中都可以使用,例如ARM公司的ADS1.2/IAR公司的EWARM 3.30 。
2.2 常见仿真器
Jlink
J-Link是德国SEGGER公司推出基于JTAG的仿真器。简单地说,是一个JTAG协议转换盒,即一个小型USB到JTAG的转换盒,其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议。它完成了USB接口和JTAG接口的转换工作。JLINK是一个通用的开发工具,可以用于KEIL、IAR、ADS 等平台。速度,效率,功能都很好,据说是众多仿真器里最强悍的。
STlink
ST-LINK是专门针对意法半导体STM8和STM32系列芯片的仿真器。ST-LINK /V2指定的SWIM标准接口和JTAG / SWD标准接口。
ULINK
ULINK是ARM/KEIL公司推出的仿真器,专用于KEIL平台下使用,ADS、IAR下不能使用。
2.3 Jlink的Keil5仿真配置
首先确认所选用的芯片支持哪种仿真通信协议,STM32F103支持 JTAG 和 SWD。并且PA13、PA14、PA15、PB3、PB4默认功能为调试引脚,如果要使用这些引脚,要Remap为普通IO。
魔术棒的DEBUG选项下选用使用仿真器以及所使用的仿真器的型号。
点击setting,选择接口类型(SW或JTAG),速度建议选4M,过高的话也行,只是有时候擦写flash会失败。
下载的时候使用的仿真器,所以要在这里勾选使用仿真器
最后,这里根据所选型号flash大小选择合适的下载算法。如果不知道怎么选,看一下STM32芯片的命名规则,或点这里。
2.4 硬件仿真操作方法
仿真操作方法与软件操作相同,不同的是,硬件/在线仿真是在硬件上跑的,可以向硬件输入数据或者由硬件输出数据,比如做按键仿真的时候,只能通过硬件/在线仿真才能测试出芯片有没有正确地处理按键信息等。