关于STM32的ITM 方式输出走了一些弯路

本文介绍了在STM32中通过ITM(Instrumentation Trace Macrocell)实现printf输出的四种方法,重点讨论了ITM的优势,如不占用外设资源、无需编写驱动、调试友好等。作者通过实践,最终成功利用SWO输出实现了高效、快速的调试信息传输,并分享了在Keil MDK环境下配置和代码实现的关键步骤,以及在此过程中遇到的问题和解决经验。
摘要由CSDN通过智能技术生成

最简单直接且有效的方式就是这篇文章:使用SWO代替UART,实现printf打印功能

实现STM32的printf输出的四种方式

  四种实现方式,我认为第二种最简单可行。

方式一二三通用配置

img

img

img

方式一:Keil官网说明 :

https://www.keil.com/support/man/docs/jlink/jlink_trace_itm_viewer.htm

image-20210904102055548

方式二 和 方式三:

需添加两个头文件stm32f10x.h 和 stdio.h,方式三为串口方式,非ITM方式,还需进行硬件资源配置,看文章了解了就顺便记录下来了。

image-20210904102105596

方式四:添加源文件以及初始化文件

需添加两个头文件stm32f10x.h 和 stdio.h,这点儿是后来弄懂其它方式后才了解到的。

image-20210904102009257

image-20210904095846765

image-20210904102023931

img

为什么要用ITM

  有一个模块的例程代码就用到了printf,然后就想到了之前鱼鹰写的ITM方式调试,就顺势了解了一下怎么实现的,调试方式的进步可能带来工作效率大的提升。

ITM的SWO输出优势

  • 硬件:不占用外设。串口是MCU的片内外设,会占用一个外设资源,影响硬件设计。
  • 代码:不需要写驱动。串口的话针对不同的MCU需要重新编写串口的驱动。
  • 调试:不会引入中断嵌套,也避免了此类问题。串口输出一般使用中断方式发送,调试时可能需要在中断中观察某些信息,这样中断嵌套就容易出现问题。
  • 速度:SWO的速度比串口快得多。在时序要求较高的情况下对代码的影响较小。发送相同的字符串,SWO的速度是串口的8.7倍(一篇文章的测试数据)。

目标

  仿真器连接单片机 与 PC,在线调试,将“Hello World”输出到PC上,在开发工具(MDK) 的某个窗口显示。

原理

  单片机借助PC的显示/输入设备 实现了自己的 输出和输入。

  开发环境搭建:STM32 + MDK + 实现方式(ITM机制:使用硬件接口:五线SWD

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 HAL中,可以通过重定向串口输出来实现打印功能。具体步骤如下: 1. 首先,在工程中打开stm32f4xx_hal_uart.c文件,找到`HAL_UART_Transmit`函数。 2. 在该函数中,找到以下代码: ```c /* Send the string character by character */ while (*pData != '\0') { /* Wait for the UART Transmit Data Register to be empty */ while (!__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE)) { } /* Transmit one byte */ huart->Instance->DR = (uint8_t)(*pData & 0xFF); pData++; } ``` 将其替换为以下代码: ```c /* Send the string character by character */ while (*pData != '\0') { /* Wait for the UART Transmit Data Register to be empty */ while (!__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE)) { } /* Transmit one byte */ ITM_SendChar(*pData); pData++; } ``` 3. 接下来,在main.c文件中添加以下代码,以重定向printf函数: ```c #ifdef __GNUC__ /* With GCC, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch; } ``` 4. 最后,在main函数中添加以下代码,以启用重定向功能: ```c /* Enable USART2 interrupt */ HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); /* Enable ITM printf redirection */ ITM_Init(); /* Redirect STDOUT to USART2 */ stdout = &huart2; ``` 通过以上步骤,你就可以在STM32 HAL中实现串口输出重定向了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值