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
4set 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
模拟串口使用printf函数
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
17return 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 */
2while (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
90xffff)
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 */
2while (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
可以看到在串⼝助⼿打印了数据
这⾥就不解释代码的意思了,主要是简单的使⽤