You are on page 1of 21

BÀI 6: TRUYỀN THÔNG NỐI TIẾP

Mục tiêu của bài học:


(1) Trình bày tổng quan về truyền thông nối tiếp;
(2) Trình bày được đặc điểm, các chế độ hoạt động của module
USART, I2C trên ARM STM32;
(3) Thiết lập và điều khiển một số hàm truyền thông nối tiếp USART, I2C
trong API HAL;
(4) Lập trình và mô phỏng hoạt động của USART, I2C.
6.1 Tổng quan về truyền thông nối tiếp
Truyền tin nối tiếp là phương thức truyền tin trong đó các bit mang thông tin
được truyền kế tiếp nhau trên một đường dẫn vật lý. Tại một thời điểm phía bên
truyền cũng như bên nhận chỉ có thể truyền/nhận được 1 bit.
So với truyền tin song song thì truyền tin nối tiếp có một số ưu, nhược điểm sau:
Ưu điểm: Truyền được ở khoảng cách xa, tiết kiệm đường truyền dẫn, truyền tin
nối tiếp có ưu thế hơn so với truyền tin song song.
Nhược điểm: Tốc độ truyền chậm hơn, phức tạp hơn do các thiết bị thường phải
có các khối chuyển đổi nối tiếp sang song song, song song sang nối tiếp khi sử dụng
phương thức này để trao đổi tin.
Có 3 phương thức truyền tin nối tiếp:
- Phương thức đồng bộ: Các byte chứa các bit thông tin được truyền liên tiếp trên
đường truyền và chỉ được ngăn cách nhau bằng bit đồng bộ khung (Syn).(Hình
6.1.a.)
- Phương thức không đồng bộ: Các byte chứa các bit thông tin được chứa trong
một khung. Một khung được bắt đầu bằng 1 bit Start, tiếp theo là các bit mang
thông
tin, kế tiếp là bit kiểm tra chẵn lẻ và kết thúc là bit Stop (Hình 6.1.b).
- Phương thức lai: Đây là phương thức kết hợp của 2 phương thức trên

Hình 6.1 Các phương thức truyền nối tiếp


6.2 Cấu tạo và hoạt động của modul USART
Chuẩn truyền thông này trên STM32 cho phép truyền/nhận song công với máy
tính hoặc thiết bị ngoại vi sử dụng chân truyền dữ liệu TX và chân nhận dữ liệu RX
ở chế độ độ bất đồng bộ được gọi là UART (Universal Asynchronous
Receiver/Transmitter), ở chế độ đồng bộ(USART) có thêm một chân phát xung CLK
từ bên truyền đến bên nhận để đồng bộ dữ liệu.
6.2.1 Cấu tạo modul USART
USART trên ARM STM32F4xx gồm các khối :

- Khối vào/ra dữ liệu


- Khối tạo tốc độ Baud
- Khối điều khiển truyền/nhận, đánh thức.
- Khối ngắt USART
- Khối GTPR – Guard Time and Prescaler Register
- Khối ghi dịch

Đặc điểm của USART trên STM32F4xxx :

- Có thể truyền/ nhận song công đồ bộ (USART) hoặc bất đồng bộ (UART).
- Có 4 bộ truyền/nhận bất đồng bộ UART4, UART5, UART7, UART8 và 4
bộ truyền nhận đồng bộ USART1, USART2, USART3, USART6.
- Độ dài dữ liệu có thể lập trình với 8 hoặc 9 bit.
- Có thể cấu hình bit dừng (Stop) với độ dài bằng 0.5, 1, 1.5, 2 bit dữ liệu.
- Bộ truyền có khả năng phát xung đồng bộ dữ liệu.
- Hỗ trợ chuẩn giao tiếp LIN.
- Có 10 nguồn ngắt từ : CTS, LIN, rỗng bộ truyền, hoàn thành truyền dữ liệu,
nhận dữ liệu, đường truyền ở chế độ nghỉ, lỗi do tràn, lỗi khung, lỗi do
nhiễu và lỗi chẵn lẻ.
- Cho phép truyền thông đa xử lý.

Sơ đồ khối của USART :


Hình 6.2: Sơ đồ khối truyền thông nối tiếp USART

6.2.2 Hoạt động của modul USART


Truyền thông nối tiếp sử dụng các chân truyền nhận dữ liệu sau :
- Chân RX là chân nhận dữ liệu nối tiếp, sử dụng kỹ thuật lấy mẫu quá mức
(Oversampling techniques) để phân biệt giữa dữ liệu hợp lệ và nhiễu.
- Chân TX là chân truyền dữ liệu nối tiếp. Khi chế độ truyền không sử dụng,
chân này có thể sử dụng là chân I/O. Trong chế độ truyền 1 dây hoặc giao
tiếp thẻ thông minh (smart card), chân SW_RX được sử dụng để truyền nhận
dữ liệu.
- Chân CK là chân phát xung CLK ở chế độ đồng bộ cho thiết bị nhận hoặc thẻ
thông minh.
- Chân CTS (Clear to send) là chân chặn truyền dữ liệu khi kết thúc quá trình
truyền hiện tại.
- RTS (Request to send) là chân cho biết USART sẵn sàng nhận dữ liệu.
Cấu trúc khung truyền :

Hình 6.3: Cấu trúc khung truyền ở chế độ 8 bit hoặc 9 bit

Khung truyền được thiết lập với 1 bit khởi đầu khung (Start), 8 hoặc 9 bit dữ
liệu, 1 bit kiểm tra chẵn lẻ và 1 bit dừng (Stop).
Thiết lập tốc độ truyền :
Tốc độ truyền nhận ở chế độ USART được thiết lập theo công thức sau :
𝑓
𝐵𝑎𝑢𝑑 / = 6.1
8 ∗ (2 − OVER8) ∗ 𝑈𝑆𝐴𝑅𝑇𝐷𝐼𝑉
Trong đó :
BaudTx/Rx : là tốc độ truyền nhận của cổng nối tiếp.
fCK : là nguồn xung cấp cho bộ USART.
USARTDIV : là giá trị bộ chia tần sử dụng để tạo tốc độ truyền/nhận, được
thiết lập trong thanh ghi USART_BRR.
OVER8: Bit lấy mẫu quá mức nằm trong thanh ghi USART_CR1
= 0: Lấy mẫu quá mức 16 mẫu
= 1: Lấy mẫu quá mức 8 mẫu
6.3 Truyền thông nối tiếp I2C
Truyền thông nối tiếp I2C( Inter-Integrated Circuit) được Philips giới thiệu năm
1982, chuẩn giao tiếp này sử dụng để kết nối các IC với nhau theo giao thức chủ tớ.
Giao tiếp I2C sử dụng hai dây, dây SDA (Serial Data Line) sử dụng truyền/nhận dữ
liệu, dây SCL(Serial Clock Line) phát xung clock từ thiết bị chủ đến thiết bị tớ. Sơ đồ
kết nối thiết bị chủ và tớ trên đường truyền I2C được thể hiện ở hình dưới : [2]

Hình 6.2: Sơ đồ kết nối thiết bị I2C

Dạng tín hiệu trên đường truyền I2C: [2]

Hình 6.3: Tín hiệu trên đường truyền I2C

6.3.1 Truyền thông nối tiếp I2C trên STM32


Đặc điểm giao tiếp nối tiếp I2C trên STM32F4xxx :
- Có 3 bộ giao tiếp nối tiếp I2C1, I2C2 và I2C3
- I2C chủ (Master) : phát xung Clock, tạo tín hiệu Start và Stop
- I2C tớ (Slave) : phát hiện địa chỉ I2C có thể lập trình được, định địa chỉ xác
thực thiết bị tớ, phát hiện bit dừng (Stop)
- Có khả năng tạo và phát hiện địa chỉ 7 bit/10 bit và thực hiện cuộc gọi chung
đến các thiết bị tớ
- Hỗ trợ giao tiếp tốc độ tiêu chuẩn( lên đến 100 kHz) và tốc độ nhanh (lên đến
400 kHz)
- Có bộ lọc nhiễu tương tự.
- Có 2 vector ngắt : ngắt từ nhận diện đúng địa chỉ/hoàn thành truyền nhận dữ
liệu và ngắt do lỗi.
- Dữ liệu nối tiếp được truyền/nhận trên chân SDA với thiết bị I2C bên ngoài,
tín hiệu nhận được đưa qua bộ lọc nhiễu trước khi đưa vào thanh ghi dịch để
nhận từng bit dữ liệu. Chân SCL phát xung Clock dịch dữ liệu khi I2C được
cấu hình là thiết bị chủ, nhận xung Clock khi I2C được cấu hình là thiết bị tớ.
Khi nhận xung Clock, SCL được đưa qua bộ lọc nhiễu trên đường truyền
trược khi đưa vào bô điều khiển nguồn xung. Chân SMBA là tín hiệu tùy
chọn trong chế độ SMBus. [1]
Sơ đồ khối của I2C trên STM32F42x :

Hình 6.4: Sơ đồ khối giao tiếp I2C


6.3.2 Các chế độ hoạt động
Modul I2C trên STM32 có thể hoạt động ở một trong bốn chế độ sau:
• Slave transmitter
• Slave receiver
• Master transmitte
• Master receiver

6.3.2.1 Chế độ master


Chế độ master được xác lập ngay khi có điều kiện Start bởi bit START trong thanh
ghi I2C_CR1. Ở chế độ Master, các chân SCK và SDA sẽ được điều khiển bởi phần
cứng của moidul I2C
I2C Master đóng vai trò tích cực trong quá trình giao tiếp và điều khiển các I2C
Slave thông qua việc chủ động tạo ra xung giao tiếp và các điều kiện Start, Stop khi
truyền nhận dữ liệu. Một byte dữ liệu có thể được bắt đầu bằng điều kiện Start, kết thúc
bằng điều kiện Stop hoặc bắt đầu và kết thúc với cùng một điều kiện khởi động lặp lại
(Repeated Start Condition). Xung giao tiếp nối tiếp sẽ được tạo ra từ thanh ghi
I2C_CR2. Tần số xung nhịp đầu vào phải có giá trị nhỏ nhất: 2MHz ở chế độ Sm; 4MHz
ở chế độ Fm

6.3.2.2 Chế độ slave


Để hoạt động được ở chế độ này, trước tiên là phải đăt các chân SCL và SDA
thành chiều vào. I2C của vi điều khiển sẽ được điều khiển bởi một vi điều khiển hoặc
một thiết bị ngoại vi khác thông qua các địa chỉ. Khi địa chỉ này chỉ đến vi điều khiển,
thì tại thời điểm này và tại thời điểm dữ liệu đã được truyền nhận xong sau đó, vi điều
khiển sẽ tạo ra xung để báo hiệu kết thúc dữ liệu. Ngay khi phát hiện điều kiện bắt đầu,
địa chỉ sẽ được nhận từ đường SDA và được gửi vào thanh ghi dịch. Sau đó, nó được
so sánh với địa chỉ của giao diện (OAR1) và với OAR2 (nếu ENDUAL=1) hoặc gọi địa
chỉ chung (nếu ENGC = 1).

6.3.2.3 Cách thức giao tiếp I2C.


Bước 1: Thiết bị Master gửi điều kiện bắt đầu đến tất cả các thiết bị Slave.
Bước 2: Thiết bị Master gửi 7 bit địa chỉ của thiết bị Slave mà thiết bị Master
muốn giao tiếp cùng với bit Read/Write.
Bước 3: Mỗi thiết bị Slave so sánh địa chỉ được gửi từ thiết bị Master đến địa chỉ
riêng của nó. Nếu địa chỉ trùng khớp, thiết bị Slave gửi về một bit ACK bằng cách kéo
đường SDA xuống thấp và bit ACK / NACK được thiết lập là ‘0’. Nếu địa chỉ từ thiết
bị Master không khớp với địa chỉ riêng của thiết bị Slave thì đường SDA ở mức cao và
bit ACK / NACK sẽ ở mức ‘1’ (mặc định).
Bước 4: Thiết bị Master gửi hoặc nhận khung dữ liệu. Nếu thiết bị Master muốn
gửi dữ liệu đến thiết bị Slave, bit Read / Write là mức điện áp thấp. Nếu thiết bị Master
đang nhận dữ liệu từ thiết bị Slave, bit này là mức điện áp cao.
Bước 5: Nếu khung dữ liệu được thiết bị Slave nhận được thành công, nó sẽ thiết
lập bit ACK / NACK thành ‘0’, báo hiệu cho thiết bị Master tiếp tục.
Bước 6: Sau khi tất cả dữ liệu được gửi đến thiết bị Slave, thiết bị Master gửi điều
kiện dừng để báo hiệu cho tất cả các thiết bị Slave biết rằng việc truyền dữ liệu đã kết
thúc.

6.4 Các hàm truyền thông nối tiếp trong HAL


6.4.1 Các hàm truyền thông nối tiếp USART
- Hàm HAL_UART_Init
Nguyên mẫu:
HAL_StatusTypeDef HAL_UART_Init (UART_HandleTypeDef * huart)
Mô tả chức năng:
Cấu hình cho USART theo các tham số chỉ định trong UART_InitTypeDef.
Tham số :
● huart : trỏ đến cấu trúc UART_HandleTypeDef chứa thông tin cấu hình
cho ADC, các tham số được lựa chọn ở bảng dưới.
Bảng 6.1: Bảng lựa chọn tham số huart

Trường cấu trúc Mô tả

Tốc độ truyền/ nhận dữ liệu :


BaudRate
1200 ; 2400 ; 4800 ; 9600 ; 19200 …
Độ dài bit dữ liệu :
WordLength UART_WORDLENGTH_8B : 8 bit ; UART_WORDLENGTH_9B : 9 bit
Khoảng cách bit dừng (stop) :
StopBit
UART_STOPBIT_1 ; UART_STOPBIT_2
Thiết lập bit kiểm tra chẵn/lẻ :
UART_PARITY_NONE : không sử dụng
Parity
UART_PARITY_EVEN : số bit dữ liệu chẵn
UART_PARITY_ODD : số bit dữ liệu lẻ
Chế độ truyền/nhận :
UART_MODE_RX : chế độ nhận
Mode UART_MODE_TX : chế độ truyền
UART_MODE_TX_RX : chế độ truyền/nhận
HwFlowCtl Lựa chọn điều khiển đường truyền bằng phần cứng :
UART_HWCONTROL_NONE : không sử dụng
UART_HWCONTROL_RTS : sử dụng RTS
UART_HWCONTROL_CTS : sử dụng CTS
UART_HWCONTROL_RTS_CTS : sửa dụng RTS, CTS
Lựa chọn lấy mấu :
OverSampling UART_OVERSAMPLING_16
UART_OVERSAMPLING_8

- Hàm HAL_UART_Transmit
Nguyên mẫu:
HAL_UART_Transmit (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t
Size, uint32_t Timeout)
Mô tả chức năng:
Hàm truyền dữ liệu.
Tham số :
● Huart : trỏ đến UART_HandleTypeDef để chọn USART (ví dụ :
&huart1)
● pData: trỏ đến bộ đệm dữ liệu
● Size: số lượng phần tử cần truyền
● Timeout: thời gian truyền.
- Hàm HAL_UART_Receive
Nguyên mẫu:
HAL_UART_Receive (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t
Size, uint32_t Timeout)
Mô tả chức năng:
Hàm nhận dữ liệu.
Tham số :
● Huart : trỏ đến UART_HandleTypeDef để chọn USART (ví dụ :
&huart1)
● pData: trỏ đến bộ đệm dữ liệu
● Size: số lượng phần tử cần truyền
● Timeout: thời gian truyền.
- Hàm HAL_UART_Transmit_IT : truyền dữ liệu sử dụng ngắt
- Hàm HAL_UART_Receive_IT : nhận dữ liệu sử dụng ngắt
- Hàm HAL_UART_Transmit_DMA : truyền dữ liệu sử dụng DMA
- Hàm HAL_UART_Receive_DMA : nhận dữ liệu sử dụng DMA
Nội dung chi tiết về các hàm được trình bày trong tài liệu [4] từ trang 1076 đến
trang 1089.
6.4.2 Các hàm điều khiển I2C
- Hàm HAL_I2C_Init
Nguyên mẫu:
HAL_StatusTypeDef HAL_I2C_Init (I2C_HandleTypeDef * hi2c)
Mô tả chức năng:
Cấu hình cho I2C theo các tham số chỉ định trong I2C_HandleTypeDef.
Tham số :
● hi2c : trỏ đến cấu trúc I2C_HandleTypeDef chứa thông tin cấu hình cho
I2C, các tham số được lựa chọn ở bảng dưới.
Bảng 6.2: Bảng lựa chọn tham số hi2c

Trường cấu trúc Mô tả

ClockSpeed Thiết lập tốc độ truyền/nhận dữ liệu : thiết lập nhỏ hơn 400000 Hz
Thiết lập độ rộng xung dương ở chế độ nhanh :
DutyCycle I2C_DUTYCYCLE_2 : Toff / Ton = 2
I2C_DUTYCYCLE_16_9 : Toff / Ton = 16/9
OwnAddress1 Chỉ định địa chỉ của thiết bị đầu tiên (7 bit/10 bit)
Chọn chế độ địa chỉ 7 bit/10 bit :
AddressingMode FMPI2C_ADDRESSINGMODE_7BIT
FMPI2C_ADDRESSINGMODE_10BIT
Cho phép/ cấm chế độ địa chỉ kép :
DualAddressMode I2C_DUALADDRESS_DISABLE ; I2C_DUALADDRESS_ENABLE
OwnAddress2 Chỉ định địa chỉ của thiết bị thứ 2 (7 bit)
Cho phép/ cấm chế độ gọi địa chỉ chung :
GeneralCallMode I2C_GENERALCALL_DISABLE ; I2C_GENERALCALL_ENABLE
Cho phép/ cấm chế độ giữ xung nhịp :
NoStretchMode I2C_NOSTRETCH_DISABLE ; I2C_NOSTRETCH_ENABLE

- Hàm HAL_I2C_Master_Transmit
Nguyên mẫu:
HAL_StatusTypeDef HAL_I2C_Master_Transmit (I2C_HandleTypeDef *
hi2c, uint16_t DevAddress, uint8_t * pData, uint16_t Size, uint32_t
Timeout)
Mô tả chức năng:
Hàm truyền dữ liệu ở chế độ chủ.
Tham số :
● hi2c : trỏ đến I2C_HandleTypeDef để chọn I2C (ví dụ : &hi2c1)
● DevAddress: địa chỉ thiết bị đích. Địa chỉ này cần được dịch sang trái 1
bit.
● pData : trỏ tới bộ đệm dữ liệu.
● Size: số lượng phần tử cần truyền
● Timeout: thời gian truyền.
- Hàm HAL_I2C_Master_Receive
Nguyên mẫu:
HAL_StatusTypeDef HAL_I2C_Master_Receive (I2C_HandleTypeDef *
hi2c, uint16_t DevAddress, uint8_t * pData, uint16_t Size, uint32_t
Timeout)
Mô tả chức năng:
Hàm nhận dữ liệu ở thiết bị chủ.
Tham số : tương tự các tham số của hàm HAL_I2C_Master_Transmit.
Giao tiếp nối tiếp I2C còn có các hàm truyền/ nhận với thiết bị tớ, các hàm sử
dụng với ngắt, DMA và các hàm ghi/đọc bộ nhớ, nội dung chi tiết của các hàm này
được trình bày trong tài liệu [4] từ trang 491 đến trang 506.
6.5 Lập trình và mô phỏng truyền nhận qua USART
6.5.1 Các bước lập trình với USART trên STM32CubeMx
Bước 1. Thiết lập hệ thống
- Thiết lập xung nhịp hệ thống : SystemClock_Config()
Bước 2. Thiết lập cho các GPIO, xung nhịp USART
- Cho phép GPIO – AFIO tương ứng hoạt động bằng hàm:
__HAL_RCC_GPIOx_CLK_ENABLE();__HAL_RCC_USARTx_CLK_ENABLE();
Bước 3. Cấu hình USART
- Lựa chọn bộ USART
- Lựa chọn chế độ hoạt động: Mode : Asynchronous
- Lựa các thông số cơ bản: Basic Parameters
-Lựa chọn tốc độ Baud: Baud Rate
-Lựa chọn số bit dữ liệu: Word Length
-Bit kiểm tra chẵn lẻ : Parity
-Số bit dừng: Stop Bit
- Lựa các thông số đặc biệt: Advanced Parameters
-Lựa chọn hướng dữ liệu: Data Direction: Receive and Transmit.
- Truyền dữ liệu: HAL_UART_Transmit(&huart1, data_tx, 32, 100);

- Đọc dữ liệu: HAL_UART_Receive(&huart1,data_rx,32,100);


Thiết lập trên STM32CubeMx
B1. Cấu hình nguồn xung của USART : USART1 – APB2; USART2, 3 – APB1

B2. Cấu hình USART: Bộ USART; chọn chế độ USART; Cấu hình USART
Cấu hình USART
+ Basic Parameters : Tốc độ Baud; số bít dữ liệu, số bít kiểm tra chẵn lẻ; số bít
dừng
+ Advanced Parameters: Truyền và nhận

 Lựa chọn chân chiều vào, chiều ra, mode. Thiết lập các thông số trên
STM32CubeMX như trong hướng dẫn lập trình với GPIO

 Sau đó chọn GENERATE CODE để tạo file Code


- Khung chương trình với USART1
#include "main.h"
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
unsigned char data[]="Dai hoc cong nghiep Ha Noi";
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Transmit(&huart1,data,32,100);
while (1){}
}
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 19200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBit = UART_STOPBIT_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
6.5.2 Ví dụ
Ví dụ 1 : Lập trình truyền chuỗi kí tự qua cổng nối tiếp với khung truyền dữ liệu
19200,8,N,1. Bộ tạo dao động chế độ HSI với Fosc = 16MHz.

Bước 1: Phân tích bài toán:


- Truyền tín hiệu nối tiếp qua cổng USART 1
Với tốc độ 19200 bit/s, 8 bit dữ liệu, không kiểm tra chẵn lẻ và 1 bit dừng. Tần số của
bộ tạo dao động 16MHz
Bước 2: Thiết kế sơ đồ nguyên lý
- 01 cổng USB, 01 IC CH340, 01 STM32F4, các điện trở, nút nhấn…
- Sơ đồ mô phỏng: 01 Vi điều khiển STM32F1; công cụ mô phỏng truyền
nhận cổng nối tiếp Virtual Terminal, kết nối với chân TX/PA9, RX/PA10

Bước 3: Lập trình và mô phỏng


3.1. Xây dựng lưu đồ thuật toán
- Khởi tạo
- Cấu hình USART
- Truyền dữ liệu qua USART
3.2. Lập trình và mô phỏng

Chương trình:
#include "main.h"
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
unsigned char data[]="Dai hoc cong nghiep Ha Noi";

int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Transmit(&huart1,data,32,100);
HAL_UART_Transmit(&huart1,(uint8_t*)
"Khoa Dien Tu \r\n",32,100);
while (1){}
}

static void MX_USART1_UART_Init(void)


{
huart1.Instance = USART1;
huart1.Init.BaudRate = 19200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBit = UART_STOPBIT_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}

Kết quả mô phỏng

Ví dụ 2 : Lập trình đọc dữ liệu qua cổng nối tiếp, nếu dữ liệu đọc được = ‘1’ thì LED
– PA8 sáng, ngược lại LED tắt, với khung truyền dữ liệu 19200,8,N,1. Bộ tạo dao
động chế độ HSI với Fosc = 8MHz.
Với tốc độ 19200 bit/s, 8 bit dữ liệu, không kiểm tra chẵn lẻ và 1 bit dừng. Tần số của
bộ tạo dao động 16MHz
Bước 1: Phân tích bài toán:
- Truyền tín hiệu nối tiếp qua cổng USART 1, Với tốc độ 19200 bit/s, 8 bit dữ liệu,
không kiểm tra chẵn lẻ và 1 bit dừng. Tần số của bộ tạo dao động 16MHz
Nếu nhận được giá trị ‘1’ – 0x31 (mã Ascii) thì LED – PA8 sáng, ngược lại khi nhận
được các giá trị khác LED tắt.
Bước 2: Thiết kế sơ đồ nguyên lý
- 01 cổng USB, 01 IC CH340, 01 STM32F4, 01 Led đơn, các điện trở, nút nhấn…
Sơ đồ mô phỏng: 01 Vi điều khiển STM32F1; công cụ mô phỏng truyền nhận cổng
nối tiếp Virtual Terminal, kết nối với chân TX/PA9, RX/PA10

Bước 3: Lập trình và mô phỏng


3.1. Xây dựng lưu đồ thuật toán
- Khởi tạo
- Cấu hình USART
- Nhận dữ liệu qua USART, Mảng nhận =‘1’ Led sáng, Mảng nhận # ‘1’ Led tắt.
3.2. Lập trình và mô phỏng
Chương trình:
#include "main.h"
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
unsigned char data[]="Dai hoc cong nghiep Ha Noi";
char data_rx[1];
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Transmit(&huart1,data,32,100);
while (1)
{
HAL_UART_Receive(&huart1,data_rx,1,100);
if(data_rx[0]=='1')
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
}
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8,
GPIO_PIN_RESET);
}
}
- Phần cấu hình USART giống như ví dụ 1.
Kết quả mô phỏng
- Khi nhận được ‘1’ – Led sáng

- Khi nhận được khác ‘1’ – Led tắt


TÀI LIỆU THAM KHẢO
[1] . Tài liệu hãng STMicroelectronics

Reference manual STM32F4 – RM0090 Rev 17

[2]. Carmine Noviello

Mastering STM32, Lean Publishing, 2018.

[3]. Tài liệu hãng STMicroelectronics

STM32F427xx STM32F429xx – DocID024030 Rev 10

[4]. Tài liệu hãng STMicroelectronics

User manual Description of STM32F4 HAL and low-layer drivers, UM1725 –


Rev 7

You might also like