Professional Documents
Culture Documents
TÊN NHÓM 15
THÀNH VIÊN NHÓM NGUYỄN MẠNH VIỆT – B19DCVT433
1
MỤC LỤC
LỜI NÓI ĐẦU………………………………………………….……………… 3
1.1..USART là gì?...................................................................................... 4
…... 8
…. 8
trọng……………………………………………. 9
2.1.1..Thanh ghi 9
SR……………………………………………….. 11
2.1.3..Thanh ghi 14
BRR……………………………………………...
CR1……………………………………………….
USART………………………………………
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.
Sinh viên
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ì?
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)
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)
10
2.1.4 Thanh ghi CR1 (Control register 1)
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.
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
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:
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:
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:
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).
21