STM32中重定向printf到SWO口[通俗易懂]

STM32中重定向printf到SWO口[通俗易懂]Keil中调试:用SWO功能替代printf引用网址:http://blog.csdn.net/xiaolei05/article/details/8526021嵌入式软件开发中的一个基本需求就是能通过终端来输出调试信息,一般可通过2种方式实现:一种是使用串口线连接板上的UART和PC上的COM口,通过PC上的超级终端来查看调试信息;另一种则是采用半主机机制,但有可能不被

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Keil中调试 : 用 SWO 功能替代 printf

引用网址:http://blog.csdn.net/xiaolei05/article/details/8526021

keil官方Guide: http://www.keil.com/support/man/docs/jlink/jlink_trace_itm_viewer.htm

嵌入式软件开发中的一个基本需求就是能通过终端来输出调试信息,一般可通过2种方式实现:一种是使用串口线连接板上的UARTPC上的COM口,通过PC上的超级终端来查看调试信息;另一种则是采用半主机机制,但有可能不被所用的工具链支持。基于Cortex-M3核的软件调试突破了这样的限制,Cortex-M3内核提供了一个ITM(Instrumentation TraceMacrocell)接口,通过SWV(Serial Wire Viewer)可调试由SWO引脚接收到的ITM数据。ITM实现了32个通用的数据通道,基于这样的实现,CMSIS规定用通道0作为终端来输出调试信息,通道31用于操作系统的输出调试(特权模式访问)。在core_cm3.h中定义了ITM_SendChar()函数,因此可通过调用该函数来重写fputc,以在应用程序中通过printf打印调试信息,并可通过ITM Viewer查看这些调试信息。有了这样的实现,嵌入式软件开发者就可以在不配置串口和使用终端调试软件的情况下输出调试信息,在一定程度上减少了工作量

基本概念:

SWD
The J-Link and J-Trace support ARMs Serial WireDebug (SWD). SWD replaces the 5-pin JTAG port with a clock (SWDCLK)and a single bi-directional data pin (SWDIO), providing all thenormal JTAG debug and testfunctionality. 
Pin 13 of SWD:
SWO – Serial Wire Output trace port. (Optional,not required for SWD communication.)

SWO
J-Link can be used with devices that supportSerial Wire Output (SWO). Serial Wire Output (SWO) support meanssupport for a single pin output signal from the core. It iscurrently tested with Cortex-M3 only.

SWV
The Instrumentation Trace Macrocell (ITM) andSerial Wire Output (SWO) can be used to form a Serial Wire Viewer(SWV). The Serial Wire Viewer provides a low cost method ofobtaining information from inside the MCU. The SWO can output tracedata in two output formats, but only one output mechanism is validat any one time. The 2 defined encodings are UART and Manchester.The current J-Link implementation only supports UART encoding.Serial Wire Viewer uses the SWO pin to transmit different packetsfor different types of information. The three sources in theCortex-M3 core which can output information via this pinare:
– Instrumentation Trace Macrocell (ITM) forapplication-driven trace source that supports printf-styledebugging. It supports 32 different channels, which allow it to beused for other purposes such as real-time kernel information aswell.
– Data Watchpoint and Trace (DWT) for real-timevariable monitoring and PC-sampling, which can in turn be used toperiodically output the PC or various CPU-internal counters, whichcan be used to obtain profiling information from thetarget.
– Timestamping. Timestamps are emitted relative topackets.

LPC177x/178x debug support
– A JTAG debug interface is included.
– Serial Wire Debug is included. Serial Wire Debugallows debug operations using only 2 wires, simple trace functionscan be added with a third wire.
– The Embedded Trace Macrocell (ETM) is included.The ETM provides instruction trace capabilities.
– The Data Watchpoint and Trace (DWT) unit isincluded. The DWT allows data address or data value matches to betrace information or trigger other events. The DWT includes 4comparators and counters for certain internal events.
– An Instrumentation Trace Macrocell (ITM) isincluded. Software can write to the ITM in order to send messagesto the trace port.
– The Trace Port Interface Unit (TPIU) isincluded. The TPIU encodes and provides trace information to theoutside world. This can be on the Serial Wire Viewer pin or the4-bit parallel trace port.
– A Flash Patch and Breakpoint (FPB) is included.The FPB can generate hardware breakpoints and remap specificaddresses in code space to SRAM as a temporary method of alteringnon-volatile code. The FPB includes 2 literal comparators and 6instruction comparators.

http://www.keil.com/support/docs/3051.htmhttp://www.keil.com/support/man/do

 

Debug (printf) Viewer

Home » µVision Windows » Debug (printf) Viewer

The Debug (printf) Viewer window displays data streams that are transmitted sequentially through the ITM Stimulus Port 0. Enable ITM Stimulus Port 0.
STM32中重定向printf到SWO口[通俗易懂]

Debug Viewer Window

To use the Debug (printf) Viewer for tracing:

   1. Add ITM Port register definitions to your source code.

    #define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
    #define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
    #define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))

    #define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
    #define TRCENA          0x01000000

   2. Add an fputc function to your source code that writes to the ITM Port 0 register. The fputc function enables printf to output messages.

    struct __FILE { int handle; /* Add whatever you need here */ };
    FILE __stdout;
    FILE __stdin;

    int fputc(int ch, FILE *f) {

      if (DEMCR & TRCENA) {

        while (ITM_Port32(0) == 0);
        ITM_Port8(0) = ch;
      }
      return(ch);
    }

    3.Add your debugging trace messages to your source code using printf.

    printf(“AD value = 0x%04X\r\n”, AD_value);

    4.Set the ITM Port 0 to capture the information. Clear the Port 7..0 privilege bit to access ITM Port 0 from User mode.
STM32中重定向printf到SWO口[通俗易懂]
    ITM Stimulus Port 0
    Open the View – Serial Windows – Debug (printf) Viewer window.

Note

    ITM Stimulus Ports can be monitored in the Instruction Trace Window, where ITM Port 0 is shown as well.
    Consult Configure Cortex-M Target of the MDK-Primer for information on how to retarget the output.

GCC工具链下调试:
 用 SWO 功能替代 printf

引用自:http://bbs.elecfans.com/forum.php?mod=viewthread&tid=466474&extra=

printf在命令行编程的时候是非常常用的,虽然是个老函数,但是功能强大,经久不衰
51等8位
单片机由于RAM比较小,栈就比较小,跑printf比较吃力,
但是STM32这种32位单片机跑printf就很容易了,而作为一种调试手段,printf十分方便、直观。
比较常见的方法是把printf重定向到串口,不过这需要外接一个串口线,比较麻烦。
其实STM32自带的SWO口是能够异步输出数据的,而且不需要外接什么设备,
ST-LINK/J-Link等带SWO口的调试器都支持。
下面以STM32F4Discovery开发板+GCC为例说明。
根据这里的方法,也可以把printf定位到其他外设。
PS:IAR在编译选项里自带了printf via SWO的功能,就不需要外加设置了。
http://community.silabs.com/t5/Microcontroller-How-to-Guides/SWO-printf-in-IAR/td-p/98257
首先来说说怎么把信息输出到SWO口,一句话搞定。
ITM_SendChar(ch);
这是在core_cm4.h(如果是F1系列的那就是core_cm3.h)中定义的内联函数。
不过不需要特意去include这个头文件,通过#include “stm32f4xx.h”就间接地将core_cm4.h包含进来。
不过说起来,ITM这个东西其实严格来说是Cortex-M提供的一个特性,而不是STM32。
利用这个函数把信息输出到SWO口之后再打开St-Link Utility,
在菜单里找到ST-LINK→Printf via SWO Viewer就会弹出一个窗口,
设置System Clock为单片机内核频率,点Start就能看到输出的信息了。
接下来就是把printf函数输出的字符串重定向过去了。
由于单片机的外设功能是根据需求变化的,编译器不可能确定printf需要用到的外设资源,
于是乎它就干脆留了个接口,也就是_write函数,
当然除了_write函数之外还有_read等其他函数,不过这里我们用不到。
其声明为 int _write(int fd, char* ptr, int len);
关于_write函数,说简单点,就是所有涉及到输出字符串的函数,
比如printf和putchar(),最终都会跑到_write函数,这里fd是文件标识符,说开来就比较复杂了,
这里我们用得到的就只有STDOUT_FILENO跟STDERR_FILENO,
其中前一个是标准输出的文件标识符的预定义变量,后一个是错误输出的文件标识符预定义变量。
第二个变量ptr是需要输出的字符串首地址,len就是输出长度。
当我们调用printf函数后,C运行库会把输入变量转换为最终需要输出的字符串,
然后调用_write函数,将结果输出。我们的工作就是实现一个_write函数。
新建一个_write.c文件,内容如下:
  1. #include <stdio.h>
  2. #include <unistd.h>

  3. #include “stm32f10x.h”

  4. #ifdef _DEBUG

  5. int _write(int fd, char* ptr, int len)
  6. {

  7. if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
  8. {

  9. int i = 0;
  10. while(i<len)
  11. ITM_SendChar(ptr[i++]);
  12. }
  13. return len;
  14. }

  15. #endif

复制代码


加了个#ifdef _DEBUG 的效果是未加 _DEBUG 定义的时候就忽略下面的东西,
因为这东西主要是用在调试阶段,RELEASE版本里面都用不到了,而且多少还是会影响速度。
其他东西就很简单了- -不需要多说明了吧。
直接编译能通过,但是链接会报错,提示无法找到_read之类的一堆函数。
在链接脚本的下面libgcc.a ( * )后面加上libnosys.a ( * ),就不会报错了。
具体原因涉及到Cortex-M3使用的newlib库的实现,就不具体展开了。
好吧好吧,其实我也不知道。
如果想把信息定位到串口,可以直接把ITM_SendChar改成相应的串口函数,
也可以利用DMA,先把数据拷贝到DMA缓冲区,让DMA自动传数据,提高响应速度。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234566.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java 通过Ajax前台传参数 并用 HttpURLConnection Post方式访问对外的接口

    前两天做项目遇到一个问题,就是在自己的项目中要去访问项目外部的接口,从自己的项目中传参数过去,通过调用 对方提供的接口去获取想要得到的数据!第一次接触到在自己项目中去访问和调用外部的资源,然后在网上去找资料,看有没有相关的资料可以参考,然后通过参考其他人的博客资料,最终把这个问题解决了。自己总结一下这个过程,也供遇到相同或者类似问题的朋友可以快速的定位和解决问题。     下面讲一下我的问题和

  • 禁用Chrome Frame[通俗易懂]

    禁用Chrome Frame[通俗易懂]2019独角兽企业重金招聘Python工程师标准>>>…

  • java心得体会_初学java之心得体会

    java心得体会_初学java之心得体会0.前言从学习java以来,已经进行过三次pta作业的训练。虽然每次作业的完成都遇到了些许困难和障碍,不是一帆风顺的,但通过自己的摸索,实践,总能完成作业要求,每次作业之后都有不同的收获。这些新的收获告诉我,实践出真知,动手会学习到更多东西。总结前面的三次作业,我发现面向对象程序设计这种语言不再那么神秘,我相信马上就能看到揭开神秘面纱后的的它。1.作业过程总结(1).总结三次作业的知识迭代关系第一…

  • LM算法代码_快速排序算法代码

    LM算法代码_快速排序算法代码LM算法+推导+C++代码实践一、算法推导二、代码实践参考一、算法推导二、代码实践#include<Eigen/Dense>#include<Eigen/Sparse>#include<iostream>#include<iomanip>#include<math.h>usingnamespacestd;usingnamespaceEigen;constdoubleDERIV_STEP=1

  • jdk下载与安装[通俗易懂]

    1.JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html安装完成后,需要进行环境变量的配置,右键我的电脑—属性—-高级系统设置就会看到下面的界面:2.点击环境变量,开始坏境变量的配置:(1)点击系统变量下的新建按钮,变量名JAVA_HOME(代表你的JDK安装路径),值对应的是你的JDK的安装路径。(2)继续在系统变量里面新建一个CLASSPATH变量,其变量值如下图所示:….

  • 八种基本数据类型_uint16是什么数据类型

    八种基本数据类型_uint16是什么数据类型uint8_t/uint16_t/uint32_t/uint64_t 是什么数据类型在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号