STM32
直播中

自我清欢

9年用户 932经验值
擅长:可编程逻辑 模拟技术 EMC/EMI设计 光电显示 存储技术
私信 关注
[问答]

如何去重定义STM32的printf类似函数呢

如何去重定义STM32的printf类似函数呢?如何对其功能进行调试呢?

回帖(1)

张霞

2021-11-30 11:15:23
最近在朋友那学到了如何重定义STM32的printf类似函数,在这做下记录:
调用C语言库函数文件具体是哪一个我忘记了,都加上吧  ^_^
#include                         //uart redirect fputc
#include                         //copy function
#include                         //va_start /vsnprintf /va_end function

1、功能函数:


#define DEBUG_UART                &huart2                //串口调试口


/******************************************************************************************
*** 函数名称: Debug_Printf
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:自定义串口 printf功能
*** 功能说明:
***        编者                                                                                时间                                                             版本
***        XX                                                                                2020/12/8                                                                V0.1
******************************************************************************************/
void Debug_Printf(UART_HandleTypeDef *huart, char *format, ...)
{
        uint8_t uart_buff[256];
        uint8_t *pStr = uart_buff;       
        uint16_t delay_max;       
        va_list ap;
       
        va_start(ap, format);                                                                //初始化 ap 变量
        vsnprintf((char *)pStr, sizeof(uart_buff), format, ap);                //可变参数。用于向字符串中打印数据、数据格式用户自定义
        va_end(ap);                                                                                                        //允许使用了 va_start 宏的带有可变参数的函数返回
       
        while((*pStr) != '')
        {
                delay_max =0;
                HAL_UART_Transmit(huart, (uint8_t *)pStr, 1, 0xFFFF);       
                while(__HAL_UART_GET_FLAG(huart,UART_FLAG_TC) != SET)                        //等待发送完成
                {
                        if(delay_max >0xFFF) break;
                        delay_max++;
                }
                pStr++;                                                                                    //address data add
        }       
}
2、功能测试:

void test(void)
{

        uint8_t test_value[5];
        float test_float;
       
        test_value[0] = 'A';
        test_value[1] = 'b';
        test_value[2] = 88;
        test_float = 66.66;
       
        Debug_Printf(DEBUG_UART, "test  string                 rn");
        Debug_Printf(DEBUG_UART, "test   char: %c  rn",        test_value[0]);
        Debug_Printf(DEBUG_UART, "test   char: %c  rn",        test_value[1]);
        Debug_Printf(DEBUG_UART, "test    int: %d rn",        test_value[2]);
        Debug_Printf(DEBUG_UART, "test  float: %.2f rn",        test_float);

}
3、调试


举报

更多回帖

发帖
×
20
完善资料,
赚取积分