单片机
返回首页

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

2018-06-10 来源:eefocus

在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); 

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

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 非常简单的150W功放电路图

  • 基于IC555的可变PWM振荡器电路

  • 优化电路板布局的简单方法

  • 分享一个电网倾角计电路

    相关电子头条文章