历史上的今天
返回首页

历史上的今天

今天是: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即可。


推荐阅读

史海拾趣

Avalon Photonics公司的发展小趣事

Avalon Photonics深知技术创新是公司发展的核心动力。因此,公司每年都将大量资金投入研发领域,不断推动技术创新。公司研发团队积极探索新技术、新材料,在光子学领域取得了多项重要突破。这些技术创新不仅提升了Avalon产品的竞争力,也为公司在市场上赢得了良好的声誉。

Armel Electronics Inc公司的发展小趣事

在电子行业中,技术更新迅速,创新是企业持续发展的动力。Armel Electronics Inc公司始终将研发创新作为公司的核心竞争力。公司不断投入资金,引进先进设备和技术,加强研发团队的建设。通过不断创新,Armel成功推出了一系列具有行业领先水平的新产品,为公司的持续发展提供了有力保障。

艾吉芯(Agertech)公司的发展小趣事

面对全球电子市场的激烈竞争,艾吉芯公司积极实施国际化战略。通过在海外设立研发中心和生产基地,艾吉芯成功将其先进的技术和优质的产品推向国际市场。同时,公司还积极参与国际行业交流和合作,不断提升自身的国际化水平和竞争力。

亿宝科技(CNIBAO)公司的发展小趣事

随着环保意识的不断提高,亿宝科技积极响应国家绿色发展的号召。公司引进先进的环保设备和技术,减少生产过程中的污染物排放。同时,亿宝科技还注重产品的环保性能设计,推出了一系列绿色电子产品。这些产品不仅符合国家的环保标准,还赢得了消费者的青睐和认可。在绿色发展的道路上,亿宝科技展现了企业的责任和担当。

Hitachi Metals公司的发展小趣事

自1956年成立以来,Hitachi Metals便逐步在电子材料领域建立了坚实的基础。公司早期便专注于研发和生产用于电子设备的核心部件,如磁性材料。随着电子行业的蓬勃发展,日立金属迅速抓住了市场机遇,推出了高性能的Nd-Fe-B系列烧结磁石和高性能铁氧体烧结磁石,这些材料广泛应用于计算机、半导体集成电路器件及平板显示屏等高科技产品中。凭借其卓越的产品质量和稳定的市场供应,Hitachi Metals在电子材料市场上赢得了广泛的认可。

顺芯(Everest-semi)公司的发展小趣事

在技术创新的同时,顺芯公司也注重市场拓展和品牌建立。公司积极参加国内外各类展会和论坛,与潜在客户和合作伙伴建立了广泛的联系。同时,顺芯公司还加强了与渠道商的合作,提高了产品的市场覆盖率。通过一系列的市场推广活动,顺芯公司的品牌知名度和美誉度逐渐提升。

问答坊 | AI 解惑

单片机IO口出现奇怪现象,求助!

大家好!我用的单片机是C8051F020,我的三个IO口出了问题,设置IO口是漏极开路状态,交叉开关也没问题,没有数字外设。有两个奇怪的现象 一。我写P2=0XFF;,在KEIL中看P2.7始终是0,其它口是1.量单片机P2.7引脚,引脚上也是0V电压,也就是说无法 ...…

查看全部问答>

用什么工具开发wm5.0的应用程序?

vs? 可以用什么语言?  用什么语言比较好?  谢谢…

查看全部问答>

问个硬件方面问题!

请问大家一个问题,自认为在eeworld是高手如林的地方! 865GV双通道(注意是865GV双通道)主板能用一条好的DDR内存带一条坏的DDR内存点亮主板,其它大部分主板都不行!请大家解析一下这其中的原因! 现在想求一个有865GV同样功能的上DDR2内存的主 ...…

查看全部问答>

单片机读取usb鼠标数据,并显示坐标

我想用单片机读取鼠标的数据,哪位大侠做过,程序能不接我看看啊。谢谢了。…

查看全部问答>

250元求一套TI 8962开发套件

新手上路求一套 LM3S8962开发套件,套件闲置,有意割爱的朋友请联系我。邮箱:jacmore@163.com 谢谢…

查看全部问答>

请教在V3.41中定义变量的问题

出问题的代码如下: #pragma memory = dataseg(DATA16_N) float fa; ... 我的本意是想把变量定义在非易失RAM中(0x200~5ff),在编译后,从第二句开始就提示如下警告信息: Warning[Be008]: a #pragma dataseg is active but is not applica××e to ...…

查看全部问答>

【问TI】关于标幺化的困惑,求指点

我准备用28335控制PMSM电机,发现理论和实践有一些脱节,求指点。   1)控制对像有名值模型和标幺化模型的特性是不是一致的?比如零极点位置是不是完全一样。或者换个问法针对有名值模型和标幺化模型设计的补偿器是不是完全一样?   ...…

查看全部问答>

把51单片机红外遥控的程序改成能在Arduino编译环境中运行的程序

我是一个初学者,对于单片机的程序很迷糊,我想用红外遥控来控制一个机器人,板子是Arduino 2009 MEGA168,晶振16M,可是卖家给我的程序只有51单片机的,上面很多库函数 在Arduino的编译环境是没有的,下面是红外遥控的解码程序,烦请各位大神帮忙 ...…

查看全部问答>