【ARM】如何使用Keil仿真中的UART通信?-2022

UART 通信或 RS232 串行接口由许多微控制器提供。µVision 调试器模拟 UART 接口并提供串行窗口进行通信。串行 Windows 的操作类似于终端。作为替代方案,可以使用ASSIGN 命令将串行输出重定向到任何 COM 端口。

外设对话框

通过菜单 Peripherals提供的UART或Serial对话框显示微控制器的串行接口状态。这些对话框允许查看系统的通信波特率和其他参数。


虚拟仿真寄存器 (VTREG)

模拟 UART 通信的 VTREG 实现如下:

VTREGDescription
SxIN是串行接口 x的输入缓冲区。SxIN 接受由目标程序读取的 8 位或 9 位值。读取 SxIN 以确定输入缓冲区何时准备好接受另一个字符。特殊值 0xFFFF 表示前一个值已被处理并且可以写入新值。其他特殊值可用于模拟奇偶校验错误或帧错误。
SxOUT是串行接口 x的输出缓冲区。µVision 将 8 位或 9 位值(按编程)复制到 SxOUT VTREG。
SxTIME定义串行接口x的波特率时序。当 SxTIME 为 1 时,µVision 使用编程的波特率模拟串行接口的时序。当 SxTIME 为 0(默认值)时,编程的波特率时序被忽略,串行传输是瞬时的。

VTREG(SxIN、SxOUT 和 SxTIME)的命名约定因器件而异。一些设备提供了不止一个 UART 接口。因此,VTREG 名称可能以 S0 或 S1 为前缀。使用命令DIR VTREG检查 UART 接口的 VTREG 名称。

通过 SxIN VTREG 输入字符

SxIN VTREG 代表微控制器片上串行端口的输入。从命令行窗口使用的以下命令将值输入到串行流中。此外,串行窗口可用于输入串行端口的值。

SIN = 'A'     /* Input the letter A to the serial stream */

SIN = 0x019E /* Input the 9-bit value 19Ex to the serial stream */

SIN = 0xA9  /* Input value 0xA9 to I/O stream for the UART */

控制 UART 通信时序

SxTIME VTREG 允许控制模拟串行端口的时序。

l 值为 1 表示串行端口时序与目标硬件相同。使用此值来模拟串行端口 I/O 上的波特率的含义。

l 值为 0 表示串行输入和输出是瞬时发生的。当波特率不相关或加速串行输出时使用此值。

例如:

STIME = 0 /* 将 Serial 0 设置为 FAST 时序 */

STIME = 1 /* 设置 Serial 0 以获得准确的计时 */

UART 仿真示例

以下调试脚本以大约 19.200 波特的速度发送字符“A”-“Z”。

signal void serialA_Z (void) {

  char ch;

  for (ch = 'A'; ch < 'Z'; ch++)   {

   S0IN = ch;                              /* Send character */

   twatch (CLOCK / 900);

  }                                       /* Repeat */

}