STM32输出调试信息-printf重定向到串口

发布者:数字小巨人最新更新时间:2018-06-10 来源: eefocus关键字:STM32  输出调试信息  printf重定  串口 手机看文章 扫描二维码
随时随地手机看文章

在STM32调试过程中常常需要将调试信息输出到串口,然后通过串口助手查看输出的调试信息。一般来说,串口输出的是指定长度的十六进制字节,对于想打印的调试信息来

说,略显灵活性不足。这时候如果可以将printf重定向到串口输出,则能很好的解决这个问题。

关于printf重定向的方法有很多种,这里只讨论一种我认为相对简单实用的方法。其主要方法步骤如下:

1、配置STM32的串口,确保STM32能输出数据到串口调试助手。

void USART5_Init(void)  

{  

    USART_InitTypeDef USART_InitStructure;  

    GPIO_InitTypeDef GPIO_InitStructure;  

    NVIC_InitTypeDef NVIC_InitStructure;  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO , ENABLE);  

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);  

  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

    GPIO_Init(GPIOC, &GPIO_InitStructure);  

  

    // Configure the USART1_Rx as input floating  

    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  

    GPIO_Init(GPIOD, &GPIO_InitStructure);  

  

    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;  

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

    NVIC_Init(&NVIC_InitStructure);  

  

    USART_InitStructure.USART_BaudRate = 115200;  

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;  

    USART_InitStructure.USART_StopBits = USART_StopBits_1;  

    USART_InitStructure.USART_Parity = USART_Parity_No;  

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  

  

    USART_ITConfig(UART5, USART_IT_RXNE, ENABLE); //Enable rx enable,   

    USART_ClearFlag(UART5, USART_IT_RXNE);  

    /* Configure the USARTx */   

    USART_Init(UART5, &USART_InitStructure);  

    /* Enable the USARTx */  

    USART_Cmd(UART5, ENABLE);  

}  

2、添加printf头文件#include

3、点击Keil中小魔术棒Target页勾选Use MicroLIB。

注:这个步骤必须有,否则代码编译通过后,进行仿真时会卡住,进入不了Main函数。printf、malloc等标准库函数在工程建立时,不勾选Use MicroLIB就会引起这类问题。

至此,就可以通过printf打印调试信息到串口助手了。

接下来关于输出调试信息再补充两点。

1、printf输出指定长度的字符串。

格式为printf("%.*s\n",strlen,str);

printf("指定长度字符串:%.*s\n",strlen,str);    //打印指令长度字节串 


2、打印十六进制数据。

当我们使用串口调试助手查看输出信息,如果我们查看的数据是十六进制类型,我们会勾选调试助手中的Hex显示选项。这时当数据量很大时,我们可能需要附加一些可见字符的说明,比如英文或者中文,这时在Hex显示下,这些字符辨识度比较低,甚至是乱码,printf辅助打印调试信息目的作用不大。这里可以选择一种方法,电脑串口助手不勾选Hex选项,而将要显示的十六进制数据转为可见的ASCII码格式。

如下为指定长度的十六进制数据转化为字符串的函数:

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

*函数功能:将十六进制数据转为字符串格式 

*参    数:In,十六进制数据;Len十六进制数据长度 

*          Out,输出字符串 

*返 回 值:无 

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

void HexToString(char *Out,char *In,char Len){  

    long i;  

    char Temp;  

    for(i=0;i

        Temp = In[i]>>4;  

        if(Temp>9)Out[2*i] = Temp + 'A' - 10;  

        else Out[2*i] = Temp + '0';  

        Temp = In[i] & 0x0F;  

        if(Temp>9)Out[2*i+1] = Temp + 'A' - 10;  

        else Out[2*i+1] = Temp + '0';  

    }  

    Out[2*i] = 0;  

}  

此时再调用printf即可打印出清晰的调试信息:

HexToString(DebugData,(char *)buffer,bufferlen);  

    printf("NTP发送:\n%s\r\n",DebugData); 

以上步骤根据调试成功后的结果总结。

关键字:STM32  输出调试信息  printf重定  串口 引用地址:STM32输出调试信息-printf重定向到串口

上一篇:stm32CubeMx上移植自己的printf()和scanf()函数
下一篇:STM32F103程序串口调用printf打印数据

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

stm32定时器之Output Compare
stm32f103vb发出逻辑信号给MOC3020,控制BTA16可控硅的通断。 在检测到过零信号时,延时x毫秒,输出1;延时y毫秒,关闭输出。 实现相位控制调速感应电机(小功率)。 在stm32 discovery开发板上,使用蓝灯和绿灯模拟。 采用定时器的OC,比较输出来做。 选用VBT6的一个Timer来做,它有4个通道可以使用,可以拿来控制4路可控硅输出。 使用CubeMX做外设配置。 针脚配置: 这样不把输出直接发送到Pin上。 能直接发送到Pin上,使用One Pulse Mode 比较方便。 受限于委托公司的设计限制,没法使用脉冲模式。 注意Prescaler的值, 值 = 时钟频率/1000
[单片机]
<font color='red'>stm32</font>定时器之Output Compare
stm32F4编码器测速并通过串口打印--- 程序源码
一、使用cubeMX软件对程序需要使用的端口和资源进行初始化。 为了保持程序的简洁性,这里仅使用一个串口和一路通用定时器。 (1)引脚的初始化 注:在引脚配置这里,是没有编码器模式的,不知道为什么。高级寄存器是由combined channels选项的。 这里先暂时选择为Input Capture direct mode,后面在针对具体的代码进行修改即可。 (2)时钟的配置 (3)串口资源的配置 (4)定时器的配置 (5)中断的配置 这里不适用串口来接收数据,所以串口的中断也不用打开。这里需要打开定时器的中断,在定时器发生上下计数溢出时,需要对进行记录,保证记录的准确性。 (6)最后生成的定时器初始化代码如下:
[单片机]
STM32 内部FLASH读写操作
关于STM32内部FLASH读写操作 单片机程序flash对应的内部地址。 falsh内部128bytes为一页,32页一个扇区。为了不会破坏到程序一般我们把要存的数据放后面,或者放到最后一页,来读取保存。STM32程序起始地址一般为0x08000000。 2.读取数据 //faddr 要读取的地址 uint16_t STMFLASH_ReadHalfWord ( uint32_t faddr ) { return *(__IO uint16_t*)faddr; } uint16_t STMFLASH_Read (uint32_t Addr ) { uint16_t Date =
[单片机]
stm32f2xx与stm32f10x在正交编码器应用定时器初始化中的区别
注意: 如果stm32f2xx系列上面的网址的代码要做适当修改。 以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。 随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。 这2个方式不选择,timer是不会有反应的 本人是stm32f207,花了4天惨痛代价。 以下贴代码: /* Private define ------------------------------------------------------------*/ #define ENCODER_TIMER TIM3 //
[单片机]
基于STM32的无线通讯终端系统的设计方案
1.引言 目前仪器设备多数采用RS232接口与计算机通信,但是随着计算机技术的发展,支持热插拔的USB标准接口将取代RS232接口,因此计算机将越来越少配置甚至不配置RS232接口。 实验证明,该系统的设计具有低成 本、高集成度和设计简单等优点,实现无线联网和组网功能,适于便携式电子设备的文件远端下载和上传,为诸如无线切割机、各类物联网掌上终端等设备的数据传输提供了解决方案。 RS232接口与USB接口虽然都属于串行接口,但它们的数据格式、通信协议、信号电平以及机械连 接方式则不同。这样计算机不能控制现有仪器设备,解决这一问题就得把现有的仪器设备的RS232接口转换成USB接口。实现这种转换可以采用 USB/RS232桥接器件如C
[电源管理]
基于<font color='red'>STM32</font>的无线通讯终端系统的设计方案
STM32掌机教程5,程序框架,随机,加命与升级
随机生成地鼠   随机数是游戏里边非常重要的组成部分,贪吃蛇随机刷新下一个食物,俄罗斯方块随机生成下一个方块,大富翁扔骰子,都是随机的。甚至微信群红包,金额也是随机的。正是因为这些事件不可预测,游戏才充满趣味性。我们地鼠的生成,当然也要随机。   然而,计算机产生的随机数,都是“伪随机”。伪,指的是说它是随机的,但是却都是有规律可循的。对于C语言,可以直接调用一个随机数生产函数srand()。但是这个函数需要种子。随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。也就是说,伪随机数也是某种对应映射的产物,而这个自变量就是种子。   如果你每次调用srand()时都提
[单片机]
迅为iTOP-4418开发板串口虚拟控制台配置为普通串口
如何将 iTOP-4418 的串口控制台配置为普通串口。在最终的产品中,如果需要额外的串口,可以将调试用的控制台串口作为普通串口使用,因为交付给最终用户手中的产品,一般不需要调试串口。屏蔽串口控制台需要做内核和文件系统的控制台屏蔽。注意:本文档中的 uboot 配置,也是为了屏蔽 uboot 设置的环境变量传递到内核和 android 系统中,本质上也是为了屏蔽内核和文件系统中的串口控制台。 1 内核配置 如下图所示,在 4418 的 android 源码目录中,使用命令“cd kernel”进入内核源码目 录,使用“export ARCH=arm”命令配置目标平台为 arm,接着使用“make menuconfig”命令(注意操
[单片机]
迅为iTOP-4418开发板<font color='red'>串口</font>虚拟控制台配置为普通<font color='red'>串口</font>
串口通讯的概念及接口电路
  随着计算机系统的应用和微机网络的发展,通信功能越来越显的重要。这里所说的通信是只计算机与外界的信息交换。因此,通信既包括计算机与外部设备之间,也包括计算机和计算机之间的信息交换。由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。所以串行接口是微机应用系统常用的接口。 许多外设和计算机按串行方式进行通信,这里所说的串行方式
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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