🌱 STM32 - 12. Các Thanh Ghi Ngoại Vi UART Trong Vi điều khiển STM32

🌱 STM32 - 12. Các Thanh Ghi Ngoại Vi UART Trong Vi điều khiển STM32

    Ở post trước mình đã giới thiệu tổng quan về USART trong vi điều khiển STM32. Trong post này mình sẽ giới thiệu về các thanh ghi sử dụng với ngoại vi USART trong vi điều khiển STM32F401. Nhưng điều các bạn cần nắm được khi đọc về các thanh ghi trong tài liệu Reference Manual, đó là: Với ngoại vi này có những thanh ghi nào? Những bit chức năng chính trên các thanh ghi đó, giá trị khi reset của các thanh ghi (tức là giá trị mặc định của từng bit khi chưa cấu hình), và địa chỉ offset của các thanh ghi để phục vụ cho việc viết chương trình.

STM32F401 NUCLEO Board

Hình 1: Board STM32F401 NUCLEO với các chân GPIO

    Mình sẽ giới thiệu các thanh ghi theo trình tự đặt trong STM32F401 Reference Manual, cũng là tăng theo địa chỉ Offset.

👉 Thanh ghi USART_SR - Status Register

UART

Hình 1: Thanh ghi USART_SR - Status Register

    Thanh ghi này chứa các bit (cờ) trạng thái:
- Địa chỉ offset: 0x00
- Giá trị reset: 0x00C00000 (bit 23 và 24 mặc định là 1)

  • Bit[9] - CTS: Cờ thay đổi trạng thái CTS (Clear To Send). Set bằng 1 khi có thay đổi trên chân CTS.
  • Bit[8] - LBD: Cờ ngắt LIN Break Detection. Set bằng 1 khi phát hiện break trong chế độ LIN.
  • Bit[7] - TXE (Transmit data register empty): Dùng để báo hiệu data đã truyền đi hay chưa.
    - Khi các bit data truyền hết từ thanh ghi data sang thanh ghi dịch (thanh ghi data rỗng) thì bit này tự động được set lên 1.
    - Khi ta ghi dữ liệu vào thanh ghi data DR, bit này tự động set về 0.
  • Bit[6] - TC (Transmission Complete): Bit này tự động set lên 1 khi thanh ghi data truyền hết dữ liệu sang thanh ghi dịch, và bit TXE được set lên 1. Khác với bit TXE là bit này có thể được xóa bằng phần mềm (ghi 0 vào), thường ứng dụng trong việc giao tiếp đa bộ đệm.
  • Bit[5] - RXNE (Read data register not empty): Dùng để báo hiệu xem data đã được nhận hay chưa?
    - RXNE = 1, tức là data đã được truyền xong và sẵn sàng được đọc.
    - RXNE = 0, tức là data chưa nhận được hoặc chưa nhận xong.
    - Có thể xóa bằng cách đọc thanh ghi DR hoặc ghi 0 vào bit này.
  • Bit[4] - IDLE: Cờ báo đường truyền không hoạt động (Idle Line Detected). Set bằng 1 khi phát hiện trạng thái idle trên đường RX.
  • Bit[3] - ORE (Overrun Error): Cờ lỗi tràn dữ liệu. Set bằng 1 khi dữ liệu mới đến trong khi dữ liệu cũ chưa được đọc.
  • Bit[2] - NF (Noise Flag): Cờ phát hiện nhiễu trên đường truyền. Set bằng 1 khi phát hiện nhiễu.
  • Bit[1] - FE (Framing Error): Cờ lỗi khung truyền. Set bằng 1 khi phát hiện lỗi định dạng khung.
  • Bit[0] - PE (Parity Error): Cờ lỗi chẵn lẻ. Set bằng 1 khi phát hiện lỗi parity.

👉 Thanh ghi USART_DR - Data Register

UART

Hình 2: Thanh ghi USART_DR - Data Register

    Thanh ghi này chứa dữ liệu truyền và nhận, nó làm cả 2 nhiệm vụ này, và tùy thuộc vào trạng thái của ngoại vi là đang truyền hay đang nhận, nó sẽ giao tiếp với các bộ đệm dữ liệu truyền/nhận:

  • Địa chỉ offset: 0x04
  • Giá trị reset: Không xác định (undefined)
  • Thanh ghi này chỉ sử dụng 9 bit LSB để chứa dữ liệu (8 bit hoặc 9 bit tùy cấu hình ở bit M của USART_CR1).

Bits[8:0] - DR[8:0]: Data value (8 hoặc 9 bit tùy cấu hình)
    

👉 Thanh ghi USART_BRR - Baudrate Register

UART

Hình 3: Thanh ghi USART_BRR - Baudrate Register

    Thanh ghi này dùng để tính toán tốc độ Baudrate cho UART:
- Địa chỉ offset: 0x08
- Giá trị reset: 0x0000

  • Bits[15:4] - DIV_Mantissa[11:0]: Thành phần nguyên của USARTDIV (phần trước dấu phẩy).
  • Bits[3:0] - DIV_Fraction[3:0]: Thành phần thập phân của USARTDIV (phần sau dấu phẩy).

    Các tính toán Baudrate cụ thể mình sẽ dành riêng một post sau để nói kỹ hơn. Công thức cơ bản: Baudrate = f_CK / (8 * (2 - OVER8) * USARTDIV).

👉 Thanh ghi USART_CR1 - Control Register 1

UART

Hình 4: Thanh ghi USART_CR1 - Control Register 1

    Thanh ghi này chứa các bit dùng để cấu hình cho USART:
- Địa chỉ offset: 0x0C
- Giá trị reset: 0x0000

  • Bit[15] - OVER8 (Oversampling Over): Dùng để cấu hình trong việc tính Baudrate.
    - OVER8 = 0: Oversampling by 16 (mặc định).
    - OVER8 = 1: Oversampling by 8.
  • Bit[13] - UE (USART Enable): Set lên 1 để cho phép ngoại vi USART hoạt động.
  • Bit[12] - M (Word length): Xác định độ dài data truyền đi.
    - M = 0: 1 Start bit, 8 Data bits, n Stop bit (mặc định).
    - M = 1: 1 Start bit, 9 Data bits, n Stop bit.
  • Bit[10] - PCE (Parity Control Enable): Cho phép kiểm tra chẵn lẻ.
    - PCE = 0: Không kiểm tra parity.
    - PCE = 1: Kiểm tra parity.
  • Bit[9] - PS (Parity Selection): Chọn bit chẵn/lẽ khi bit PCE = 1.
    - PS = 0: Even parity (chẵn).
    - PS = 1: Odd parity (lẻ).
  • Bit[8] - PEIE (Parity Error Interrupt Enable): Cho phép ngắt khi có lỗi parity.
  • Bit[7] - TXEIE (TXE Interrupt Enable): Cho phép ngắt khi TXE = 1.
  • Bit[6] - TCIE (Transmission Complete Interrupt Enable): Cho phép ngắt khi TC = 1.
  • Bit[5] - RXNEIE (RXNE Interrupt Enable): Cho phép ngắt khi RXNE = 1.
  • Bit[3] - TE (Transmitter Enable): Set bằng 1 để cho phép truyền dữ liệu.
  • Bit[2] - RE (Receiver Enable): Set bằng 1 để cho phép nhận dữ liệu.
UART

Hình 5: Chi tiết các bit ngắt trong USART_CR1

👉 Thanh ghi USART_CR2 - Control Register 2

USART_CR2

Hình 6: Thanh ghi USART_CR2 - Control Register 2

    Thanh ghi này chứa các bit cấu hình bổ sung:
- Địa chỉ offset: 0x10
- Giá trị reset: 0x0000

  • Bit[13:12] - STOP[1:0]: Cấu hình số bit Stop.
    - 00: 1 Stop bit (mặc định).
    - 01: 0.5 Stop bit.
    - 10: 2 Stop bits.
    - 11: 1.5 Stop bits.
  • Bit[11] - LINEN: Cho phép chế độ LIN (Local Interconnect Network).
  • Bit[5] - CLKEN: Cho phép tín hiệu clock trong chế độ đồng bộ.
UART

Hình 7: Các giá trị của bit STOP trong USART_CR2

👉 Thanh ghi USART_CR3 - Control Register 3

UART

Hình 8: Thanh ghi USART_CR3 - Control Register 3

    Thanh ghi này chứa các bit điều khiển bổ sung:
- Địa chỉ offset: 0x14
- Giá trị reset: 0x0000

  • Bit[11] - ONEBIT: Chọn chế độ lấy mẫu 1 bit (One Sample Bit).
    - 0: Lấy mẫu 3 bit.
    - 1: Lấy mẫu 1 bit.
  • Bit[10] - CTSIE: Cho phép ngắt khi CTS thay đổi.
  • Bit[9] - CTSE: Cho phép điều khiển dòng phần cứng CTS.
  • Bit[8] - RTSE: Cho phép điều khiển dòng phần cứng RTS.
  • Bit[7] - DMAT: DMA Enable Transmitter. Set lên 1 để cho phép truyền dữ liệu bằng DMA.
  • Bit[6] - DMAR: DMA Enable Receiver. Set lên 1 để cho phép nhận dữ liệu bằng DMA.
  • Bit[3] - HDSEL: Chọn chế độ Half-Duplex (nửa song công).
  • Bit[0] - EIE: Cho phép ngắt khi có lỗi (ORE, NF, FE).

👉 Thanh ghi USART_GTPR - Guard Time and Prescaler Register

Hình 9: Thanh ghi USART_GTPR - Guard Time and Prescaler Register

    Thanh ghi này chủ yếu sử dụng trong chế độ Smartcard và IrDA:
- Địa chỉ offset: 0x18
- Giá trị reset: 0x0000

  • Bit[15:8] - GT[7:0]: Guard Time value (thời gian bảo vệ giữa các khung trong chế độ Smartcard, tính bằng số chu kỳ baud).
  • Bit[7:0] - PSC[7:0]: Prescaler value (bộ chia tần trước khi tạo Baudrate trong chế độ IrDA hoặc Smartcard).

>>>>>> Follow ngay <<<<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

5 Nhận xét

  1. Những bài viết về register của bạn rất hay , cảm ơn bạn nhiều nhé !

    Trả lờiXóa
  2. Em có 1 câu hỏi mong được anh giải đáp ạ! Cụ thể như sau: Nếu giờ em đang có uart1, nhưng em muốn config ra thành 2 bộ Tx Rx ở 2 chân khác nhau, thì liệu nó có thực hiện được không ạ? Ý tưởng trong đầu e thì chỉ là có 1 flag để switch giữa 2 mode, và 2 bộ Tx Rx đấy đều là uart1, nó sẽ hoạt động độc lập và không cùng 1 thời điểm ấy anh

    Trả lờiXóa
    Trả lời
    1. Hoàn toàn được em nhé, trong STM32 có nhiều chân support cùng chức năng UART1 mà, phần này em xử lý hoàn toàn bằng software là được

      Xóa
Mới hơn Cũ hơn
//