STM32两种输出调试信息的方法

方式一:基于SEGGER的RTT方式,可直接使用jlink连接到目标板即可看到调试信息。

优点:速度很快,即使是在中断中调用也没有问题,在带系统的程序中也不需要开启临界保护;

缺点:需要加入两个SEGGER提供的.c文件及头文件,不能输出中文和浮点(原因可能是会降低速度);

硬件连接:jlink的SWDIO引脚必须和目标板连接,其它按照标准使用即可。

需要的两个.c文件可在jlink驱动安装目录D:\SEGGER\JLink_V634c\Samples\RTT中找到(我的安装到D盘驱动版本为634c,根据自己的实际情况找)

可看到里面有一个压缩包,解压后将SEGGER_RTT.c、SEGGER_RTT.h、SEGGER_RTT_Conf.h、SEGGER_RTT_printf.c拷贝到自己的工程目录下,然后将头文件包含进工程即可

在使用的地方头文件加上#include "SEGGER_RTT.h"

便可调用SEGGER_RTT_printf();函数输出调试信息到Jlink RTT_Viewer了

这个软件是安装好jlink驱动就有的,里面还有其它软件也可以查看调试信息,可使用的函数也不止这一个,可参考segger官方文档自行实现。

方式二:使用STM32的串口输出调试信息。

优点:可以输出中文及浮点数;

缺点:需要占用一个串口资源,不适合在中断中调用,带系统后调用的地方也需要加临界保护;

硬件连接:将单片机串口接到一个USB转串口用上位机即可观察数据。

需要在MDK中开启使用微库选项(也可不用,但需要自己实现重定向的一些东西)

在有勾勾的地方勾上就行了

在程序中需要将printf函数重定向到串口

/*重定向 printf 到串口*/
int fputc(int ch, FILE *f)
{
  UART1_SendData((uint8_t *)&ch,1);
  
  return ch;
}

UART1_SendData();函数自行实现,就是串口1发送数据。

这里提供一种输出可控的方式:debug.h

当宏PRINTF_DEBUG置为0时可以关闭所有调试信息的输出,而宏DEBUG_ON只会影响当前文件内的调试信息输出。

#ifndef __RTT_DEBUG_H
#define __RTT_DEBUG_H

/***************************************************************/

#ifndef DEBUG_ON
#define DEBUG_ON PRINTF_DEBUG
#endif

/*用于总的调试信息输出控制开关*/
#define PRINTF_DEBUG    1

#if (PRINTF_DEBUG && DEBUG_ON)
    #include "SEGGER_RTT.h"

    #define PRINTF_Dbg(fmt, ...)                                                        \
    do {                                                                                \
        SEGGER_RTT_printf(0,"file:%s,line:%d," fmt,__FILE__,__LINE__,##__VA_ARGS__);    \
    }while(0)

    #define PRINTF(...)                                                                 \
    do {                                                                                \
        SEGGER_RTT_printf(0,__VA_ARGS__);                                               \
    }while(0)
#else
    #define PRINTF_Dbg(...)
    #define PRINTF(...)
#endif
/***************************************************************/

#endif/*__RTT_DEBUG_H*/

在源码中按照如下方式使用即可:

/*必须放在debug头文件包含之前*/
#define DEBUG_ON 1
#include "debug.h"

int main(int argc, char *argv[])
{
    PRINTF("hello world!\n");

    return 0;
}
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值