STM32
直播中

郝埃连

7年用户 1395经验值
私信 关注
[问答]

为什么printf函数在单片机开发时用不了呢

为什么printf函数在单片机开发时用不了呢?是什么原因导致的?如何去解决这个问题呢?

回帖(1)

范志坚

2021-11-25 15:00:04
概述

我们在初学 C 语言的时候,第一句打印就是 printf("hello world") ,后面也经常用来调试打印信息,但是我们在单片机开发的时候 printf 就用不了,因为 printf 会打印在命令行窗口上,但是单片机上肯定没有,所以我们通过改写函数,将 printf 重定向到串口之上,然后通过串口调试助手来显示。


一. 改写函数

新建一个头文件 debug_com.h

#ifndef __DEBUG_COM_H
#define __DEBUG_COM_H


#ifdef __cplusplus
extern "C" {
#endif
   
#include "stdio.h"
#include "usart.h"
   
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
        
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
        return ch;
}


#ifdef __cplusplus
}
#endif




#endif


在使用 printf 的时候,其实最终也是调用 fputc 函数进行打印,因此我们可以通过添加以下代码来达成我们的目的:
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
注意: huart1 可以根据你使用的串口进行修改
之后将该头文件放到一个文件夹(比如 debug_com )里面,再放到项目目录下





再包含该头文件,如下图所示





之后在项目中使用 #include "debug_com.h" 就可以使用 printf 了
二. printf 使用实例

打印串口1中所用到的寄存器的首地址

//包含头文件
#include "debug_com.h"
1
2
//主函数中添加
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
       printf("huart1.Instance->SR %prn",&huart1.Instance->SR);
       printf("huart1.Instance->DR  %prn",&huart1.Instance->DR);
       printf("huart1.Instance->BRR %prn",&huart1.Instance->BRR);
       printf("huart1.Instance->CR1 %prn",&huart1.Instance->CR1);  
       printf("huart1.Instance->CR2 %prn",&huart1.Instance->CR2);
       printf("huart1.Instance->CR3 %prn",&huart1.Instance->CR3);
       printf("huart1.Instance->CTPR %prn",&huart1.Instance->GTPR);
       HAL_Delay(1000);     
       printf("rn");
  }


这样,我们就可以在调试助手上看到寄存器的地址值了





后续还会继续分享串口的其他基础知识和使用,感兴趣的小伙伴记得关注我
举报

更多回帖

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