Title Image

Blog Logo

🌱 STM32 - 12. UART Registers

🌱 STM32 - 12. UART Registers

    Ở 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. 

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

    👉 Thanh ghi USART_SR - Status Register

UART

    Thanh ghi này chứa các bit (cờ) trạng thái:

  • 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 sẽ 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, 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.

    👉 Thanh ghi USART_DR - Data Register

UART

    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.
    Thanh ghi này chỉ sử dụng 9 bit LSB để chứa dữ liệu (8 bit hoặc 9 bit).

    👉 Thanh ghi USART_BRR - USART Baudrate

UART

    Thanh ghi này dùng để tính toán tốc độ Baudrate cho UART với:

  • Các bit[11:0] - DIV_Mantissa: là thành phần đứng trước dấu phẩy.
  • Các bit[3:0] - DIV_Fraction: là thành phần đứng 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.

    👉 Thanh ghi USART_CR1 - Control Register 1

UART

    Thanh ghi này và 2 thanh ghi sau đều chứa các bit dùng để cấu hình cho USART:

  • Bit[15] - OVER8 (Oversampling Over): Dùng để cấu hình trong việc tính Baudrate.
    OVER8 = 0, oversampling by 8.
    OVER8 = 1, oversampling by 16.
  • Bit[14] - UE (USART Enable): Set lên 1 để cho phép ngoại vi USART hoạt động. 
  • Bit[13] - M (Word length): Xác định độ dài data truyền đi.
    M = 0, 1 Start bit, 8 Data bits, n Stop bit.
    M = 1, 1 Start bit, 9 Data bits, n Stop bit.
  • Bit[9] - PS (Parity Selection): Chọn bit chẵn/lẽ khi bit chẵn lẽ được cho phép (bằng bit PCE).
    PS = 0, even parity (chẵn).
    PS = 1, odd parity (lẻ).
  • Bit[7:5] - 3 bit này là các cờ báo ngắt, tương ứng với 3 bit TXE, TC, RXNE ở trên.

    UART
  • 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.

    👉 Thanh ghi USART_CR2 - Control Register 2


USART_CR2
  • Bit[13:12] - STOP: Cấu hình số bit Stop

    UART

    👉 Thanh ghi USART_CR3 - Control Register 3

UART
  • 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.

    👉 Thanh ghi USART_GTPR - Guard Time and Prescaler Register

 
   
    Thanh ghi này chủ yếu sử dụng các bit từ 0 đến 4 để tính toán tốc độ Baudrate.

>>>= 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 😊

                                        

Đăng nhận xét

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