由于STM32cubemx生成的HAL库代码没有printf,为了让这个函数能实现打印功能,我们必须要把这个函数重定向,让它重定向到串口中,把要输出的内容打印到串口中。

一、STM32CubeMX配置串口

配置好时钟后,选择你的串口,生成代码。

二、修改代码——按如图顺序

进入到STM32xxxhal.c中,加入如下两条语句,你的huart是数字几,后面就修改成几

#include "stdio.h"

extern UART_HandleTypeDef huart2;

三、增加代码——如图所示

把如下代码添加在hal.c中,还是添加在STM32xxxhal.c中,我添加在154-170的位置。

   int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart2, &ch, 1, 0xffff);
  return ch;
}

三、使用MicroLIB库

在keil中点击魔术棒,如下按钮 ,进入项目参数设置界面,在Target下勾选上Usb MicroLIB

三、验证printf

验证一下
在main函数中添加如下代码:

非常好用!!!

2023.9.21修改

方法二:方法一如果用cubemx重新生成代码后,需要重新写入,很不方便很不方便,我就要累死

下面是方法二,生成代码之前都和上述步骤一样,生成代码后在usart.c中的begin 和end之间写入如下代码

usart.c

#include <stdio.h>

 #ifdef __GNUC__
     #define PUTCHAR_PROTOTYPE int _io_putchar(int ch)
 #else
     #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
 #endif /* __GNUC__*/
 
 /******************************************************************
     *@brief  Retargets the C library printf  function to the USART.
     *@param  None
     *@retval None
 ******************************************************************/
 PUTCHAR_PROTOTYPE
 {
     HAL_UART_Transmit(&huart3, (uint8_t *)&ch,1,0xFFFF);
     return ch;
 }

main.h中begin 和end之间加入 #include <stdio.h>如下

main.h

 #include <stdio.h>

大功告成!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐