Hướng dẫn sử dụng printf với STM32 Uart để in Log trên Keil C

Sử dụng hàm printf để in Log khi Debug tren STM32

Trong bài này chúng ta sẽ học cách retarget hàm printf của thư viện stdio với uart để thuận tiện cho việc truyền dữ liệu. Việc sử dụng printf sẽ làm đơn giản hơn khâu in Log để debug hoặc làm các tác vụ khác cần xử lý chuỗi

Bài 22 trong Serie Học lập trình STM32 từ A tới Z

Tại sao chúng ta nên sử dụng printf

Thông thường chúng ta sẽ sử dụng Uart để giao tiếp với máy tính hoặc các ngoại vi khác.
Nếu sử dụng uart in ra 1 chuỗi (String) chúng ta cần khởi tạo 1 String hoặc Array, sau đó dùng sprintf để nối các chuỗi và giá trị khác nhau vào. Rồi mới gửi đi thông qua hàm UART_Transmit

Điều này làm tăng thao tác lập trình và có thể sảy ra lỗi nếu ko xóa các String hoặc Array đó đi dùng cho lần sau.

Khi các bạn debug chương trình, có một kĩ năng là in Log (nhật kí chương trình), giúp cho lập trình viên hiểu được tiến trình của hệ thống. Và khi in Log chúng ta thường sử dụng String, nếu sử dụng hàm UART thì rất khó khăn và mất thời gian

Vậy nên thông thường, chúng ta nên retarget lại hàm printf để xuất chuỗi qua UART đơn giản hơn.

Hướng dẫn retarget printf trên Keil C

Đầu tiên tạo một project với 1 cổng UART, phần này các bạn đọc kĩ trong bài Lập trình STM32 UART nhé

set uart

Sau đó, để sử dụng printf chúng ta thêm thư viện <stdio.h> vào main.c

include stdio

Cuối cùng retarget hàm fput bằng các lệnh sau:


#if defined(__GNUC__)
int _write(int fd, char * ptr, int len) {
  HAL_UART_Transmit( & huart1, (uint8_t * ) ptr, len, HAL_MAX_DELAY);
  return len;
}
#elif defined(__ICCARM__)#include "LowLevelIOInterface.h"

size_t __write(int handle,
  const unsigned char * buffer, size_t size) {
  HAL_UART_Transmit( & huart1, (uint8_t * ) buffer, size, HAL_MAX_DELAY);
  return size;
}
#elif defined(__CC_ARM)
int fputc(int ch, FILE * f) {
  HAL_UART_Transmit( & huart1, (uint8_t * ) & ch, 1, HAL_MAX_DELAY);
  return ch;
}
#endif

 

Ok.Vậy là bây giờ chúng ta có thể sử dụng printf để in dữ liệu ra rồi.

retarget printf stm32

Kết nối UART với USB-UART và phần mềm Hercules Terminal để test nhé

Hercules terminal with uart stm32

Hoặc các bạn có thể sử dụng thư viện printf_uart, down load ở link sau:

https://github.com/nguyenkhue2608/STM32-Hal-CubeMx-and-KeilC

Kết

Printf là một hàm rất tiện lợi khi làm việc với các chuỗi. Hi vọng sau bài này các bạn sẽ biết cách sử dụng nó với STM32, giúp quá trình Debug trở nên đơn giản hơn.

Nếu bạn thấy bài viết này có ích hãy để lại bình luận và đừng quên ra nhập Hội Anh Em Nghiện Lập trình nhé.

5/5 - (2 bình chọn)

6 những suy nghĩ trên “Hướng dẫn sử dụng printf với STM32 Uart để in Log trên Keil C

  1. Hoà nói:

    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    cho em hỏi sao cái dòng này của em lại bị mờ ạ, ad có thể cho em xin cách fix được không ạ

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *