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

发布者:SereneSerenity最新更新时间:2018-09-05 来源: eefocus关键字: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发送数据。



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


/*用于控制输出调试信息*/

#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即可。


关键字:STM32  调试信息 引用地址:STM32两种输出调试信息的方法

上一篇:STM32之调试支持(DBG)
下一篇:STM8S:Debug调试正常,烧录程序运行不正常

推荐阅读最新更新时间:2024-03-16 16:12

stm32 1.25DMips/MHz 什么意思?
1.Dhrystone是测量处理器运算能力的最常见基准程序之一,是程序的一个指令常用于处理器的整型运算性能的测量。 2.MIPS/MHz 表示 CPU 在多少MHz的运行速度下可以执行多少个MIPS,如10MIPS/MHz,表示如果CPU运行在1MHz的频率下,每秒可执行一千万条指令,如果CPU运行在5MHz的频率下,每秒可执行五千万条指令。 MIPS/MHz可以很好的反映CPU的运行速度。 所以1.25DMips/MHz就表示1秒每MHZ的速度能执行1.25M个Dhrystone指令。
[单片机]
<font color='red'>stm32</font> 1.25DMips/MHz 什么意思?
STM32 GPIO几个寄存器的理解
使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE- BSRR = 0x80; // 置'1' GPIOE- BRR = 0x80; // 置'0' 如果使用常规'读-改-写'的方法: GPIOE- ODR = GPIOE- ODR | 0x80; // 置'1' GPIOE- ODR = GPIOE- ODR & 0xFF7F; // 置'0' 有人问是否BSRR的高16位是多余的,请看下面这个例子: 假如你想在一个操作中对GPIOE的位7置&#
[单片机]
usmart_dev.init(SystemCoreClock/1000000); stm32 战舰的usmart 程序
usmart_dev.init(SystemCoreClock/1000000); //初始化USMART 对初始化程序的解析。对应 stm32 战舰的usmart 程序来分析 usmart_dev是_m_usmart_dev结构体的变量, usmart_dev结构体变量的初始化如下 struct _m_usmart_dev usmart_dev= { usmart_nametab, usmart_init, usmart_cmd_rec, usmart_exe, usmart_scan, sizeof(usmart_nametab)/sizeof(struct _m_usmart_nametab),//函数数量
[单片机]
STM32 F0:演绎MCU领域的物种进化论
“今天我们主要谈一谈遗传方面的东西。”若听到意法半导体的微控制器全球市场部总监Daniel Colonna的嘴里说出这句话,定是觉得一头雾水。没错,在意法半导体5月15日举办的新品发布会上谈论的就是这个话题。主角就是意法半导体要隆重推出的针对低端应用的STM32 F0系列入门型微控制器,那这又跟遗传学扯上什么关系了呢? 意法半导体的STM32家族又添新军,8位微控制器的终结者STM32 F0系列微控制器,基于超低功耗的ARM Cortex-M0架构,以彻底消除8/16位在应用上的局限性和性能差距为终极目标,可简化家电和工业控制应用开发任务。更重要的是,STM32 F0不仅仅是填补了STM32在低端应用领域的空缺,更是ST
[单片机]
<font color='red'>STM32</font> F0:演绎MCU领域的物种进化论
STM32之PWM波形输出配置
一. TIMER分类: STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 没有 TIM6 T
[单片机]
<font color='red'>STM32</font>之PWM波形输出配置
stm32 DMA数据搬运 操作寄存器+库函数
DMA(Direct Memory Access)常译为 存储器直接存取 。早在Intel的8086平台上就有了DMA应用了。 一个完整的微控制器通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成。如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的。如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据。。。这样的数据搬运工作将使CPU的负荷显得相当繁重。 严格的说,搬运数据只是CPU的比较不重要的一种工作。CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CP
[单片机]
<font color='red'>stm32</font> DMA数据搬运 操作寄存器+库函数
STM32之中断与事件一个使用GPIO作为外部中断的示例
1.GPIO 的正确设置 GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStru
[单片机]
基于STM32的半导体激光光源驱动器的设计方案
  0 引言   半导体激光器是实用中最重要的一类激光器。半导体激光器具有转换效率高、体积小、重量轻、可靠性高,能直接调制等优点。由于半导体激光器的这些优良特性,因而越来越广泛地被用于国防、科研、医疗、光通信等领域。由于半导体激光器的输出光强主要受电流和温度两个物理量影响,因此实现半导体激光器驱动电流和温度的精密控制十分重要。   本方案设计了一套完善的半导体激光器驱动控制系统。系统采用的微控制器是基于Cortex-M3内核的ARM微控制器STM32F103VCT6,其具有低成本、低功耗等特点,并以TEC驱动器MAX1968为执行器件,MAX1968能高效率工作以减小热量,而且体积小,系统外部元件少,因此设计的驱动器具有高性价
[单片机]
基于<font color='red'>STM32</font>的半导体激光光源驱动器的设计方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved