stm32cubemx生成的HAL代码配置usart1使用printf打印数据
MX生成的HAL库代码没有printf,如果需要使用的话需要把标准库里的回调函数移植过去,这里提供了两个方法。
方法一
1、在生成的usart.c中的/* Includes ------------------------------------------------------------------*/下添加
#include “stdio.h”
不添加stdio.h会报FILE错误
————————————————————————————————————————
在测试过程中MX重新生成代码会删除usart.c中的#include “stdio.h”
把#include "stdio.h"添加到/* USER CODE BEGIN 0 */保护区就行了
————————————————————————————————————————
然后在usart.c代码保护区/* USER CODE BEGIN 0 */添加,不在保护区添加MX生成代码时会被删除,也不能自己手动添加保护区
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
/* With GCC, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART2 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
2、处理完usart.c以后我们回到mian.c中也在
————————————————————————————————————————
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */保护区中添加#include “stdio.h”
————————————————————————————————————————
不能添加在/* Includes ------------*/下,MX重新生成工程时会被删除
这里不添加会报printf错误
然后我们就可以在main中使用printf了
在main中定义一个参数
int count = 0;
在while中写个代码测试一下
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
printf("count = %d\r\n",count++);
}
/* USER CODE END 3 */
将上代码复制进工程里面,打开串口调试助手,如果调试代码没有出现错误,烧录完成之后,串口却没有显示,这个时候可能就需要调试硬件,尤其是连接电脑的端口,可换用不同的端口进行调试,自己在调试的时候就是因为这个电脑端口连接的问题,导致串口一直不显示。
方法二
这里提供了一种和网上不一样的printf使用方法,咱也是学习来的这里记录一下
生成工程以后在mian.c的保护区
/* USER CODE BEGIN PD */
/* USER CODE END PD */
中间添加
/* USER CODE BEGIN PD */
#define printf1(...) HAL_UART_Transmit(&huart1,\
(uint8_t *)u_buf,\
sprintf((char*)u_buf,__VA_ARGS__),\
0xffff)
/* USER CODE END PD */
还要在
/* USER CODE BEGIN PV */
/* USER CODE END PV */
中间定义u_buf才可以使用
/* USER CODE BEGIN PV */
uint8_t u_buf[256];
/* USER CODE END PV */
注意这里定义的和普通的printf多了一个1,是printf1
我们在下面的main函数的循环中调试一下printf1
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(2000);
printf1("123456789");
}
/* USER CODE END 3 */
在调试串口处就可以显示数据了