STM32F407 I2C: настройка и использование интерфейса I2C в микроконтроллерах STM32

Как настроить I2C на STM32F407. Какие режимы работы поддерживает I2C в STM32. Как передавать и принимать данные по I2C на STM32. Какие функции HAL используются для работы с I2C на STM32. Как подключить внешние устройства по I2C к STM32F407.

Что такое интерфейс I2C и его особенности

I2C (Inter-Integrated Circuit) — это последовательный протокол связи, широко используемый для соединения микроконтроллеров и периферийных устройств. Каковы ключевые характеристики I2C?

  • Использует всего 2 линии — SDA (данные) и SCL (тактирование)
  • Поддерживает подключение нескольких ведомых устройств к одному ведущему
  • Устройства идентифицируются по уникальным 7-битным адресам
  • Скорость передачи данных до 400 кбит/с в стандартном режиме
  • Поддерживает режим с несколькими ведущими устройствами

Благодаря простоте реализации и возможности подключения множества устройств, I2C стал популярным выбором для связи с датчиками, EEPROM, часами реального времени и другими периферийными устройствами в микроконтроллерных системах.


Конфигурация I2C на STM32F407 с помощью CubeIDE

Как настроить интерфейс I2C на STM32F407 с использованием CubeIDE? Процесс включает несколько основных шагов:

  1. Откройте проект в STM32CubeIDE и перейдите в режим конфигурации Pinout & Configuration
  2. В разделе Connectivity активируйте нужный интерфейс I2C (I2C1, I2C2 или I2C3)
  3. Настройте параметры I2C — скорость передачи, режим работы, адрес
  4. Сконфигурируйте выводы SCL и SDA в режим альтернативной функции AF4
  5. Сгенерируйте код инициализации I2C

После этого CubeIDE создаст необходимые структуры и функции для работы с I2C в файле main.c. Основная функция инициализации будет называться MX_I2Cx_Init(), где x — номер используемого интерфейса I2C.

Режимы работы I2C в микроконтроллерах STM32

Какие режимы работы поддерживает интерфейс I2C в микроконтроллерах STM32? Есть три основных режима:

1. Режим блокировки (Blocking Mode)

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


2. Режим прерываний (Interrupt Mode)

Здесь операции I2C выполняются в фоновом режиме, а завершение сигнализируется через прерывания. Это позволяет процессору выполнять другие задачи во время передачи данных по I2C.

3. Режим DMA (DMA Mode)

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

Выбор режима зависит от требований приложения к производительности и энергопотреблению.

Передача данных по I2C на STM32 с использованием HAL

Как осуществляется передача данных по I2C на STM32 с использованием библиотеки HAL? Рассмотрим основные функции:

Передача данных в режиме ведущего

Для отправки данных в режиме ведущего используется функция:

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

Параметры функции:

  • hi2c — указатель на структуру I2C_HandleTypeDef
  • DevAddress — 7-битный адрес ведомого устройства
  • pData — указатель на буфер с данными для передачи
  • Size — количество байт для передачи
  • Timeout — таймаут операции в миллисекундах

Прием данных в режиме ведущего

Для приема данных используется функция:


HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

Параметры аналогичны функции передачи, но pData здесь — буфер для приема данных.

Практический пример использования I2C на STM32F407

Рассмотрим практический пример использования I2C для работы с внешним EEPROM на STM32F407. Как реализовать чтение и запись данных?

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

// Запись данных в EEPROM
uint8_t data[] = {0x12, 0x34, 0x56, 0x78};
HAL_I2C_Mem_Write(&hi2c1, EEPROM_ADDRESS, 0x00, I2C_MEMADD_SIZE_16BIT, data, 4, 1000);

// Чтение данных из EEPROM
uint8_t read_data[4];
HAL_I2C_Mem_Read(&hi2c1, EEPROM_ADDRESS, 0x00, I2C_MEMADD_SIZE_16BIT, read_data, 4, 1000);

В этом примере мы инициализируем I2C, записываем 4 байта данных по адресу 0x00 в EEPROM, а затем считываем их обратно. Функции HAL_I2C_Mem_Write и HAL_I2C_Mem_Read упрощают работу с устройствами, имеющими внутреннюю адресацию.

Обработка ошибок при работе с I2C на STM32

Как обрабатывать ошибки при работе с I2C на STM32? Функции HAL возвращают статус операции типа HAL_StatusTypeDef. Возможные значения:


  • HAL_OK — операция выполнена успешно
  • HAL_ERROR — произошла ошибка
  • HAL_BUSY — интерфейс I2C занят
  • HAL_TIMEOUT — превышен таймаут операции

Пример обработки ошибок:

HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(&hi2c1, DEVICE_ADDRESS, data, 4, 1000);
if (status != HAL_OK) {
    switch (status) {
        case HAL_ERROR:
            // Обработка ошибки
            break;
        case HAL_BUSY:
            // Интерфейс занят, повторить позже
            break;
        case HAL_TIMEOUT:
            // Превышен таймаут операции
            break;
    }
}

Правильная обработка ошибок позволяет создавать более надежные приложения, способные восстанавливаться после сбоев связи.

Оптимизация производительности I2C на STM32F407

Как оптимизировать производительность I2C на STM32F407? Несколько ключевых рекомендаций:

  1. Используйте максимально возможную скорость передачи данных, поддерживаемую всеми устройствами на шине
  2. Применяйте режим DMA для передачи больших объемов данных
  3. Минимизируйте количество транзакций, объединяя несколько операций чтения/записи
  4. Оптимизируйте размер буферов для уменьшения накладных расходов на инициализацию передачи
  5. Используйте прерывания вместо постоянного опроса статуса для экономии энергии

Пример использования DMA для передачи данных:


HAL_I2C_Master_Transmit_DMA(&hi2c1, DEVICE_ADDRESS, data, data_size);
// Процессор свободен для других задач во время передачи

Оптимизация работы I2C позволяет повысить общую производительность системы и снизить энергопотребление, что особенно важно для мобильных и батарейных устройств.


Образцы микроконтроллеров STMicroelectronics серии STM32F3 на базе Cortex-M4 поступили на склад

Главная / Новости / Новости «STMicroelectronics» / Образцы микроконтроллеров STMicroelectronics серии STM32F3 на базе Cortex-M4 поступили на склад

Образцы новых микроконтроллеров новой серии STM32F3 на базе Cortex-M4 доступны для заказа.

Напомни, компания STMicroelectronics расширила свою линейку микроконтроллеров на базе ядра Cortex-M4 и представила новую линейку бюджетных микроконтроллеров STM32F3.

 Данное семейство относится к так называемым цифровым сигнальным контроллерам и объединяет в себе достоинства классических микроконтроллеров с развитым набором периферии и вычислительную мощь специализированных процессоров, позволяющих осуществлять вычисления с плавающей точкой на аппаратном уровне. Немаловажной особенностью является тот факт, что серия STM32F3 совместима по выводам с контроллерами серии STM32F1, STM32F2 и STM32F4. Таким образом, разработчик получает возможность, с одной стороны повысить вычислительную производительность системы без редизайна печатной платы, с другой стороны удешевить свои устройства, выполненные на базе микроконтроллеров серии STM32F4.

По мимо основных характеристик свойственных сериям STM32F1, STM32F2 и STM32F4: поддержка вычислений с плавающей точкой, увеличенный объем ОЗУ (до 192 Кб), поддержка полнодуплексного I2S, потребление менее 1 мка в спящем режиме (с включенным RTC), увеличенная частота работы АЦП (2.44 MSPS), ART (ускоритель работы с Flash), частота ядра до 168 МГц, STM32F3 включает дополнительные свойства, такие как: управление 3-х фазным мотором, интерфейс емкостного датчика,  7 аналоговых компараторов, до 4 операционных усилителей.

На сегодняшний день серия STM32F3 доступна в виде 4-х семейств: STM32F302, STM32F303STM32F372

STM32F373.

Основные характеристики STM32F3:

  • Ядро Cortex-M4 с тактовой частотой до 72 МГц
  • До 256 кБ Flash,  до 48 кБ SRAM
  • До 5 UART/USART
  • До 3 SPI/I2S
  • До 2 I2C
  • USB Full-Speed Device
  • До 2 12-ти битных АЦП
  • До 3 16-ти битных Сигма-Дельта АЦП
  • До 7 аналоговых компараторов
  • Встроенный операционный усилитель
  • Единое питание 2…3,6 В
  • Корпуса LQFP48, LQFP64, LQFP100, UFBGA100

Область применения:

  • торговое оборудование (кассовые аппараты, весы, терминалы оплаты)
  • счетчики электроэнергии, жидкости и газа
  • измерительные приборы
  • промышленные контроллеры
  • приборы анализа (газа, жидкости и др)
  • бытовая техника

Средства разработки:

На данный момент для работы с микроконтроллерами серии STM32F3, компания STMicroelectronics предлагает использовать отладочные средства для STM32F400 – STM3240G-EVAL и STM32F4DISCOVERY.

STM3240G-EVAL – универсальное многофункциональное отладочное средство, производства STMicroelectronics, предназначенное для разработки и отладки систем на безе микроконтроллера с ядром Cortex-M4, серии STM32F407.

Особенности отладочной платы STM3240G-EVAL:

  • установленный микроконтроллер STM32F407 — 32 бит, 1024 кБ Flash-памяти программ, 192 кБ RAM, внешняя шина данных (32 бита), 3 АЦП 12 бит, ЦАП 12 бит, 4 UART, 3 I2C, 2 CAN, 3 SPI, USB High-Speed и Full-Speed OTG, 2 I2S, работоспособность до 168 МГц, до 140 входов/выходов.
  • внешняя SRAM 16 Мбит
  • 3,2” 240х320 TFT цветной дисплей с тач-скрин
  • IP-камера
  • JTAG-коннектор 2×10 пин
  • установленный 25 МГц кварцевый резонатор
  • интерфейс CAN
  • SD/MMC разъем
  • Micro-AB USB разъем
  • интерфейс RS232
  • Ethernet разъем
  • потенциометр
  • джойстик
  • четыре пользовательских светодиода

STM32F4DISCOVERY – бюджетное полнофункциональное отладочное средство, производства STMicroelectronics, предназначенное для разработки и отладки систем на безе микроконтроллера с ядром Cortex-M4, серии STM32F407.

Особенности отладочной платы STM32F4DISCOVERY:

  • установленный микроконтроллер STM32F407 — 32 бит, 1024 кБ Flash-памяти программ, 192 кБ RAM, внешняя шина данных (32 бита), 3 АЦП 12 бит, ЦАП 12 бит, 4 UART, 3 I2C, 2 CAN, 3 SPI, USB High-Speed и Full-Speed OTG, 2 I2S, работоспособность до 168 МГц, до 114 входов/выходов.
  • 3-х осевой акселерометр LIS302DL
  • MP45DT02 MEMS аудио сенсор
  • CS43L22 аудио АЦП с интегрированным драйвером класса D
  • установленный 8 МГц кварцевый резонатор
  • Micro-AB USB разъем
  • две пользовательские кнопки
  • восемь пользовательских светодиода

Доступность:

Образцы микроконтроллеров STM32F3 будут доступны для заказа в 3-м квартале 2012 года

Ресурсы:

 

Документация на STM32F3

Описание отладочного средства STM3240G-EVAL

Описание отладочного средства STM32F4DISCOVERY

Заказать образцы STM32F3

 

Руководство

STM32: I2C.

Предпосылки: | Санскар Бисвал | Vicara Hardware University Рис.1 STM32 F4 DevKit

Это руководство не предназначено для изучения языка C или платформы STM32. Его основная цель — предоставить разработчикам краткое руководство по интеграции периферийных модулей и функций в активные приложения.

Если вы новичок, я бы порекомендовал вам ознакомиться с руководством по настройке проекта STM32, подобным этому.

https://medium.com/vicara-hardware-university/smt32-project-setup-with-cubeide-947974baf713

I2C использует два провода/канала соединения, часы и данные, обычно называемые SCL и SDA соответственно. Этот протокол позволяет осуществлять связь одного ведущего устройства с несколькими ведомыми устройствами. Дифференциация выполняется либо по адресу ведомого устройства, либо с помощью вывода GPIO для одновременного включения только одного устройства.

I2C может взаимозаменяемо использоваться в том же контексте, что и TWI (двухпроводной интерфейс).

Процесс инициализации периферийных устройств STM32 обрабатывается Cube IDE. Как только это будет сделано, генератор кода предоставит файл main.c с функцией I2C_Init(), настроенной в соответствии с настройками, указанными в файле Cube IDE.

Рис.2 Конфигурация Cube IDE для STM32F4 Discovery KitРис.3 Конфигурация I2C

В F407 Dev Kit I2C1 включен по умолчанию. Таким образом, сгенерированный код будет иметь функцию I2C1_Init() в файле main.c, а также вызывать ее.

Конфигурация будет соответствовать тем же параметрам, которые вы установили на вкладке «Конфигурация периферийных устройств».

Генератор также создаст дескриптор typedef I2C. Теперь мы можем использовать функции I2C API, используя этот дескриптор в качестве эталона.

I2C в STM32 можно выполнить тремя способами.

  1. Blocking Mode
  2. Interrupt Mode
  3. DMA Mode

Transmit Data:
 HAL_I2C_Master_Transmit(I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint8_t * pData, uint16_t Size, uint32_t Timeout) 

Parameters

   Parameters   
* hi2c: Указатель на структуру I2C_HandleTypeDef, которая содержит информацию о конфигурации для указанного I2C.
* DevAddress: Адрес целевого устройства: 7-битное значение адреса устройства
в таблице данных должно быть сдвинуто вправо перед вызовом
интерфейс
* pData: Указатель на буфер данных
* Размер: Количество данных для отправки
возвращаемые значения
* HAL: Состояние

Прием Данные:

 HAL_I2C_MASTER_RECEIV0044  Параметры  
* hi2c: Указатель на структуру I2C_HandleTypeDef, которая содержит
информацию о конфигурации для указанного I2C.
* DevAddress: Адрес целевого устройства: 7-битное значение адреса устройства
в таблице данных должно быть сдвинуто вправо перед вызовом
интерфейс
* pData: Указатель на буфер данных
* Размер: Количество данных для отправки
* Тайм-аут: Продолжительность тайм-аута
Возвращаемые значения
* HAL: статус

В этом руководстве мы обсудили методы использования I2C API из библиотеки CMSIS-HAL для чтения и записи на устройства I2C.

  • Рис. 1: https://microcontrollerslab.com/stm32f4-discovery-board-pinout-features-examples/
  • Документация HAL: https://www.st.com/resource/en/user_manual/dm00105879- description-of-stm32f4-hal-and-ll-drivers-stmicroelectronics.pdf

Документация по ядру Linux /devicetree/bindings/i2c/st,stm32-i2c.yaml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 4950 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
 # SPDX-License-Identifier: (только GPL-2.0 ИЛИ BSD-2-пункт)
%ЯМЛ 1.2
---
$id: http://devicetree.org/schemas/i2c/st,stm32-i2c. yaml#
Схема $: http://devicetree.org/meta-schemas/core.yaml#
Название: Контроллер I2C, встроенный в платформу STMicroelectronics STM32 I2C
сопровождающие:
 - Пьер-Ив МОДРРЕ  все:
 - $ref: /schemas/i2c/i2c-controller.yaml#
 - если:
 характеристики:
 совместимый:
 содержит:
 перечисление:
 - ст, stm32f7-i2c
 - ст,stm32mp15-i2c
 тогда:
 характеристики:
 i2c-scl-время нарастания-нс:
 по умолчанию: 25
 i2c-scl-время падения-нс:
 по умолчанию: 10
 ул, syscfg-fmp:
 Описание: Используйте для установки бита Fast Mode Plus в SYSCFG, когда
 Скорость Fast Mode Plus выбирается ведомым устройством.
 Формат соответствует смещению syscfg/register внутри
 syscfg / зарегистрируйте битовую маску для бита FMP.
 $ref: "/schemas/types.yaml#/definitions/фандл-массив"
 Предметы:
 Минимальные предметы: 3
 Максимальное количество предметов: 3
 - если:
 характеристики:
 совместимый:
 содержит:
 перечисление:
 - ст,stm32f4-i2c
 тогда:
 характеристики:
 тактовая частота:
 перечисление: [100000, 400000]
характеристики:
 совместимый:
 перечисление:
 - ст,stm32f4-i2c
 - ст, stm32f7-i2c
 - ст,stm32mp15-i2c
 рег:
 Максимальное количество предметов: 1
 прерывает:
 Предметы:
 - описание: идентификатор прерывания для события I2C
 - описание: идентификатор прерывания для ошибки I2C
 сбрасывает:
 Максимальное количество предметов: 1
 часы:
 Максимальное количество предметов: 1
 Дмас:
 Предметы:
 - описание: Фандл канала RX DMA
 - описание: TX DMA Channel phandle
 dma-имена:
 Предметы:
 - константа: rx
 - константа: TX
 тактовая частота:
 описание: Желаемая тактовая частота шины I2C в Гц. Если не указано,
 будет использоваться частота по умолчанию 100 кГц.
 Для SoC STM32F7, STM32H7 и STM32MP1, если параметры синхронизации
 совпадают, тактовая частота шины может быть от 1 Гц до 1 МГц.
 по умолчанию: 100000
 минимум: 1
 максимум: 1000000
требуется:
 - совместимый
 - рег
 - прерывает
 - сбрасывает
 - часы
неоцененные свойства: ложь
Примеры:
 - |
 #include #include //Пример 1 (совместимый с st,stm32f4-i2c)
 i2c@40005400 {
 совместимый = "st, stm32f4-i2c";
 #адрес-ячейки = <1>;
 #размер ячеек = <0>;
 регистр = <0x40005400 0x400>;
 прерывания = <31>, <32>;
 сбросы = <&rcc 277>;
 часы = <&rcc 0 149>;
 };
 - |
 #include #include //Пример 2 (совместимый с st,stm32f7-i2c)
 i2c@40005800 {
 совместимый = "st, stm32f7-i2c";
 #адрес-ячейки = <1>;
 #размер ячеек = <0>;
 регистр = <0x40005800 0x400>;
 прерывания = <31>, <32>;
 сбросы = <&rcc STM32F7_APB1_RESET(I2C1)>;
 часы = <&rcc 1 CLK_I2C1>;
 };
 - |
 #include

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *