打印
[应用相关]

STM32的ITM跟踪调试功能介绍及实现(四)printf() 篇

[复制链接]
1199|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Debug过程中,使用printf()函数能给输出数据带来很大方便,这归功于printf对各种数据类型转换的强大能力。MCU系统中使用printf的核心技巧是定制一个自己的fputc函数,关于这方面介绍的内容网上有很多,不熟悉的读者请自行百度。下面介绍ITM如何与printf结合来输出debug信息。先以KEIL为例。


作者:海东青电子
链接:https://www.jianshu.com/p/3f637df3912f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用特权

评论回复
沙发
deadtime|  楼主 | 2020-6-21 12:14 | 只看该作者
KEIL软件考虑的很周到,官方给了一个重定向printf的代码例子:

使用特权

评论回复
板凳
deadtime|  楼主 | 2020-6-21 12:15 | 只看该作者
在KEIL安装目录下的 ARM\Startup\ 目录下,有一个名叫 Retarget.c 的文件,里面定义了FILE数据类型和一些输入、输出的底层函数,我们只保留FILE声明和fputc输出函数,其余删掉,改造后的 retarget.c 文件如下:

#include <stdio.h>

#include "stm32f4xx_hal.h"

#pragma import(__use_no_semihosting_swi)

//extern int  sendchar(int ch);  /* in Serial.c */

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

FILE __stdout;

FILE __stdin;

int fputc(int ch, FILE *f) {

  //return (sendchar(ch));

  return (ITM_SendChar(ch));

}

使用特权

评论回复
地板
deadtime|  楼主 | 2020-6-21 12:15 | 只看该作者
因为本人的目标板是NUCLEO-F411RE 板子,所以include了头文件 stm32f4xx_hal.h ,是为了调用 ITM_SendChar() 函数。这样修改代码之后,主程序调用printf,printf调用fputc,fputc调用ITM_SendChar(),最终在KEIL的ITM观察窗口中输出我们要看的变量的数值。(有关如何在KEIL中使用ITM功能,请见STM32的ITM跟踪调试功能在KEIL中的应用)

使用特权

评论回复
5
deadtime|  楼主 | 2020-6-21 12:16 | 只看该作者
将这个retarget.c文件加入到KEIL工程项目中,在main.c中添加一个打印输出语句:

printf("Hello, st mcu!\n");

编译、烧写程序,启动debug调试、全速运行,看到结果如下:

使用特权

评论回复
6
deadtime|  楼主 | 2020-6-21 12:17 | 只看该作者
再看一个打印变量值的小例子,man.c中增加一个变量:

uint32_t dwCount;

然后,printf语句修改为:

printf("cnt = [%4d]\n", dwCount++);        //右对齐,占4个字符位宽

使用特权

评论回复
7
deadtime|  楼主 | 2020-6-21 12:17 | 只看该作者
运行结果如下:

使用特权

评论回复
8
deadtime|  楼主 | 2020-6-21 12:18 | 只看该作者
可见,使用printf可以非常灵活地控制输出数据的格式。

使用特权

评论回复
9
deadtime|  楼主 | 2020-6-21 12:19 | 只看该作者
小结:

改造fputc函数来“重定向”打印输出;

增加一个retarget.c文件,include 2个头文件:stdio.c 和 stm32f4xx_hal.h(你可以修改成你的目标板MCU对应的HAL头文件),改写fputc函数;

在main.c或其他需要打印输出的地方,直接使用printf()即可。

本文完,请见ITM专题系列的最后一篇:ITM应用实例:USB设备(模拟一个鼠标)代码调试。

使用特权

评论回复
10
deadtime|  楼主 | 2020-6-21 12:19 | 只看该作者
作者:海东青电子
链接:https://www.jianshu.com/p/3f637df3912f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用特权

评论回复
11
muyichuan2012| | 2020-6-22 19:55 | 只看该作者
值得参考,另外这个帖子写的更详细,也不错。
https://bbs.21ic.com/icview-2968842-1-2.html

使用特权

评论回复
12
八层楼| | 2020-7-9 15:03 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
13
观海| | 2020-7-9 15:03 | 只看该作者
楼主辛苦了

使用特权

评论回复
14
guanjiaer| | 2020-7-9 15:03 | 只看该作者
这个函数是打印在哪里呢

使用特权

评论回复
15
heimaojingzhang| | 2020-7-9 15:04 | 只看该作者
是在运行的cmd界面上有显示吗

使用特权

评论回复
16
keaibukelian| | 2020-7-9 15:04 | 只看该作者
长知识了 呵呵

使用特权

评论回复
17
uytyu| | 2020-7-10 23:04 | 只看该作者
谢谢分享。  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

470

帖子

2

粉丝