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ênhtruyền thông communication channel hoặc bus máy tính.. Điều này để kh
Trang 1BỘ 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
Thái Bình – 11/2021
TÊN NHÓM
THÀNH VIÊN NHÓM
15 NGUYỄN MẠNH VIỆT – B19DCVT433
Trang 2Phâ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
Trang 3MỤC LỤC
LỜI NÓI ĐẦU……….………CHƯƠNG I Tìm hiểu chung về giao tiếp USART……….………
1.1 USART là gì? 1.2 Các thông số quan trọng khi giao tiếp USART……….………….….1.3 USART với STM32……….…………
Trang 4CHƯƠNG III Mô phỏng trênproteus………
Trang 5LỜ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 vití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ụngnhư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ủachú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ưuchính Viễn thông đã đem bộ môn Kỹ thuật Vi xử lý vào quá trình dạy và họccủ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ạycủa Học viện Công nghệ Bưu chính Viễn thông Nó giúp chúng em có nhữngkiến thức chuyên ngành nhất định, giúp chúng em tự tin, vững bước hơn khi rakhỏ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ậphoà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ắcchắ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ạnchế 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ềuchỗ 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àiBáo cáo của em được hoàn thiện hơn
Em xin chân thành cám ơn!
Sinh viênNguyễn Mạnh Việt
Trang 6CHƯƠ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ữahai 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ênhtruyề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 đườngtruyề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 đườngxung 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 chomột quá trình (send or receiver)
Trang 7Hì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ấtmộ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 đượctruyề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únglạ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ếtthú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ộ
Trang 81.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 1bit truyền đi Hay nói cách khác, tốc độ truyền phải được cài đặt như nhautrướ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ểunày phải tuân theo một quy cách nhất định Bên cạnh tốc độ Baud, khungtruyề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 đượctruyề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 khungtruyền Nếu là số chẵn thì Parity chẵn được bật, ngược lại Parity lẻ đượcbật Đây không phải là bit bắt buộc và không nhất thiết phải xuất hiệntrong 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
Trang 91.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
Trang 10CHƯƠ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 SRThanh 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 ShiftRegister và bắt đầu truyền đi Bit TXE có thể tạo ra tín hiệu ngắt nếu bit TXEIE đượcset 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 thanhghi 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 xongmộ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ắtnếu bit TCIE của thanh ghi USART_CR1 được set Bit này có thể được reset bằngcá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ểnRDR đã đượ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
Trang 11FE: 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 DRThanh 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ăngghi, 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 đọchay 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 đithì 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ạithanh ghi BRR không phải là tốc độ Baud rate, nó chỉ được dùng để USART tínhtoán tốc độ truyền Cụ thể với công thức như sau:
Trang 122.1.4 Thanh ghi CR1 (Control register 1)
Hình 2.3 Sơ đồ thanh ghi CR1Thanh 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úcquá 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
Trang 13Bit 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 động0: Tắt Receiver
1: Bật Receiver
Trang 142.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 ítnhấ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ânSW_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éptruyề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 khitruyền đi một byte, thanh ghi TDR sẽ được làm trống và byte tiếp theo có thể đượctruyề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
Trang 15Về 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ủaframe data đầu tiên được truyền qua chân RX của MCU và lưu vào thanh ghi ReceiveShift 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ộ đệmRDR, dữ liệu lúc này đã sẵn sàng để đọc Nếu bit RXNE và bit RXNEIE (RXNEinterrupt enable) cùng set lên 1 thì một tín hiệu ngắt sẽ được sinh ra Bit RXNE đượcreset khi có hoạt động đọc dữ liệu trên thanh ghi USART_DR hoặc khi ghi bit 0 vàonó
Trang 162.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ắtmỗi khi có hoạt động truyền hoặc nhận tín hiệu
Trang 17CHƯƠ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ứ 6trong 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
Trang 18Cụ 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)
B3 Bật USART bằng cách set bit UE trong thanh 1
Trang 19định độ dài từ USART_CR1_M = 0B5 Lập trình số lượng bit dừng trong
USART_CR2
1 stop-bit
USART_CR2_STOP = 00B6 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
Không sử dụng
B7 Chọn tốc độ truyền mong muốn bằng cách sử
dụng thanh ghi USART_BRR
BRR = 72MHz/9600
= 7500 = 0x1D4CB8 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
USART_CR1_TE = 1USART_CR1_RE =1B9 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
Set RXNEIE cho phép ngắt nhận.USART_CR1_RXNEIE = 1
Ta có code sau:
NVIC => ISER[1] là xử lý ngắt với USART1
Trang 20Tiế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
Trang 21Nế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
ả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
Trang 22Chí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 rachuỗ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