注册 登录
查看: 2070|回复: 7

山外调试工具——DAP仿真器之RTT传输

[复制链接]
发表于 2017-9-26 23:18:42 | 显示全部楼层 |阅读模式
山外调试工具,包含 DAP仿真器、USB转TTL串口模块、USB示波器功能,
购买方式:https://item.taobao.com/item.htm?id=559283898593



【常规通信方式】
常见的通信方式有串口、I2C、SPI 等,只要是通信协议,自然就能传输信息。

例如我们需要把单片机的一些调试信息通过串口,把信息发送到上位机显示。

而串口发送,一般的做法是逐个字节查询等待发送,而串口的波特率又比较低,因此串口发送占用CPU比较严重。

串口+DMA传输,可以把传输的过程交由DMA来完成,CPU可空余下来干其他的活。不过,DMA的缺点就是需要复杂的寄存器配置,难度较大,所以一般很少用。



【RTT通信】

RTT( Real Time Terminal)是山外DAP仿真器利用SWD协议来获取单片机信息的一种技术。CPU只需要把数据存放到指定位置,DAP主动获取信息并传输到山外DAP助手上显示。

传输过程并不需要CPU的介入,如同DMA操作,所以不影响MCU的实时性。而RTT的用法又非常简单,不像DMA那样需要复杂而又不通用的配置,因此RTT是一种很好代替串口来显示调试信息的技术。

RTT的用法上,可以说简单到没朋友:(串口也得需要寄存器配置,RTT无需配置寄存器,只需要复制数据到指定的地址即可)




  1. __no_init char rtt_buff[1024+2]@0x1fff0500;    //IAR 指定数组地址为 0x1fff0500 (这地址,结合单片机可用内存来设置,并且要和上位机配置一致)

  2. void main()
  3. {
  4.     RTT_INIT();                 //RTT 初始化

  5.     gpio_init(PTB20,GPO,1);                         //初始化LED0  ,灭
  6.     gpio_init(PTB21,GPO,1);                         //初始化LED1  ,灭

  7.     rtt_if_printf("\n\n山外论坛:www.vcan123.com");
  8.     DELAY_MS(20);
  9.     rtt_if_printf("\n本例程使用RTT功能来显示。");

  10.     while(1)
  11.     {
  12.         rtt_if_printf("\nLED0亮,LED1亮");

  13.         PTB20_OUT   = 0;                    //PTB20输出0,即LED0 亮
  14.         PTB21_T     = 1;                    //PTB21输出反转,即LED1由灭变亮
  15.         DELAY_MS(500);                      //延时500ms

  16.         rtt_if_printf("\nLED0灭,LED1灭");

  17.         PTB20_OUT   = 1;                    //PTB20输出1,即LED0 灭
  18.         PTB21_T     = 1;                    //PTB21输出反转,即LED1由亮变灭
  19.         DELAY_MS(500);                      //延时500ms
  20.     }
  21. }


rtt_if_printf 是山外写好的发送函数,用法和 printf 一样。作用是判断上一次是否发送完成,如果完成,就写入新的数据,如果没发送完成,就放弃这次的发送。

QQ截图20170926221221.jpg




【RTT原理】
RTT,实际上就是把发送的工作,由CPU改成DAP来完成,做个类比:
1.jpg

而串口查询发送,就是人不停地看火,看饭什么时候熟了,饭煮熟了才能干其他活。

注意一点,RTT的发送过程,不需要CPU干预,不代表发送不需要时间,DMA发送也是如此。

例如,有的人就是需要等饭煮熟了,才能吃饭,干其他活。这情况下,串口发送和RTT发送,都需要等待发送完成,优势就不明显了。

此外,使用RTT传输,尽可能一次完成传输,避免多次,这样可以减少USB传输等开销。

例如:
  1.     rtt_if_printf("\n\n山外论坛:www.vcan123.com");
  2.     DELAY_MS(20);
  3.     rtt_if_printf("\n本例程使用RTT功能来显示。");


推荐改成:
  1.     rtt_if_printf("\n\n山外论坛:www.vcan123.com"
  2.                                    "\n本例程使用RTT功能来显示。");


这样一次传输完成,就不需要分开2次,不需要中间的等待。

为何不用死循环等待发送?

因为传输的主体是外部的DAP,一旦外部DAP接线出问题,或者上位机没运行,程序就会卡死,因此推荐预留延时,然后查询发送即可。


本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2017-9-27 11:38:18 | 显示全部楼层
刚下单,比较新颖的调试方法,等收到后,研究一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-27 15:07:14 | 显示全部楼层
oqffuptoxl 发表于 2017-9-27 11:38
刚下单,比较新颖的调试方法,等收到后,研究一下。

好处就和单片机厂家无关,无需寄存器配置,只要是Cortex内核就可以用了。
回复 支持 反对

使用道具 举报

发表于 2017-9-27 15:44:22 | 显示全部楼层
山外メ雲ジ 发表于 2017-9-27 15:07
好处就和单片机厂家无关,无需寄存器配置,只要是Cortex内核就可以用了。

一次过满足多个愿望
回复 支持 反对

使用道具 举报

发表于 2017-10-1 11:15:57 | 显示全部楼层
只要是Cortex-M内核就可以,和单片机具体厂家无关,这个功能好啊。

新手上一个单片机,串口也经常折腾很久,这个直接通过DAP来完成,省了串口配置。
回复 支持 反对

使用道具 举报

发表于 2017-10-1 11:18:15 | 显示全部楼层
山外哥,招实习不?想过去实习实习一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-1 21:38:12 | 显示全部楼层
邴和 发表于 2017-10-1 11:15
只要是Cortex-M内核就可以,和单片机具体厂家无关,这个功能好啊。

新手上一个单片机,串口也经常折腾很 ...

是的,新学一款单片机,一开始需要调试变量处理,通过DAP比串口简单。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2018-1-23 16:23:19 | 显示全部楼层
挺强大的,良心出品


回复 支持 反对

使用道具 举报

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

本版积分规则

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