9 Giới thiệu nguyên lý giao tiếp UART 
Kiến thức cơ bản về UART 
Giới thiệu về giao tiếp UART 
UART (Universal Asynchronous Receiver/Transmitter – Giao tiếp nối tiếp không đồng bộ) là một phương thức truyền dữ liệu từng bit một giữa vi xử lý và ngoại vi thông qua dây tín hiệu dữ liệu, dây GND và các dây điều khiển khác.
Mặc dù tốc độ truyền dữ liệu của UART chậm hơn so với giao tiếp song song, nhưng nó tiết kiệm dây: có thể dùng một dây để truyền và một dây để nhận dữ liệu cùng lúc.
Giao tiếp UART đặc biệt hiệu quả với truyền thông đường dài, giúp giảm chi phí hệ thống. Để hai thiết bị có thể giao tiếp được qua UART, chúng phải cấu hình giống nhau về các thông số sau:
- Tốc độ baud (Baud rate)
- Số bit dữ liệu
- Số bit dừng
- Bit kiểm tra chẵn lẻ (parity bit)
Giới thiệu các thông số UART 
- Baud rate (tốc độ baud): Là tốc độ truyền dữ liệu, tính bằng số bit truyền được mỗi giây (bit/s).
- Data bits (bit dữ liệu): Là số bit dữ liệu thực trong mỗi khung truyền. Thường là 8 bit.
- Stop bit (bit dừng): Được đặt ở cuối mỗi khung dữ liệu, dùng để báo hiệu kết thúc truyền. Có thể là 1, 1.5 hoặc 2 bit. Bit dừng cũng giúp đồng bộ lại xung nhịp giữa hai thiết bị. → Số bit dừng càng nhiều, khả năng đồng bộ sai càng thấp, nhưng tốc độ truyền sẽ chậm lại.
- Parity bit (bit kiểm tra chẵn/lẻ): Dùng để kiểm tra lỗi đơn giản, bằng cách đếm số bit 1 trong khung.
Parity bit (bit chẵn/lẻ) là một bit được thêm vào cuối dữ liệu để giúp kiểm tra lỗi khi truyền thông tin. Nó hoạt động bằng cách đếm số bit 1 trong dãy dữ liệu: nếu dùng even parity (kiểm tra chẵn) thì tổng số bit 1 (kể cả parity bit) phải là chẵn; còn nếu dùng odd parity (kiểm tra lẻ) thì tổng số bit 1 phải là lẻ.
Ví dụ: dãy dữ liệu 1011001 có 4 bit 1 → là số chẵn.
Nếu dùng even parity, ta giữ nguyên tính chẵn → thêm parity bit = 0 → dữ liệu gửi đi: 10110010
Nếu dùng odd parity, ta cần tổng là lẻ → thêm parity bit = 1 → dữ liệu gửi đi: 10110011
Bên nhận sẽ kiểm tra lại số bit 1 để biết dữ liệu có bị lỗi trong quá trình truyền hay không.
Chi tiết hơn có thể tra cứu thêm trên Wikipedia.
Các chế độ làm việc của UART 
- Simplex (Đơn công): Chỉ truyền dữ liệu theo một chiều, ví dụ: từ A → B.
- Half-duplex (Bán song công): Dữ liệu có thể truyền cả hai chiều, nhưng không đồng thời. Chỉ một thiết bị được truyền tại một thời điểm.
- Full-duplex (Song công toàn phần): Hai thiết bị truyền và nhận đồng thời trên hai kênh riêng biệt.
Dưới đây là bảng so sánh I2C, SPI, và UART về chế độ truyền thông (simplex, half-duplex, full-duplex) SPI và I2C sẽ học ở các bài sau:
Giao tiếp Chế độ truyền Chiều truyền Ghi chú ngắn gọn UART Full-duplex 2 chiều độc lập (TX/RX) Truyền nhận đồng thời qua 2 dây I2C Half-duplex 2 chiều nhưng không đồng thời Dùng chung 1 dây dữ liệu (SDA) cho gửi/nhận SPI Full-duplex 2 chiều đồng thời (MOSI/MISO) Gửi và nhận cùng lúc, nhưng có thể dùng như simplex nếu chỉ cần 1 chiều 
Giao thức truyền thông UART 
Khi giao tiếp bằng UART, dữ liệu sẽ được truyền theo dạng gói (data packet), với cấu trúc khung (frame) như hình minh họa bên dưới:

UART truyền dữ liệu từng bit một, và mỗi byte luôn được bao bọc theo định dạng cố định:
- Bắt đầu bằng bit khởi đầu (Start bit) – luôn là mức thấp (0).
- Tiếp theo là 8 bit dữ liệu (thường từ LSB đến MSB).
- Nếu bật tính năng kiểm tra lỗi, sẽ có thêm 1 bit kiểm tra chẵn/lẻ (Parity bit).
- Sau đó là bit dừng (Stop bit) – luôn ở mức cao (1). Có thể là 1, 1.5 hoặc 2 bit.
- Sau stop bit là giai đoạn nghỉ (Idle) – độ dài không cố định, nhưng cũng ở mức cao (1).
Không yêu cầu phải có khoảng thời gian cố định giữa các byte liên tiếp — các khung UART có thể gửi liền nhau hoặc có khoảng trễ tùy ý.
Tóm lại:
[Idle_1][Start Bit_0][Data Bits][Parity Bit (tùy chọn)][Stop Bit(s)_1][Idle_1]Toàn bộ quá trình đảm bảo đồng bộ hóa khung dữ liệu giữa bên gửi và bên nhận, dù không dùng chung xung nhịp (asynchronous).
Sơ đồ nguyên lý giao tiếp UART 
Trên bo mạch phát triển, **UART1 ** là giao tiếp UART mặc định được sử dụng.
Giao tiếp này sử dụng hai dây tín hiệu chính:
- USART1_TX: chân truyền dữ liệu
- USART1_RX: chân nhận dữ liệu
Hai chân này chia sẻ cùng một hàng chân (header) với chân dùng để nạp chương trình vào vi điều khiển.
Điều này có nghĩa là khi bạn sử dụng UART1 để giao tiếp với thiết bị ngoài (như máy tính qua USB-UART), bạn cần chú ý tránh xung đột với mạch nạp.
Sơ đồ nguyên lý cụ thể của cổng UART trên bo mạch được minh họa trong hình sau:
