DocsTech
/
Микроконтроллеры(МК)
/

~ cd stm32 hal dma i2c: полное руководство с примером

Интерфейс I2C (Inter-Integrated Circuit) широко используется для связи микроконтроллеров с периферийными устройствами, такими как датчики, EEPROM и другие устройства. В микроконтроллерах STM32 использование библиотеки HAL (Hardware Abstraction Layer) и DMA (Direct Memory Access) упрощает разработку и повышает производительность. В данной статье мы подробно рассмотрим создание и настройку интерфейса I2C с использованием HAL и DMA на микроконтроллере STM32, приведем пример кода и обсудим особенности построения. Рекомендуем прочитать статью про интерфейс I2C.

Введение в STM32 HAL DMA I2C

Микроконтроллеры STM32 предлагают гибкий и мощный I2C интерфейс, который позволяет эффективно взаимодействовать с различными периферийными устройствами. HAL библиотека упрощает работу с I2C интерфейсом, а использование DMA обеспечивает автоматизацию передачи данных, снижая нагрузку на центральный процессор и повышая общую производительность системы.

Особенности построения I2C с DMA на STM32

  1. Автоматизация передачи данных: Использование DMA позволяет передавать данные между памятью и периферийными устройствами без участия центрального процессора.
  2. Увеличение производительности: Благодаря DMA возможно передавать данные с высокой скоростью и минимальными задержками.
  3. Гибкость настройки: STM32CubeMX предоставляет удобный интерфейс для настройки параметров I2C и DMA, что позволяет быстро и легко конфигурировать проект под конкретные требования.

Пример объявления интерфейса I2C с DMA на STM32

Рассмотрим процесс создания интерфейса I2C с использованием DMA на микроконтроллере STM32 шаг за шагом.

Шаг 1: Создание проекта в STM32CubeMX

  1. Создание нового проекта: Откройте STM32CubeMX и создайте новый проект, выбрав нужный микроконтроллер STM32.
  2. Настройка пинов: В разделе «Pinout & Configuration» настройте пины для I2C интерфейса (например, SCL и SDA).
  3. Включение DMA: В разделе «Configuration» выберите I2C и включите соответствующие каналы DMA для передачи и приема данных.

Шаг 2: Настройка параметров I2C и DMA

  1. Настройка I2C: Выберите режим работы I2C (мастер или слейв), задайте скорость передачи данных, адрес устройства и другие параметры.
  2. Настройка DMA: Выберите режим работы DMA, направление передачи данных (передача/прием), настройте приоритет и другие параметры.

Шаг 3: Генерация кода

После завершения настройки нажмите кнопку «Generate Code» для генерации проекта. Откройте сгенерированный проект в IDE, например, STM32CubeIDE или Keil.

Шаг 4: Инициализация I2C и DMA в коде

Добавьте следующий код(C/C++) в основной файл проекта (main.c) для инициализации I2C интерфейса и DMA:
...
Копировать
#include "main.h"

// Определение структуры для I2C и DMA
I2C_HandleTypeDef hi2c1;
DMA_HandleTypeDef hdma_i2c1_rx;
DMA_HandleTypeDef hdma_i2c1_tx;

// Функция инициализации I2C
void MX_I2C1_Init(void)
{
    hi2c1.Instance = I2C1;
    hi2c1.Init.ClockSpeed = 100000;
    hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.OwnAddress2 = 0;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    if (HAL_I2C_Init(&hi2c1) != HAL_OK)
    {
        // Инициализация не удалась
        Error_Handler();
    }
}

// Функция инициализации DMA
void MX_DMA_Init(void)
{
    // Включение тактирования DMA
    __HAL_RCC_DMA1_CLK_ENABLE();

    // Настройка DMA для I2C1_RX
    hdma_i2c1_rx.Instance = DMA1_Channel7;
    hdma_i2c1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_i2c1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_i2c1_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_i2c1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_i2c1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_i2c1_rx.Init.Mode = DMA_NORMAL;
    hdma_i2c1_rx.Init.Priority = DMA_PRIORITY_LOW;
    if (HAL_DMA_Init(&hdma_i2c1_rx) != HAL_OK)
    {
        // Инициализация не удалась
        Error_Handler();
    }

    // Связывание DMA с I2C
    __HAL_LINKDMA(&hi2c1, hdmarx, hdma_i2c1_rx);

    // Настройка DMA для I2C1_TX
    hdma_i2c1_tx.Instance = DMA1_Channel6;
    hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_i2c1_tx.Init.Mode = DMA_NORMAL;
    hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_LOW;
    if (HAL_DMA_Init(&hdma_i2c1_tx) != HAL_OK)
    {
        // Инициализация не удалась
        Error_Handler();
    }

    // Связывание DMA с I2C
    __HAL_LINKDMA(&hi2c1, hdmatx, hdma_i2c1_tx);

    // Настройка прерываний DMA
    HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
    HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
}

// Основная функция
int main(void)
{
    // Инициализация HAL
    HAL_Init();

    // Настройка системы тактирования
    SystemClock_Config();

    // Инициализация DMA
    MX_DMA_Init();

    // Инициализация I2C
    MX_I2C1_Init();

    // Основной цикл
    while (1)
    {
        // Ваш код здесь
    }
}

Шаг 5: Функции передачи и приема данных с использованием DMA

Добавьте функции(C/C++) для передачи и приема данных по I2C с использованием DMA:
...
Копировать
// Функция передачи данных по I2C с DMA
HAL_StatusTypeDef I2C_Transmit_DMA(uint16_t DevAddress, uint8_t *pData, uint16_t Size)
{
    return HAL_I2C_Master_Transmit_DMA(&hi2c1, DevAddress, pData, Size);
}

// Функция приема данных по I2C с DMA
HAL_StatusTypeDef I2C_Receive_DMA(uint16_t DevAddress, uint8_t *pData, uint16_t Size)
{
    return HAL_I2C_Master_Receive_DMA(&hi2c1, DevAddress, pData, Size);
}

Преимущества использования I2C с DMA на STM32

  1. Снижение нагрузки на процессор: Автоматизация передачи данных освобождает центральный процессор для выполнения других задач.
  2. Увеличение производительности: Быстрая передача данных между периферийными устройствами и памятью.
  3. Эффективность: Поддержка больших объемов данных и высокой скорости передачи.

Заключение

Интерфейс I2C с использованием DMA на STM32 предоставляет мощные возможности для разработки и управления различными периферийными устройствами. В этой статье мы рассмотрели основные особенности построения I2C с DMA на STM32 и привели пример объявления интерфейса с использованием HAL и DMA. Понимание принципов работы и умение эффективно использовать I2C с DMA позволяет разработчикам создавать более сложные и функциональные системы.

Главная
Курсы
Вебинары
OpenMV N6: революционный модуль машинного зрения на базе STM32N6
STM32 HAL DMA I2C: Полное Руководство с Примером
STM32 SPI HAL DMA через STM32CubeIDE: Пример Создания Проекта и Особенности Построения
SSD1306 подключение к STM32: код, схема и библиотеки
Контроллер DMX512 под STM32
БИХ (рекурсивный) фильтр на STM32
Закрыть