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.
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
- LL_GPIO_MODE_OUTPUT
- LL_GPIO_MODE_ALTERNATE
- 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.
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