由于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文章来源:https://www.toymoban.com/news/detail-751481.html
#include <stdio.h>
大功告成!!文章来源地址https://www.toymoban.com/news/detail-751481.html
到了这里,关于STM32-HAL库-printf函数重定向(简单易懂亲测有效)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!