历史上的今天
今天是:2024年09月05日(星期四)
2018年09月05日 | STM32两种输出调试信息的方法
2018-09-05 来源:eefocus
方式一:基于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发送数据。
这里提供一种输出可控的方式:
/*用于控制输出调试信息*/
#define PRINTF_DEBUG 1U
#if (PRINTF_DEBUG > 0U)
#define USE_RTT_PRINTF 1U
#if (USE_RTT_PRINTF > 0U)
#include "SEGGER_RTT.h"
/*基于 SEGGER_RTT 不能输出浮点,中文,等一些特殊字符(优点速度快可在中断中调用)*/
#define PRINTF_Dbg(...) \
do{\
SEGGER_RTT_printf(0,"file:%s,line:%d,",__FILE__,__LINE__);\
SEGGER_RTT_printf(0,__VA_ARGS__);\
}while(0);
#define PRINTF(...) \
SEGGER_RTT_printf(0,__VA_ARGS__);
#else
/*使用串口格式化到 printf 输出*/
#define PRINTF_Dbg(...) \
do{\
printf("file:%s,line:%d,",__FILE__,__LINE__);\
printf(__VA_ARGS__);\
}while(0);
#define PRINTF(...) \
printf(__VA_ARGS__);
#endif
#else
#define PRINTF_Dbg(...)
#define PRINTF(...)
#endif
需要查看调试信息时只需要打开宏PRINTF_DEBUG即可。
史海拾趣
|
大家好!我用的单片机是C8051F020,我的三个IO口出了问题,设置IO口是漏极开路状态,交叉开关也没问题,没有数字外设。有两个奇怪的现象 一。我写P2=0XFF;,在KEIL中看P2.7始终是0,其它口是1.量单片机P2.7引脚,引脚上也是0V电压,也就是说无法 ...… 查看全部问答> |
|
出问题的代码如下: #pragma memory = dataseg(DATA16_N) float fa; ... 我的本意是想把变量定义在非易失RAM中(0x200~5ff),在编译后,从第二句开始就提示如下警告信息: Warning[Be008]: a #pragma dataseg is active but is not applica××e to ...… 查看全部问答> |
|
我准备用28335控制PMSM电机,发现理论和实践有一些脱节,求指点。 1)控制对像有名值模型和标幺化模型的特性是不是一致的?比如零极点位置是不是完全一样。或者换个问法针对有名值模型和标幺化模型设计的补偿器是不是完全一样? ...… 查看全部问答> |
|
把51单片机红外遥控的程序改成能在Arduino编译环境中运行的程序 我是一个初学者,对于单片机的程序很迷糊,我想用红外遥控来控制一个机器人,板子是Arduino 2009 MEGA168,晶振16M,可是卖家给我的程序只有51单片机的,上面很多库函数 在Arduino的编译环境是没有的,下面是红外遥控的解码程序,烦请各位大神帮忙 ...… 查看全部问答> |




