API của LL Library trong stm32
LL EXTI Generic Driver
Trong vi điều khiển ARM Cortex-M, có một bộ điều khiển vector ngắt lồng nhau, thường được gọi là NVIC, được sử dụng để xử lí tất cả các ngắt và ngoại lệ mà Cortex-M hỗ trợ.
Tìm hiểu những tính năng quang trọng cần thiết để cấu hình ngắt ngoài trong vi điều khiển.
Interrupt Lines (EXTI0-EXTI15)
Vi điều khiển STM32 cung cấp số lượng nguồn ngắt ngoài và số đường truyền điều khiển ngắt ngoài khác nhau. Số lượng có thể tùy thuộc vào dòng STM32.
Các chân GPIO kết nối với bộ điều khiển ngắt vector lồng nhau thông qua các đường EXTI, hình bên dưới cho thấy cách các chân GPIO kết nối với 16 đường ngắt.
Một điều quan trọng cần lưu ý ở đây là nhiều chân đầu vào được kết nối với một đường điều khiển ngắt ngoài duy nhất. Do đó, chỉ khi nguồn ngắt hoặc đường đầu vào có thể được sử dụng với một đường EXTI cụ thể. Ví dụ: ngoài PA1, PB1, PC1, PD1, PE1, PF1 và PG1, bạn chỉ có thể sử dụng một chân duy nhất trong số tất cả các chân này với đường EXTI1. Điều này là do tất cả chúng đều được kết nối với cùng một đường EXTI1. Tuy nhiên, bạn có thể sử dụng PA1 và PA2 cùng lúc vì chúng được kết nối với các đường khác nhau.
Bây giờ mỗi dòng EXTI0-EXTI15 có thể được sử dụng để kích hoạt ngắt ở các chế độ khác nhau của tín hiệu: rising edge, falling edge hoặc rising_falling edge.
Interrupt Handler
Tính năng quang trọng tiếp theo là ISR hay còn gọi là trình xử lí ngắt (Interrupt Handler). Để có thể sử lí các ngắt, ta sử dụng ISR function.
Bảng dưới đây cho ta biết các Interrupt hander khác nhau cho các chân GPIO.
Chúng ta có tổng cộng 7 function handler để xử lí theo GPIO khi ta thiết lập ngắt ngoài. Điều này là do dòng 5 - 9 và dòng 10 - 15 có cùng trình xử lí ngắt.
RCC
LL_RCC_GetSystemClocksFreq(): Để lấy xung clock của các ngoại vi như System, AHB, APB1, APB2,..
I2C
LL_I2C_Disable(): Tắt I2C
LL_I2C_SetOwnAddress1(): đặt địa chỉ riêng của I2C (nếu nó làm Slave or Multi-master)
LL_I2C_EnableClockStretching(): Slave có thể giữ SCL ở mức LOW
để tạm chặn Master khi chưa kịp xử lí dữ liệu.
LL_I2C_ConfigSpeed(): cấu hình tốc độ bus I2C.
#define I2C_SPEEDCLOCK 100000
#define I2C_DUTYCYCLE LL_I2C_DUTYCYCLE_2
LL_I2C_ConfigSpeed(
I2C1, // Peripheral: I2C1
rcc_clocks.PCLK1_Frequency, // Tần số clock cấp cho I2C (lấy từ PCLK1)
I2C_SPEEDCLOCK, // Tốc độ mong muốn (ví dụ 100000 hoặc 400000 Hz)
I2C_DUTYCYCLE
Nói một tý về chỗ I2C_DUTYCYCLE có 2 mode
- LL_I2C_DUTYCYCLE_2
- LL_I2C_DUTYCYCLE_16_9
2 giá trị này chỉ sử dụng khi ta dùng I2C_SPEEDCLOCK = 400 (kHz) nghĩa là Fast Mode, còn ở Standard Mode thì không cần. Tuy nhiên, ta vẫn phải để chỗ đó là LL_I2C_DUTYCYCLE_2
để hàm có thể compile khi dùng Standard Mode.
LL_I2C_SetMode(I2C1, LL_I2C_MODE_I2C): Xác định chế độ hoạt động: I²C mode, SMBus Device, SMBus Host. Mặc định là I²C mode sau reset.
LL_I2C_AcknowledgeNextData(I2C1, LL_I2C_ACK): Dùng để thông báo cho phần cứng I²C là sau khi nhận xong 1 byte (địa chỉ or dữ liệu), Master sẽ gửi ACK hoặc NACK
ACK
→ báo cho Slave: “Master đã nhận byte này, gửi tiếp byte nữa”.NACK
→ báo cho Slave: “Master không muốn nhận nữa, dừng gửi”.
Hàm này liên quan trực tiếp tới việc đọc dữ liệu của Master khi ta thiết kế thư viện.
Và hàm này dùng để set bit số 10 trong thanh ghi I2C Control register 1
LL_I2C_IsActiveFlag_SB(): dùng để chờ cho đến khi bit SB
(Start Bit) trong thanh ghi I2C_SR1
của stm32 được set.
LL_I2C_TransmitData8(): ghi 1 byte vào thanh ghi I2C_DR
để truyền ra bus.
LL_I2C_IsActiveFlag_ADDR(): kiểm tra bit ADDR
- Nếu slave ACK thành công → bit
ADDR
trongI2C_SR1
được set ( =1 ).
LL GPIO Generic Driver
1 . LL_GPIO_InitTypeDef
LL_GPIO_InitTypeDef
được định nghĩa trong stm32f4xx_ll_gpio.h
Data Fields
- uint32_t Pin
- uint32_t Mode
- uint32_t Speed
- uint32_t OutputType
- uint32_t Pull
- uint32_t Alternate
2. GPIO Firmware driver API description
void LL_GPIO_SetPinMode(GPIO_TypeDef * GPIOx, uint32_t Pin, uint32_t Mode)
Description: Cấu hình mode GPIO cho một pin trên port.
GPIOx: GPIOA, GPIOB, GPIOC, ...
Pin
- LL_GPIO_PIN_0
- ...
- LL_GPIO_PIN_15
Mode:
- LL_GPIO_MODE_INPUT: chức năng đầu vào
- LL_GPIO_MODE_OUTPUT: chức năng đầu ra
- LL_GPIO_MODE_ALTERNATE: chức năng ngoại vi như I2C, UART, SPI,...
- LL_GPIO_MODE_ANALOG
✏️ Example:
// Cấu hình chân PA0 ở mode output
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_0, LL_GPIO_MODE_OUTPUT);
void LL_GPIO_SetPinPull (GPIO_TypeDef * GPIOx, uint32_t Pin, uint32_t Pull)
Description: Cấu hình GPIO pull-up or pull-down cho một pin trên port.
Pull:
- LL_GPIO_PULL_NO
- LL_GPIO_PULL_UP
- LL_GPIO_PULL_DOWN
✏️ Example:
// Cấu hình PA5 làm input với pull-up
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT);
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_5, LL_GPIO_PULL_UP);
// Cấu hình PB0 làm input không có pull (no-pull)
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_0, LL_GPIO_MODE_INPUT);
LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_0, LL_GPIO_PULL_NO);
uint32_t LL_GPIO_IsInputPinSet (GPIO_TypeDef * GPIOx, uint32_t PinMask)
Description: Đọc mức điện áp tại một pin
GPIOx: GPIOA, GPIOB, ...
PinMask:
- LL_GPIO_PIN_0
- ...
- LL_GPIO_PIN_15
- LL_GPIO_PIN_ALL
void LL_GPIO_SetOutputPin (GPIO_TypeDef * GPIOx, uint32_t PinMask)
Description: output HIGH (1) ra một pin.
void LL_GPIO_ResetOutputPin (GPIO_TypeDef * GPIOx, uint32_t PinMask)
Description: output LOW (0) ra một pin.
void LL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint32_t PinMask)
Description: Đảo trạng thái của một pin.
void LL_GPIO_SetPinSpeed (GPIO_TypeDef * GPIOx, uint32_t Pin, uint32_t Speed)
Cấu hình tốc độ cho một chân GPIO cụ thể.
Spead
- LL_GPIO_SPEED_FREQ_LOW
- LL_GPIO_SPEED_FREQ_MEDIUM
- LL_GPIO_SPEED_FREQ_HIGH
- LL_GPIO_SPEED_FREQ_VERY_HIGH
ErrorStatus LL_GPIO_DeInit (GPIO_TypeDef * GPIOx)
Description: Reset tất cả các thanh ghi cấu hình các pin trong một port GPIO về trạng thái mặc định.
ErrorStatus LL_GPIO_Init(GPIO_TypeDef GPIOx, LL_GPIO_InitTypeDef GPIO_InitStruct)
Description: Cấu hình các thuộc tính cơ bản của pin.
✏️ Example:
// Cấu hình PA5 là output push-pull, không pull-up, tốc độ cao
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
// Enable clock GPIOA
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
// Cấu hình PA5
GPIO_InitStruct.Pin = LL_GPIO_PIN_5;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
All rights reserved