You are on page 1of 6

BÁO CÁO 21/05/2022

1. UART

Bộ USART có hai chế độ truyền là truyền dữ liệu đồng bộ


(Synchronous) và truyền dữ liệu không đồng bộ (Asynchronous).
Đối với chế độ truyền đồng bộ, bộ USART của chip STM32F411VE
hỗ trợ truyền 1 chiều (one-way communication) và truyền trên 1
đường truyền bán song công (half-duplex single wire
communication). Với chế độ truyền không đồng bộ, bộ USART
truyền dữ liệu song công (full-duplex) như hình dưới:
a) 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.
b) 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ó. Tuy nhiên nếu quá trình nhận dữ liệu xảy ra các vấn đề sau thì
các error flags tương ứng sẽ được set lên 1
c) Vị trí của USART trong BUS?
STM32F411CE : Có 3 bộ USART: USART1, USART2,
USART6.
Với Bộ USART1, USART6 : Nằm ở bus APB2
Với Bộ USART2 : Nằm ở Bus APB1

Tốc độ của BUS APB1 và APB2 Là 100MHz


d) Các chân Pin của USARTx
Cặp Pin 1 Cặp Pin2 Cặp Pin3
STT USARTx TX RX TX RX TX TX BUS chưa I2C đó
1 USART1 PB6 PB7 PA15 PB3 PA9 PA10 APB2
2 USART2 PA2 PA3 PB10 PB9 APB1
3 USART6 APB2
e) Cấu hình cho chân Pin USART
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

// Lien ket PB6 va P7 voi TX va RX cua USART6


GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);

// Cau hinh PB6 la chan TX, PB7 la chan RX cua USART1


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
// Thiet lap che do lam viec cua cong la Alternate Function (AF)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
f) Cấu Hình cho USART
/*Thiet lap cac tham so truyen thong cho USART1*/
// Thiet lap hinh mac dinh
USART_StructInit(&USART_InitStructure);
// BaudRate = 115,2 kbits/s
USART_InitStructure.USART_BaudRate = 115200;
// Data bits = 8
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
// Stop bits = 1
USART_InitStructure.USART_StopBits = USART_StopBits_1;
// Parity = none
USART_InitStructure.USART_Parity = USART_Parity_No;
// Handshaking = none
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
// Cho phep truyen va nhan du lieu
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // Cho phep ngat xay ra doi voi


USART1
USART_Cmd(USART1, ENABLE); // Enable USART1
2. I2C
a) Vị trí của I2C trong BUS?

STM32F411CE được tích hợp 3 I2C: Gồm I2C1 , I2C2 , I2C3


Cả 3 I2C này đều ở BUS APB1.
Tần số của bus APB1 tối đa là 100MHz. Có các hệ số chia /1, 2,
4,8,16

b) Các chân Pin của I2C


Cặp Pin 1 Cặp Pin2

STT I2Cx SCL SDA SCL SDA BUS chưa I2C đó

1 I2C1 PB6 PB7 PB8 PB9 APB1

2 I2C2 PB10 PB3 PB10 PB9 APB1

3 I2C3 PA8 PB4 PA8 PB8 APB1

c) Cấu Hình chân PIN I2C


Vì các chân Pin của STM32F411CE có nhiều chức năng khắc nhau : VD:
GPIO, TIM, I2C, SPI,……. Nên do đó Muốn sử dụng các chức năng ngoại
vi như I2C bắt buộc phải cấu Hình Bit AF (GPIO_Afconfig()) để được sử
dụng ngoại vi
+ Cấu hình Cho các chân của I2C là
 Mode_AF,
 Kiểu đẩy kéo Là OD( open Drain) Vì điện áp làm việc với module giao
tiếp i2c Là 5V đo đó chân Kết nối module để điện áp mức thấp
 Các chân pin tương ứng với các I2Cx (Theo mục b)
 Tốc độ là tùy chọn ( 50Mhz, 2Mhz, 100MHz,…. )
 Kiểu đẩy kéo ( Ko đẩy kéo No PUPB)

VD: Configure cho I2C1 Chân PB6 và PB7


RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
/* Enable pins */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);
d) Cấu hình cho I2C
Tần số xung nhịp đầu vào ngoại vi ít nhất phải là:
• 2 MHz ở chế độ Sm
• 4 MHz ở chế độ Fm
Giao tiếp I2C có 2 loại là giao tiếp 7 bit và 10 bit (Thông thường các
module giao tiếp I2C(DS1307 , LCD I2C Thường dùng loại 7 bit)
Mode: Là mode I2C
Ban đầu disable ACK
Chọn clock ở chế độ Fm : 4MHz
Cấu hình I2C với DS1307
/* Set values */
I2C_InitStruct.I2C_ClockSpeed = 400000;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C_InitStruct.I2C_OwnAddress1 = 0x00;
I2C_InitStruct.I2C_Ack = I2C_Ack_Disable;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
/* Initialize I2C */
I2C_Init(I2Cx, &I2C_InitStruct);

You might also like