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:
#ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch; }
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é
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: sonthientao@gmail.com sdt của mình: 0909 146779
#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é
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.