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)
0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest

6 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Sơn
Sơn
2 năm trước

Sao mình làm y chang mà không được , anh ở đâu và cho mình xin sđt được không ạ? email: sonthientao@gmail.com sdt của mình: 0909 146779

Hoà
Hoà
1 năm trước

#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 ạ

Q
Q
1 năm trước

A ơi anh có thể hướng dẫn các đọc con cảm biến màu TCS34725 bằng STM32F103 trên keil c không ạ, em cảm ơn.