Sơ lược lý thuyết về chức năng UART và một số thanh ghi trong chip STM32F103C8T6

UART – Universal asynchronous receiver transmitter là bộ truyền nhận nối tiếp bất đồng bộ. UART là một ngoại vi cơ bản trong chip STM32F103C8T6 thường được dùng trong các quá trình giao tiếp với các loại module như: Zigbee, Bluetooth, Wifi…

[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]

Dưới đây là khung truyền dữ liệu:

Khung truyền tín hiệu UART

Các khái niệm quan trọng trong chuẩn truyền thông UART:

Baudrate: Số bit truyền được trong 1s, ở truyền nhận không đồng bộ thì ở các bên truyền và nhận phải thống nhất Baudrate. Các thông số tốc độ Baudrate thường hay sử dụng dể giao tiếp với máy tính là 600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200.

Frame: Ngoài việc giống nhau của tốc độ baud 2 thiết bị truyền nhận thì khung truyền của bên cũng được cấu hình giống nhau. Khung truyền quy định số bit trong mỗi lần truyền, bit bắt đầu “Start bit”, các bit kết thúc (Stop bit), bit kiểm tra tính chẵn lẻ (Parity), ngoài ra số bit quy định trong một gói dữ liệu cũng được quy định bởi khung truyền. Có thể thấy, khung truyền đóng một vai trò rất quan trọng trong việc truyền thành công dữ liệu.

  • Idle frame: Đường truyền UART ở mức “1”, để xác nhận hiện tại đường truyền dữ liệu trống, không có frame nào đang được truyền đi.
  • Break frame: Đường truyền UART ở mức “0”, để xác nhận hiện tại trên đường truyền đang truyền dữ liệu, có frame đang được truyền đi.

Start bit: Bit đầu tiên được truyền trong một frame, bit này có chức năng báo cho bên nhận rằng sắp có một gói dữ liệu truyền đến. Đường truyền UART luôn ở trạng thái cao mức “1” cho đến khi chip muốn truyền dữ liệu đi thì nó gởi bit start bằng cách kéo xuống mức “0”. Như vậy start bit giá trị điện áp 0V và phải bắt buộc có bit start trong khung truyền

Data: Data hay dữ liệu là thông tin mà chúng ta nhận được trong quá trình truyền và nhận. Data trong STM32 có quy định khung truyền là 8bit hoặc 9bit. Trong quá trình truyền UART, bit có trọng số thấp nhất (LSB – least significant bit – bên phải) sẽ được truyền trước và cuối cùng là bit có ảnh hưởng cao nhất (MSB – most significant bit – bên trái)

Parity bit: Parity dùng để kiểm tra dữ liệu truyền có đúng hay không. Có 2 loại Parity đó là Parity chẵn (even parity) và parity lẽ (odd parity). Parity chẵn nghĩa là số bit 1 trong trong data truyền cùng với bit Parity luôn là số chẵn, ngược lại nếu Parity lẽ nghĩa là số bit 1  trong data truyền cùng với bit Parity luôn là số lẽ. Bit Parity không phải là bit bắt buộc và vì thế chúng ta có thể loại bỏ bit này ra khỏi khung truyền.

Stop bits: Stop bits là một bit báo cáo để cho bộ truyền/nhận biết được gói dữ liệu đã được gởi xong. Stop bits là bit bắt buộc phải có trong khung truyền. Stop bits có thể là 1bit, 1.5bit, 2bit, 0.5bit tùy thuộc vào ứng dụng UART của người sử dụng.

** Một số thanh ghi quan trọng trong UART

  1. USART_SR – Status register:

  • TXE : bit báo có data đã truyền hay không, =0 tức là data rỗng, có thể truyền, =1 data đã được truyền đi.
  • RXNE: bit báo data đã nhận hay chưa =1: đã nhận, =0 chưa nhận hoặc nhận chưa xong.
  • TC : cờ báo đã nhận data hoặc data vừa mới truyền xong.

     2. USART_DR – Data register: 

Thanh ghi này chứa Data nhận và Data truyền gồm 9bit. Và nó phụ thuộc vào trạng thái truyền hoặc nhận sẽ quyết định đó là data truyền hoặc data nhận.

      3. USART_BRR – Baud rate register:

Thanh ghi này chứa giá trị tốc độ baudrate được cài đặt. DIV_Mantissa[11:0] là thành phần trước dấu “,” và DIV_Freaction[3:0] là thành phần sau dấu phẩy của tốc độ baud được quy đổi theo bảng sau:

     4. USART_CRx – Control register:

  • UE: bit cho phép UART hoạt động.
  • M: độ dài của data là 8 hay 9 bit.
  • WAKE: phương pháp đáng thức UART là Idle line hoặc Address Mask.
  • PCE : cho phép hoặc không cho phép parity.
  • PS: chọn loại Parity chẵn hoặc lẻ.
  • PEIE: cho phép ngắt PE hay không ngắt.
  • TXEIE: cho phép ngắt truyền hay không.
  • TCIE: cho phép ngắt khi truyền/nhận xong hay không.
  • RXNEIE: cho phép ngắt nhận hay không.
  • TE: cho phép truyền hay không.
  • RE: cho phép nhận hay không.
  • RWU : cho phép thức tỉnh hay không khi nhận dc data từ bên ngoài.

    5. USART_GTPR – Guard time and prescaler register:

Thanh ghi này chúng ta chỉ quan tâm đến PSC[7:0] là những bit cho phép bộ chia clock trong UART từ clock hệ thống để từ đó chia tốc độ baud cho hợp lý.

Xem thêm: Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây.

Tapit R&D