Professional Documents
Culture Documents
- 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ý.
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à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
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);
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
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){}
}
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