Bài viết này sẽ giới thiệu với các bạn về chuẩn truyền thông UART, giúp vi điều khiển STM32 có thể giao tiếp với các thiết bị như máy tính, module ngoại vi, màn hình, module SIM và cảm biến. UART là một ngoại vi cơ bản của STM32, sử dụng 2 chân Rx và Tx để nhận và truyền dữ liệu.
Contents
Giới thiệu về UART
UART truyền dữ liệu không đồng bộ, điều này có nghĩa là không có tín hiệu để đồng bộ hóa đầu ra của các bit từ UART truyền đến việc lấy mẫu các bit bởi UART nhận. Thay vì tín hiệu đồng bộ, UART truyền thêm các bit start và stop vào gói dữ liệu được truyền. Các bit này xác định điểm bắt đầu và điểm kết thúc của gói dữ liệu để UART nhận biết khi nào bắt đầu đọc các bit.
Bạn đang xem: Lập trình UART với STM32 – Giao tiếp dễ dàng và nhanh chóng
Các thông số cơ bản trong truyền nhận UART:
- Baund rate (tốc độ baund): Khoảng thời gian dành cho 1 bit được truyền. Phải được cài đặt giống nhau ở gửi và nhận. Một số Baud Rate thông dụng: 9600, 38400, 115200, 230400,…
- Frame (khung truyền): Khung truyền quy định về số bit trong mỗi lần truyền.
- Start bit: là bit đầu tiên được truyền trong 1 Frame. Báo hiệu cho thiết bị nhận có một gói dữ liệu sắp được truyền đến. Bit bắt buộc.
- Data: dữ liệu cần truyền. Bit có trọng số nhỏ nhất LSB được truyền trước sau đó đến bit MSB.
- Parity bit: kiểm tra dữ liệu truyền có đúng không.
- Stop bit: là 1 hoặc các bit báo cho thiết bị rằng các bit đã được gửi xong. Thiết bị nhận sẽ tiến hành kiểm tra khung truyền nhằm đảm bảo tính đúng đắn của dữ liệu. Bit bắt buộc.
Hình ảnh: Kết nối STM32 với máy tính thông qua chip cổng COM
READ MORE:
Cách kết nối và cấu hình UART trên STM32
Để kết nối STM32 với máy tính, ta sử dụng các kênh USART có sẵn trên STM32F1 như sau:
- USART1:
- PA9 – USART1_TX
- PA10 – USART1_RX
- USART2:
- PA2 – USART2_TX
- PA3 – USART2_RX
- USART3:
- PB10 – USART3_TX
- PB11 – USART3_RX
Bây giờ, chúng ta sẽ tiến hành cấu hình USART1 trên STM32F1 như sau:
- Click vào USART1
- Chọn chế độ Asynchronous
- Tích vào USART1 global interrupt để sử dụng ngắt nhận USART
- Chân PA9 và PA10 sẽ lần lượt là USART1_TX và USART1_RX
Ở phần parameters settings, chúng ta sử dụng các thiết lập mặc định như sau:
- Baud Rate: 115200 bits/s
- Word Length: 8 bit
- Parity: None
- Stop Bits: 1
Code ví dụ
Sau khi đã cấu hình, chúng ta sẽ tiến hành viết code để truyền và nhận dữ liệu qua UART trên STM32F1.
Đầu tiên, chúng ta cần khai báo biến rx_data
để nhận dữ liệu và biến tx_data
để chứa dữ liệu truyền đi.
uint8_t rx_data;
uint8_t tx_data[20] = "STM32 Hello Man!!rn";
Tiếp theo, chúng ta sẽ truyền dữ liệu và cho phép ngắt nhận ở lần khởi động đầu tiên.
HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data), 100);
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
Sau đó, chúng ta sẽ viết code chương trình ngắt để nhận 1 byte từ cổng UART và gửi ngược lại.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
HAL_UART_Transmit(&huart1, &rx_data, sizeof(rx_data), 100);
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
}
}
Để sử dụng hàm printf, chúng ta cần thêm các bước sau:
- Include thư viện stdio.h ở đầu chương trình
- Khai báo prototypes:
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
- Nội dung hàm:
PUTCHAR_PROTOTYPE {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100);
return ch;
}
Sau đó, chúng ta có thể sử dụng printf bình thường. Ví dụ:
printf("STM32 hello from printfrn");
Xem thêm : Sự khác biệt giữa vi xử lý và vi điều khiển
Dưới đây là một số hàm liên quan đến UART:
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
: chương trình ngắtHAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data), 100)
: hàm truyền dữ liệuHAL_UART_Receive_IT(&huart1, &rx_data, 1)
: cho phép ngắt nhận
Đọc dữ liệu từ cổng UART trên máy tính
Để đọc dữ liệu từ cổng UART trên các hệ điều hành, bạn có thể sử dụng những phần mềm sau:
- Windows: Hercules, Serial Monitor (Arduino IDE)
- Linux: Minicom, Serial Monitor (Arduino IDE)
Dưới đây là kết quả sau khi nạp code và sử dụng Serial Monitor của Arduino IDE để nhận dữ liệu từ STM32:
READ MORE:
Kết luận
Trong bài viết này, chúng ta đã tìm hiểu về cách lập trình UART trên vi điều khiển STM32. Thông qua việc sử dụng các chân Rx và Tx, chúng ta có thể giao tiếp với các thiết bị ngoại vi và truyền nhận dữ liệu một cách dễ dàng và nhanh chóng. Việc có kiến thức về UART sẽ rất hữu ích trong việc phát triển các ứng dụng IoT và các dự án điện tử khác trên nền tảng STM32.
Nếu bạn quan tâm, bạn có thể tìm hiểu thêm về mã nguồn của ví dụ này trên Github.
Nguồn: cite.edu.vn
Nguồn: https://cite.edu.vn
Danh mục: Học tập