STM32F103 с использованием HAL и I2C: Подробная конфигурация и пример кода

Содержание

В этой статье мы рассмотрим подробную конфигурацию и код для работы с I2C на микроконтроллере STM32F103, используя HAL-библиотеки. Будет описан процесс настройки I2C с помощью CubeMX и предоставлен пример кода для работы с I2C устройством.

Конфигурация I2C с использованием CubeMX

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

  1. Скачайте и установите STM32CubeMX с официального сайта STMicroelectronics.
  2. Запустите CubeMX и создайте новый проект, выбрав микроконтроллер STM32F103.

Шаг 2: Настройка I2C интерфейса

  1. В окне Pinout Configuration выберите микроконтроллер STM32F103.
  2. В списке периферии найдите и активируйте I2C, выбрав нужные пины (например, I2C1 с пинами PB6 для SCL и PB7 для SDA).
  3. В разделе Configuration выберите «I2C1 Configuration». Настройте параметры:
    • I2C mode: I2C
    • Timing: Автоматически рассчитанное значение или вручную для более точной настройки.
  4. Настройте скорость работы шины I2C, выбрав соответствующее значение (например, 100 kHz).

Шаг 3: Настройка проекта

  1. Перейдите в раздел Project Manager и задайте имя проекта.
  2. Выберите инструмент компиляции (например, STM32CubeIDE).
  3. Нажмите Generate Code для генерации исходного кода проекта.

Пример кода для работы с I2C

После генерации кода, откройте проект в STM32CubeIDE или другом выбранном инструменте. Добавьте следующий код(С/C++) для взаимодействия с I2C устройством.
#include "main.h" #include "i2c.h" #include "usart.h" #include "gpio.h" #define I2C_ADDRESS 0x68 << 1 // Адрес I2C устройства I2C_HandleTypeDef hi2c1; // Объявление хендлера для I2C void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); static void MX_I2C1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); MX_I2C1_Init(); uint8_t dataToSend[2] = {0x00, 0x07}; // Пример данных для отправки uint8_t receivedData[2]; while (1) { // Отправка данных if (HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS, dataToSend, 2, HAL_MAX_DELAY) != HAL_OK) { printf("Error during transmission\r\n"); } HAL_Delay(1000); // Чтение данных if (HAL_I2C_Master_Receive(&hi2c1, I2C_ADDRESS, receivedData, 2, HAL_MAX_DELAY) != HAL_OK) { printf("Error during reception\r\n"); } else { printf("Received Data: 0x%02X 0x%02X\r\n", receivedData[0], receivedData[1]); } HAL_Delay(1000); } } void SystemClock_Config(void) { // Конфигурация системного таймера и тактирования микроконтроллера } static void MX_GPIO_Init(void) { // Инициализация GPIO } static void MX_USART2_UART_Init(void) { // Инициализация UART для вывода данных } static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // Скорость I2C 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(); } } void Error_Handler(void) { // Обработка ошибок while (1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { // Сообщение об ошибке в случае срабатывания assert } #endif /* USE_FULL_ASSERT */

Объяснение кода:

  1. Инициализация периферии:
    HAL_Init(), SystemClock_Config(), MX_GPIO_Init(), MX_USART2_UART_Init(), MX_I2C1_Init() — функции для инициализации системы, GPIO, UART и I2C.
  2. Определение I2C адреса устройства:
    #define I2C_ADDRESS 0x68 << 1 — установка адреса I2C устройства.
  3. Передача данных по I2C:
    HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS, dataToSend, 2, HAL_MAX_DELAY) — функция для передачи данных.
  4. Чтение данных по I2C:
    HAL_I2C_Master_Receive(&hi2c1, I2C_ADDRESS, receivedData, 2, HAL_MAX_DELAY) — функция для чтения данных.

Заключение:

Настройка I2C на STM32F103 с помощью CubeMX и HAL-библиотек позволяет быстро и эффективно настроить и использовать I2C интерфейс для обмена данными с различными устройствами. В данной статье мы рассмотрели основные шаги настройки и пример кода для работы с I2C устройствами.

FAQ:

1. Можно ли использовать другие пины для I2C на STM32F103?
Да, STM32F103 поддерживает несколько альтернативных пинов для I2C. Вы можете выбрать нужные пины в CubeMX.

2. Как изменить скорость работы шины I2C?
В функции

MX_I2C1_Init() задайте желаемую скорость (например, 100 kHz или 400 kHz) в параметре
hi2c1.Init.ClockSpeed
.

3. Какие библиотеки необходимы для работы с I2C?
Библиотеки HAL (Hardware Abstraction Layer) предоставляют все необходимые функции для работы с I2C на STM32.

4. Что делать, если устройство не отвечает на I2C запросы?
Проверьте правильность подключения, адрес устройства и параметры I2C. Возможно, потребуется настроить подтягивающие резисторы.