You are on page 1of 22

BỘ THÔNG TIN VÀ TRUYỀN THÔNG

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

BÀI TẬP LỚN


MÔN KỸ THUẬT VI XỬ LÝ
ĐỀ TÀI 15: SỬ DỤNG USART ĐỂ KIỂM TRA KÝ TỰ NHẬP
VÀO VÀ ĐIỀU KHIỂN LED

TÊN NHÓM 15
THÀNH VIÊN NHÓM NGUYỄN MẠNH VIỆT – B19DCVT433

Thái Bình – 11/2021


Phân chia công việc:
Nguyễn Mạnh Việt : Phụ trách tìm tài liệu, viết báo cáo, phụ trách code và mô
phỏng trên proteus.

1
MỤC LỤC
LỜI NÓI ĐẦU………………………………………………….……………… 3

CHƯƠNG I. Tìm hiểu chung về giao tiếp USART…………….……………… 4

1.1..USART là gì?...................................................................................... 4

1.2..Các thông số quan trọng khi giao tiếp USART……….………….…. 6

1.3..USART với STM32………………………………….…………. 7

…... 8

CHƯƠNG II.Làm việc với USART qua thanh ghi…………….……………. 8

…. 8

2.1..Các thanh ghi quan 9

trọng……………………………………………. 9

2.1.1..Thanh ghi 9

SR……………………………………………….. 11

2.1.2..Thanh ghi DR………………………………………………. 13

2.1.3..Thanh ghi 14

BRR……………………………………………...

2.1.4 Thanh ghi

CR1……………………………………………….

2.2..Quá trình truyền nhận

USART………………………………………

2.3..Các bước cấu hình cho

USART……………………………………...

2
CHƯƠNG III..Mô phỏng trên

proteus…………………………………………..

3
LỜI NÓI ĐẦU
Trong thời kì công nghệ 4.0, cùng với sự đi lên của đời sống xã hội, các đồ
dùng điện tử đang là một phần không thể thiếu trong đời sống hiện đại từ máy vi
tính, đồng hồ, đèn led,… Chúng xuất hiện mọi nơi bên cạnh chúng ra.

Mặc dù ai cũng được tiếp cận thường xuyên, ai cũng biết cách sử dụng
nhưng không phải ai cũng biết được cách vận hành tưởng như rất đơn giản của
chúng. Nhằm giải quyết vấn đề đó và đem lại kỹ năng nhất định cho sinh viên về
việc làm quen và giao tiếp với các linh kiện điện tử, Học viện Công nghệ Bưu
chính Viễn thông đã đem bộ môn Kỹ thuật Vi xử lý vào quá trình dạy và học
của sinh viên Học viện, đáp ứng nhu cầu công việc trong tương lai.

Kỹ thuật vi xử lý là môn học thú vị và bổ ích trong chương trình giảng dạy
của Học viện Công nghệ Bưu chính Viễn thông. Nó giúp chúng em có những
kiến thức chuyên ngành nhất định, giúp chúng em tự tin, vững bước hơn khi ra
khỏi mái trường! Tuy nhiên, vì số đơn vị học trình quá ít cùng thời gian học tập
hoàn toàn là hình thức trực tuyến nên mặc dù đã nỗ lực và cố gắng nhưng chắc
chắn trình độ hiểu biết và kỹ năng về môn học này của em vẫn còn nhiều hạn
chế. Vì vậy, bài Báo cáo của chúng em khó tránh khỏi những thiếu xót và nhiều
chỗ chưa chuẩn xác, kính mong giảng viên bộ môn xem xét và góp ý giúp bài
Báo cáo của em được hoàn thiện hơn.

Em xin chân thành cám ơn!

Sinh viên

Nguyễn Mạnh Việt

4
CHƯƠNG I. TÌM HIỂU CHUNG VỀ GIAO TIẾP USART
1.1 USART là gì?
USART (Universal Synchronous/ Asynchronous Receiver/ Transmitter) là bộ
truyền nhận nối tiếp đồng bộ hoặc cận đồng bộ. Được dùng trong việc giao tiếp giữa
hai thiết bị. Đây là giao tiếp đơn giản nhưng phổ biến, là một vi mạch có sẵn trong vi
điều khiển dùng để giao tiếp với các thiết bị ngoại vi.
1.1.1 Truyền nhận nối tiếp là gì?

Hình 1.1 Sơ đồ truyền nhận nối tiếp

Truyền nhận nối tiếp  là quá trình gửi dữ liệu tuần tự theo từng bit, qua một kênh
truyền thông (communication channel) hoặc bus máy tính. Với truyền nhận nối tiếp,
mỗi xung clock ta gửi được 1 bit dữ liệu đi.
1.1.2 Đồng bộ và cận đồng bộ.
2. Đồng bộ
Khái niệm “đồng bộ” ám chỉ sự báo trước trong quá trình truyền. Giả sử có hai
thiết bị (T1 và T2) được kết nối với nhau bởi một đường dữ liệu (data) và một đường
truyền xung nhịp (clock). Cứ mỗi lần T1 muốn gửi 1 bit dữ liệu, T1 điều khiển đường
xung nhịp từ mức thấp lên mức cao để báo cho T2 sẵn sàng để nhận một bit này.
Bằng cách “báo trước” này, tất cả các bit dữ liệu có thể truyền nhận dễ dàng và ít có
sai lệch trong quá trình truyền. Tuy nhiên cách này đòi hỏi ít nhất 2 đường truyền cho
một quá trình (send or receiver).

5
Hình 1.2 Sơ đồ minh hoạ truyền thông nối tiếp đồng bộ

b. Cận đồng bộ
Khác với truyền thông đồng bộ, truyền thông cận đồng bộ chỉ sử dụng duy nhất
một đường truyền dữ liệu mà không cần xung nhịp để báo trước. Tất cả dữ liệu được
chuẩn hoá thành một khung dữ liệu. Giả sử T1 và T2 cũng đang giao tiếp với nhau,
giữa chúng thoả thuận rằng cứ mỗi khoảng thời gian 1ms thì có một bit dữ liệu được
truyền đi. Như vậy T2 chỉ cần đọc dữ liệu một lần mỗi 1ms và sau đó kết hợp chúng
lại. Nhờ đó truyền thông không đồng bộ sử dụng ít tài nguyên hơn.
Khung truyền dữ liệu được chuẩn hoá với start bit, data bit, stop bit. Điều này
để khi giao tiếp, thiết bị nhận dữ liệu có thể biết được dữ liệu bắt đầu từ đâu và kết
thúc ở vị trí nào. Từ đó kết hợp lại chính xác để không xảy ra sai lệch dữ liệu.

Hình 1.3 Sơ đồ minh hoạ truyền thông nối tiếp cận đồng bộ

6
1.2 Các thông số quan trọng khi giao tiếp USART
- Baud rate: Để việc truyền nhận dữ liệu không đồng bộ xảy ra thành công
thì các thiết bị tham gia phải thống nhất về khoảng thời gian dành cho 1
bit truyền đi. Hay nói cách khác, tốc độ truyền phải được cài đặt như nhau
trước, tốc độ này gọi là tốc độ Baud. Theo định nghĩa, tốc độ Baud là số
bit truyền trong 1 giây.
- Frame (khung truyền): Do truyền thông nối tiếp mà nhất là không đồng bộ
rất dễ xảy ra sai lệch dữ liệu cho nên quá trình truyền thông tin theo kiểu
này phải tuân theo một quy cách nhất định. Bên cạnh tốc độ Baud, khung
truyền là một yếu tố rất quan trọng tạo nên sự thành công khi truyền và
nhận. Khung truyền bao gồm các quy định về số bit trong một lần truyền
(data bits), các bit báo hiệu bắt đầu và kết thúc của một dữ liệu (start bit,
stop bit), các bit kiểm tra,…
- Start bit: Là bit đầu tiên được truyền đi trong một khung truyền, bit này có
chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được
truyền tới.
- Data bit: Là thông tin mà chúng ta cần gửi và nhận.
- Parity bit: Là bit kiểm tra dữ liệu được truyền có đúng không bằng cách
đếm các số 1 trong dãy nhị phân của dữ liệu được truyền đi trong khung
truyền. Nếu là số chẵn thì Parity chẵn được bật, ngược lại Parity lẻ được
bật. Đây không phải là bit bắt buộc và không nhất thiết phải xuất hiện
trong khung truyền.
- Stop bit: Là một hoặc các bit báo hiệu cho thiết bị nhận rằng một gói dữ
liệu đã được gửi xong.
Khung truyền phổ biến nhất đó là : Start bit – 8 Data bit – 1 Stop bit

7
1.3 USART với STM32

Hình 1.4 Chức năng của các chân Pin trong STM32

STM32 thiết kế những cổng dùng cho một số hoạt động giao tiếp nhất định. Để
giao tiếp USART, ta nối chân TX và RX của USART với các chân Pin thích hợp trên
STM 32.

8
CHƯƠNG II. LÀM VIỆC VỚI USART QUA THANH GHI
2.1 Các thanh ghi quan trọng
2.1.1 Thanh ghi SR (Status Register)

Hình 2.1 Sơ đồ thanh ghi SR


Thanh ghi SR là thanh ghi trạng thái, các bit cần chú ý:
TXE : Báo hiệu thanh ghi dữ liệu trống.
Bit này cho biết dữ liệu của bộ đệm TDR đã được đưa vào Transmit Shift
Register và bắt đầu truyền đi. Bit TXE có thể tạo ra tín hiệu ngắt nếu bit TXEIE được
set. Bit này luôn luôn được reset bằng cách ghi vào thanh ghi dữ liệu.
0: TDR chưa được làm trống.
1: TDR được làm trống và dữ liệu tiếp theo có thể được ghi vào thanh
ghi USART_DR mà không làm ảnh hưởng đến dữ liệu trước.
TC : Báo hiệu quá trình truyền hoàn tất.
Bit TC được set bởi phần cứng và được set lên khi MCU đã hoàn thành xong
một quá trình truyền dữ liệu và bit TXE được set. Bit này có thể tạo ra tín hiệu ngắt
nếu bit TCIE của thanh ghi USART_CR1 được set. Bit này có thể được reset bằng
cách ghi 0 vào nó hoặc bằng hoạt động đọc tại thanh ghi USART_SR sau đó ghi giá
trị vào USART_DR.
0: Quá trình truyền chưa hoàn tất.
1: Quá trình truyền đã hoàn thành.
RXNE: Báo hiệu dữ liệu đọc không trống.
Bit này được thiết lập bởi phần cứng khi nội dung của thanh ghi dịch chuyển
RDR đã được chuyển đến thanh ghi USART_DR. Một ngắt được tạo ra nếu RXNEIE
= 1 trong thanh ghi USART_CR1. Nó được xóa bằng cách đọc ở USART_DR. Cờ
RXNE cũng có thể được xóa bằng cách viết số 0 vào nó.
0: Không nhận được dữ liệu
1: Dữ liệu nhận được đã sẵn sàng để đọc.

9
FE: Kiểm tra lỗi khung truyền
0: Không phát hiện lỗi khung.
1: Lỗi khung hoặc ký tự ngắt được phát hiện.
2.1.2 Thanh ghi DR (Data Register)

Hình 2.2 Sơ đồ thanh ghi DR


Thanh ghi DR là thanh ghi dữ liệu, nó chứa các bit được truyền đi hoặc nhận về.
Thực tế thanh ghi này gồm hai thanh ghi TDR và RDR. Thanh ghi TDR có chức năng
ghi, dùng trong bộ truyền. Thanh ghi RDR có chức năng đọc dữ liệu, dùng trong bộ
thu. Khi lập trình ta gọi chung tên của chúng nhưng tuỳ theo trường hợp nó được đọc
hay ghi tới mà máy tính sẽ xử lý chính xác.
2.1.3 Thanh ghi BRR (Baud rate register)

Hình 2.3 Sơ đồ thanh ghi BRR


Từ bit 15 về bit 4 là giá trị nguyên của số được truyền vào thanh ghi BRR.
Từ bit 3 về bit 0 là giá trị sau dấu “.” của giá trị được truyền.
Cụ thể khi giao tiếp hai thiết bị với nhau, để nhận chính xác dữ liệu được gửi đi
thì hai thiết bị này phải nhận và truyền tại cùng một tốc độ. Tuy nhiên, giá trị tại
thanh ghi BRR không phải là tốc độ Baud rate, nó chỉ được dùng để USART tính
toán tốc độ truyền. Cụ thể với công thức như sau:
f
BAUD RATE=
d BRR

Trong đó: f là tần số hoạt động


d BRR là giá trị trong thanh ghi BRR

10
2.1.4 Thanh ghi CR1 (Control register 1)

Hình 2.3 Sơ đồ thanh ghi CR1


Thanh ghi CR1 là thanh ghi điều khiển, gồm các bit quan trọng sau:
UE: Bật USART
Khi bit này bị xóa, các bộ định mức và đầu ra USART được dừng lại và kết thúc
quá trình truyền byte hiện tại để giảm tiêu thụ điện năng. Bit này được thiết lập và
xóa bằng phần mềm.
0: Đã tắt chức năng định mức trước USART và kết quả đầu ra.
1: USART được bật.
M: Độ dài của khung dữ liệu
Bit này xác định độ dài từ.
0: 1 Bit bắt đầu, 8 bit dữ liệu, n bit dừng.
1: 1 Bit bắt đầu, 9 bit dữ liệu, n bit dừng.
TXEIE: Bật ngắt TXE
0: Ngắt bị chặn.
1: Một ngắt USART được tạo ra bất cứ khi nào TXE = 1 trong thanh ghi
USART_SR.
TCIE: Ngắt khi truyền xong
0: Ngắt bị chặn.
1: Một ngắt USART được tạo ra bất cứ khi nào TC = 1 trong thanh ghi
USART_SR.
RXNEIE: Bật ngắt RXNE
0: Ngắt bị chặn.
1: Một ngắt USART được tạo ra bất cứ khi nào ORE = 1 hoặc RXNE = 1 trong
thanh ghi USART_SR.
TE: Kích hoạt Transmitter

11
Bit này cho phép Transmitter hoạt động.
0: Tắt Transmitter.
1: Bật Transmitter.
RE: Kích hoạt Receiver
Bit này cho phép bộ nhận tín hiệu hoạt động
0: Tắt Receiver
1: Bật Receiver

12
2.2 Quá trình truyền nhận dữ liệu
Để giao tiếp 2 chiều USART, MCU cần phải kết nối với thiết bị bên ngoài ít
nhất 2 chân là chân TX (chân truyền dữ liệu ra bên ngoài) và chân RX (chân nhận dữ
liệu từ bên ngoài). Chân TX của MCU sẽ được nối với chân RX của thiết bị ngoài và
ngược lại chân RX của MCU sẽ được nối với chân TX của thiết bị ngoài. Chân
SW_RX được dùng để nhận dữ liệu ở chế độ single-wire.

Hình 2.4 Sơ đồ khối ghi/đọc dữ liệu trong USART


Về quá trình truyền USART 
Một byte dữ liệu từ đường bus sẽ được lưu trong bộ đệm TDR. Khi bit cho phép
truyền (TE) được set, dữ liệu sẽ được đưa xuống thanh ghi Transmit Shift Register và
bit có trọng số thấp nhất (LSB) sẽ được gửi đi đầu tiên trên chân TX MCU. Sau khi
truyền đi một byte, thanh ghi TDR sẽ được làm trống và byte tiếp theo có thể được
truyền đi. Ở chế độ này dữ liệu của thanh ghi USART_DR chính là dữ liệu của bộ
đệm TDR.

Hình 2.5 Sơ đồ quá trình truyền USART

13
Về quá trình nhận USART 

Khi có dữ liệu được truyền từ thiết bị bên ngoài, bit có trọng số thấp nhất của
frame data đầu tiên được truyền qua chân RX của MCU và lưu vào thanh ghi Receive
Shift Register. Khi một byte đã nhận xong, bit RXNE (Read data register not empty)
set lên 1, dữ liệu chứa trong thanh ghi Receive Shift Register được đưa đến bộ đệm
RDR, dữ liệu lúc này đã sẵn sàng để đọc. Nếu bit RXNE và bit RXNEIE (RXNE
interrupt enable) cùng set lên 1 thì một tín hiệu ngắt sẽ được sinh ra. Bit RXNE được
reset khi có hoạt động đọc dữ liệu trên thanh ghi USART_DR hoặc khi ghi bit 0 vào
nó.

14
2.3 Các bước cấu hình cho USART

B1. Cấp clock cho port sử dụng giao tiếp USART.

B2. Chọn chân và chế độ mode cho từng chân của USART.

B3. Bật USART bằng cách set bit UE trong thanh ghi USART_CR1 lên 1.
B4. Lập trình bit M trong USART_CR1 để xác định độ dài từ.
B5. Lập trình số lượng bit dừng trong USART_CR2.
B6. Chọn kích hoạt DMA (DMAT) trong USART_CR3 nếu Giao tiếp nhiều bộ
đệm được thực hiện. Định cấu hình thanh ghi DMA như được giải thích trong giao
tiếp đa bộ đệm.
B7. Chọn tốc độ truyền mong muốn bằng cách sử dụng thanh ghi
USART_BRR.
B8. Set bit TE và RE trong USART_CR1 lên 1 để cho phép thu và nhận tín hiệu
từ thiết bị bên ngoài.
B9. Cấu hình cho ngắt bằng cách setbit RXNEIE và TXEIE, USART có thể ngắt
mỗi khi có hoạt động truyền hoặc nhận tín hiệu.

15
CHƯƠNG III. MÔ PHỎNG TRÊN PROTEUS
1. Vấn đề cần giải quyết:
Sử dụng USART để hiện ký tự lên màn hình. Nếu ký tự được gửi lên là
“ONLED” thì bật led PC13. Nếu là “OFFLED” thì tắt led PC13.
2. Các bước thực hiện:
Dựa theo đề bài, ta cần làm việc với USART và đèn led PC13.
Đầu tiên ta cấu hình cho led PC13:

B1: Cấp Clock cho port C.


B2: Chân PC13 nằm ở phần cao nên ta cấp chân PC13 bằng cách kéo vị trí thứ 6
trong thanh ghi CRH về mức 0.
Chọn mode General output push-pull và Output mode, max speed 50 MHz

Thứ hai, ta cần cấu hình cho USART

16
Cụ thể trong bài toán mà chúng em làm, chúng em sử dụng giao tiếp qua
USART1. Như trên hình, chúng ta sử dụng chân PA9 (USART1_TX) và chân PA10
(USART1_RX). Nối chân TX của STM32 với chân RX của thiết vị và ngược lại:

Code như sau:


Trong bài này ta sử dụng ngắt nên sẽ set bit AFIO tại thanh ghi RCC, cùng với
nó là bit USART, bit GPIO để giao tiếp USART.
Cấp chân PA9, PA10, chọn mode cho từng chân.
Tại chân PA9, chế độ mode là alternate function push-pull. Tại chân này ta
truyền vào mã 10-11 = 0xB.
Tại chân PA10, chế độ mode là Input-floating (Cấu hình I/O là ngõ vào và để
nổi). Tại chân này ta truyền vào mã 01-00 = 0x4.

Các bước tiếp theo như sau ( dựa vào mục 2.3)
Các bước Tham số
B3. Bật USART bằng cách set bit UE trong thanh 1
ghi USART_CR1 lên 1.
B4. Lập trình bit M trong USART_CR1 để xác 8 data bit

17
định độ dài từ.  USART_CR1_M = 0
B5. Lập trình số lượng bit dừng trong 1 stop-bit
USART_CR2.  USART_CR2_STOP = 00
B6. Chọn kích hoạt DMA (DMAT) trong Không sử dụng
USART_CR3 nếu Giao tiếp nhiều bộ đệm được
thực hiện. Định cấu hình thanh ghi DMA như
được giải thích trong giao tiếp đa bộ đệm.
B7. Chọn tốc độ truyền mong muốn bằng cách sử BRR = 72MHz/9600
dụng thanh ghi USART_BRR. = 7500 = 0x1D4C
B8. Set bit TE và RE trong USART_CR1 lên 1 để USART_CR1_TE = 1
cho phép thu và nhận tín hiệu từ thiết bị bên ngoài. USART_CR1_RE =1
B9. Cấu hình cho ngắt bằng cách setbit RXNEIE Set RXNEIE cho phép ngắt nhận.
và TXEIE, USART có thể ngắt mỗi khi có hoạt USART_CR1_RXNEIE = 1
động truyền hoặc nhận tín hiệu.

Ta có code sau:

NVIC => ISER[1] là xử lý ngắt với USART1

18
Tiếp theo ta sẽ khai báo các biến nhận kí tự từ thiết bị ngoại vi và kiểm tra các kí
tự đó:

Data_in là chuỗi các kí tự nhập từ bàn phím. Ta sẽ kiểm tra chúng với chuỗi các
kí tự của lệnh onled và offled xem có trùng nhau không. Biến sp là con trỏ của
data_in

19
Nếu chuỗi data_in trùng với lệnh ONLED hoặc OFFLED ta sẽ trả về giá trị 1,
nếu không phải sẽ trả về giá trị 0.

Như vậy, điều cuối cùng mà ta cần thực hiện là xem kí tự nhận vào là gì và đưa
ra hướng giải quyết cho lệnh đó mà thôi.
Lúc này câu hỏi đặt ra là làm thế nào để biết ta đã nhận xong một lệnh? Ở đây
em quy định với người điều khiển rằng khi nhập xong 1 lệnh gồm chuỗi các kí tự, họ
phải ấn Enter để “báo” cho máy biết rằng lệnh đã được nhập xong và ra lệnh cho
máy hãy xử lý lệnh đó.

Sau khi xử lý xong một lệnh, con trỏ sp của data_in phải được đưa về vị trí 0 để
sẵn sàng nạp một lệnh tiếp theo.
Nhưng nếu dừng lại ở bước này, ta thấy có một vấn đề phát sinh đó là các kí tự ở
câu lệnh trước vẫn còn ở đó. Điều này thoạt nhìn có vẻ không phải là một vấn đề to
tát bởi vì khi nạp lệnh tiếp theo thì ta sẽ ghi đè nên nó và nó sẽ biến mất mà không
ảnh hưởng gì phải không? Có ảnh hưởng chính là câu trả lời cho câu hỏi này. Ta xét
trong một ví dụ cụ thể:

20
STT Lệnh Data_in Thực thi
0 1 2 3 4 5 6
L1 ONFLED O N F L E D Không thực thi
L2 OF O F F L E D Tắt led PC13
Chính xác, cả hai lệnh này đều không tác động lên led PC13, vậy tại sao led
PC13 lại bị tắt ở lệnh thứ 2? Nguyên nhân do mảng data_in chưa được làm sạch. Kí
tự “O” và “F” tại lệnh thứ hai sẽ ghi đè lên “O” và “N” ở lệnh trước đó. Nhưng các kí
tự “FLED” vẫn còn ở đó, nó kết hợp với hai kí tự “O”, “N” vừa nhận được để tạo ra
chuỗi “OFFLED”. Và dẫn đến kết quả tắt led PC13.
Vậy nên ta cần làm sạch chuỗi data_in trước khi bắt đầu nhận một lệnh tiếp
theo. Nhưng chỉ cần clear từ data_in[0] đến data_in[6] thôi bởi vì lệnh thực thi dài
nhất là OFFLED chỉ có 6 kí tự (Kết thúc ở data_in[5] mà thôi).

3. Thiết kế mạch trên Proteus

21

You might also like