Lập trình UART với STM32 – Giao tiếp dễ dàng và nhanh chóng

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.

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.

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.

Kết nối STM32 với máy tính thông qua cổng COM
Hình ảnh: Kết nối STM32 với máy tính thông qua chip cổng COM

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:

  1. Click vào USART1
  2. Chọn chế độ Asynchronous
  3. Tích vào USART1 global interrupt để sử dụng ngắt nhận USART
  4. Chân PA9 và PA10 sẽ lần lượt là USART1_TX và USART1_RX

Cấu hình USART1 trên STM32

Ở 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

Thiết lập các thông số truyền nhận UART trên STM32

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");

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ắt
  • HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data), 100): hàm truyền dữ liệu
  • HAL_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:

Kết quả đọc dữ liệu từ cổng UART trên máy tính

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

FEATURED TOPIC

hihi