You are on page 1of 15

Lab4: UART – Universal Asynchronous Receiver Transmitter

1. Giới thiệu
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…
2. Cấu trúc frames

Khung truyền tín hiệu UART

3. 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.
o 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.
o 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.

Pages- 1
Lab4 - Thực hành Hệ Thống Nhúng
- 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
Pages- 2
Lab4 - Thực hành Hệ Thống Nhúng
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.

Pages- 3
Lab4 - Thực hành Hệ Thống Nhúng
4. Một số thanh ghi quan trọng trong UART
a. 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.
b. 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.

c. USART_BRR – Baud rate register:

Pages- 4
Lab4 - Thực hành Hệ Thống Nhúng
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:

d. 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.
e. 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ý.
5. Minh họa UART
a. Sơ đồ trong proteus

Pages- 5
Lab4 - Thực hành Hệ Thống Nhúng
b. Cấu hình trong STM32Cube MX
- Bước 1:Tạo project trên CubeMX

Pages- 6
Lab4 - Thực hành Hệ Thống Nhúng
- Bước 2: Cấu hình chân nạp code

- Bước 3: Chọn mode Asynchorous cho UART1 và cấu hình UART:


o Set tốc độ baudrate thông dụng là 9600

Pages- 7
Lab4 - Thực hành Hệ Thống Nhúng
- Bước 4: Chọn Project Manager
o Đặt tên project
o Chọn tool IDE

- Bước 5: Sinh code

- Bước 6: Khai báo 1 string char* str = “Helloword!!” để truyền từ MCU lên máy tính
thông qua usb TTL và phần mềm hiển thị dữ liệu là Hescules

Pages- 8
Lab4 - Thực hành Hệ Thống Nhúng
Ở đây chúng ta sẽ sử dụng hàm có sẵn trong thư viện HAL:

HAL_UART_Transmit(UART_HandleTypeDef* huart, uint8_t *pData, uint16_t Size, uint32_t


Timeout);

Ở đây bao gồm 4 thông số truyền vào:

- UART_HandleTypeDef* huart: UART hiện tại bạn đang sử dụng ví dụ ở bài này mình sẽ
truyền vào &huart1
- uint8_t *pData: Mảng ký tự dùng để truyền đi ví dụ ở bài này chúng ta đã khai váo 1
chuỗi kí tự str
- uint16_t Size: Số lượng kí tự được truyền đi
- uint32_t Timeout: Thời hạn kết thúc việc truyền dữ liệu

Pages- 9
Lab4 - Thực hành Hệ Thống Nhúng
- Bước 7: Nối dây Tx của MCU vào dây Rx của usb TTL vào ngược lại
o Mở phần mềm Hercules
o Chọn tốc độ baudrate là 9600

- Bước 8: Chuỗi dữ liệu đã được truyền đi và hiển thị trên phần mềm Hercules

6. Sử dụng Uart Interrupt RX với Cube MX


Việc nhận dữ liệu liên tục trong vòng while như vậy khiến cho MCU không thể làm được việc
khác được. Vì vậy, chúng ta sẽ sử dụng chức năng ngắt UART để nhận dữ liệu. Ở trong vòng lập
while(1) chúng ta sẽ làm nhiệm vụ cố định nào đó, khi có dữ liệu đến chân Rx của UART thì sẽ
nhảy vào hàm ngắt UART để nhận dữ liệu. Sau khi thực hiện xong tác vụ ngắt, MCU sẽ quay về
chương trình chính trong vòng lập while(1) để lại hoạt động bình thường.
a. Sơ đồ trong proteus

Pages- 10
Lab4 - Thực hành Hệ Thống Nhúng
b. Cấu hình trên STM32Cube MX
- Bước 1:Cấu hình chân GPIO_Output

- Bước 2: Cấu hình UART1 ở mode Asynchorous. Chọn tốc độ baudrate thông dụng là
9600

Pages- 11
Lab4 - Thực hành Hệ Thống Nhúng
- Bước 3: Chọn thanh NVIC Settings -> Enabled

- Bước 4: Cấu hình chân nạp code

- Bước 5:Setting project


Pages- 12
Lab4 - Thực hành Hệ Thống Nhúng
Đặt tên cho project và chọn công cụ IDE là MDK-ARM V5

- Bước 6: Chọn những thư viện thật sự cần thiết cho project này. Cấu hình xong và sinh
code.

- Bước 7:Khai báo mảng char Rx_data[2]; để nhận dữ liệu.


- Hàm ngắt nhận dữ liệu UART:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

Pages- 13
Lab4 - Thực hành Hệ Thống Nhúng
Vì chip STM32F103C8T6 có đến 3 UART vì vậy trong hàm ngắt chúng ta phải kiểm tra,
hiện tại chúng ta nhận dữ liệu từ UART nào:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

if(huart->Instance == UART1){

huart->Instance == UART1 là thực thể chúng ta truyền vào để xác nhận đang nhận ngắt
ở UART1

- Ở hàm main: Trước khi vào hàm while(1){} chúng ta sẽ khai báo ngắt nhân bằng
hàm HAL_UART_Receive_IT(&huart1, (uint8_t*) Rx_data, 1);

- Có 3 thông số truyền vào hàm này bao gồm:


o &huart1: UART1 chúng ta đang sử dụng

o (uint8_t*) Rx_data: Truyền vào địa chỉ của mảng Rx_data để nhận dữ liệu, còn
(uint8_t *) dùng để ép kiểu dữ liệu

o Size = 1: Số kí tự chúng ta nhận vào khi xảy ra ngắt

- Ở trong hàm ngắt: Chúng ta sẽ kiểm tra sẽ kiểm tra kí tự hiện tại nhận được có phải là kí
tự ‘a’ hay không, nếu đúng là kí tự ‘a’ thì chúng ta sẽ đảo trạng thái led, đồng lời truyền
ngược lại kí tự ‘a’ đã nhận lên trên máy tính và khai báo lại hàm ngắt
nhận HAL_UART_Receive_IT(&huart1, (uint8_t*) Rx_data, 1);. Sau mỗi lần ngắt
xảy ra, chúng ta phải khai báo lại hàm ngắt này để lần ngắt tiếp theo được thực thi, nếu
không khai báo lại hàm ngắt này trong chương trình ngắt thì chúng ta chỉ vào chương
trình ngắt đúng 1 lần.

Pages- 14
Lab4 - Thực hành Hệ Thống Nhúng
c.

Pages- 15
Lab4 - Thực hành Hệ Thống Nhúng

You might also like