0

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ợ. image.png

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. image.png

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. image.png

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 image.png

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 trong I2C_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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí