Insert title here

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生成代码时会被删除,也不能自己手动添加保护区

 1 /* USER CODE BEGIN 0 */
 2 #ifdef __GNUC__
 3 /* With GCC, small printf (option LD Linker->Libraries->Small printf
 4 set to 'Yes') calls __io_putchar() */
 5 #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
 6 #else
 7 #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
 8 #endif /* __GNUC__ */
 9 
10 
11 PUTCHAR_PROTOTYPE
12 {
13 /* Place your implementation of fputc here */
14 /* e.g. write a character to the USART2 and Loop until the end of transmission */
15 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
16 
17 return ch;
18 }
19 /* USER CODE END 0 */
printf代码

 

2、处理完usart.c以后我们回到mian.c中也在

————————————————————————————————————————

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */保护区中添加#include "stdio.h"

————————————————————————————————————————

不能添加在/* Includes ------------*/下,MX重新生成工程时会被删除

这里不添加会报printf错误

然后我们就可以在main中使用printf了

在while中写个代码测试一下

 1   /* USER CODE BEGIN WHILE */
 2   while (1)
 3   {
 4     /* USER CODE END WHILE */
 5 
 6     /* USER CODE BEGIN 3 */
 7         HAL_Delay(1000);
 8         printf("123!\r\n");
 9   }
10   /* USER CODE END 3 */
测试一下代码

这里就不截图串口助手中的图片了,效果是1秒打印次

 

方法二

这里提供了一种和网上不一样的printf使用方法,咱也是学习来的这里记录一下

生成工程以后在mian.c的保护区

/* USER CODE BEGIN PD */

/* USER CODE END PD */

中间添加

 1 /* USER CODE BEGIN PD */
 2 
 3   #define printf1(...) HAL_UART_Transmit(&huart1,\
 4 
 5  (uint8_t *)u_buf,\
 6 
 7 sprintf((char*)u_buf,__VA_ARGS__),\
 8 
 9 0xffff)
10 
11 /* USER CODE END PD */
printf1

 还要在

/* USER CODE BEGIN PV */

/* USER CODE END PV */

中间定义u_buf才可以使用

1 /* USER CODE BEGIN PV */
2 uint8_t u_buf[256];
3 /* USER CODE END PV */
u_buf

 

 

注意这里定义的和普通的printf多了一个1,是printf1

 

我们在下面mian函数的循环里面调用一下测试

 1   /* USER CODE BEGIN WHILE */
 2   while (1)
 3   {
 4     /* USER CODE END WHILE */
 5 
 6     /* USER CODE BEGIN 3 */
 7         HAL_Delay(2000);
 8         printf1("123456789");
 9   }
10   /* USER CODE END 3 */
while

可以看到在串口助手打印了数据

这里就不解释代码的意思了,主要是简单的使用

 

posted @ 2020-03-19 11:13  这一切足够了  阅读(3509)  评论(0编辑  收藏  举报
复制代码