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

可以看到在串口助手打印了數據

這里就不解釋代碼的意思了,主要是簡單的使用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM