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é
Sau đó, để sử dụng printf chúng ta thêm thư viện <stdio.h> vào main.c
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.
Kết nối UART với USB-UART và phần mềm Hercules Terminal để test nhé
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é.
Sao mình làm y chang mà không được , anh ở đâu và cho mình xin sđt được không ạ? email: [email protected] sdt của mình: 0909 146779
Mình sửa lại rồi nhé, SR mọi ngườ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 ạ
tùy thuộc vào IDE của em nhé
Sr, anh fix lại rồi nhé
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.