DocsTech
/
NONEDISPLAY
/

~ cd 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. Возможно, потребуется настроить подтягивающие резисторы.

Главная
Курсы
Вебинары
Анализ рынка вакансий в сфере RTL-дизайна в России: тренды, спрос и перспективы
LinuxCNC: Преимущества и применение в станкостроении и автоматизации
Алгоритм Хаффмана: Теория, методология и практическая реализация для эффективного сжатия данных
Chisel vs. SystemVerilog: Новый взгляд на проектирование цифровых схем
Подключение датчика ZMPT101B к Arduino: схема, настройка и пример кода
Подключение MAX6675 к Arduino: схема, библиотеки и примеры кода
Подключение и настройка MPU6050 к Arduino: схема, библиотеки и скетч
Подключение VL53L0X к Arduino: полное руководство по лазерному датчику расстояния
Подключение компас HMC5883L к Arduino: схема, библиотеки и пример кода
Подключение ACS712 к Arduino: схема, библиотеки и скетчи
Подключение ADXL345 к Arduino: схема, библиотеки и код
Подключение датчика INA219 к Arduino: схема, библиотеки и примеры кода
HC-SR04 и Arduino: схема подключения, библиотеки и скетч
Assertion-Based Verification(ABV): основные понятия, принцип работы и примеры
Подключение HX711 к Arduino: схема, библиотеки и код
Подключение DHT22 к Arduino: схема, код и необходимые библиотеки
Как подключить RCWL-0516 к Arduino: схема, библиотеки и скетч
Универсальная Методология Верификации (UVM): Описание, Особенности и Пример Использования
DS18B20: Подключение к Arduino, Библиотеки и Скетч
Методологии верификации HDL-кода: Основы, Преимущества и Популярные Подходы
Роль ПЛИС в Алготрейдинге и Высокочастотной Торговле
Lint, CDC, RDC, LEC, Power Analyzer, STA и DFT для HDL
Пиратство плохо! Мне так сказали…
Применение Icarus Verilog для тестирования с входными данными
Ключевые параметры для выбора цифроаналогового преобразователя (ЦАП)
Все о КНФ и ДНФ: Понятие, Примеры и Применение
Импликация: Что Это, Таблица Истинности и Применение в Информатике
Стрелка Пирса: Что Это за Логическая Операция и Таблица Истинности
Штрих Шеффера: Полное Руководство
STM32F103 с использованием HAL и I2C: Подробная конфигурация и пример кода
Подключение DHT11 к ESP32: Схема, Библиотеки и Пример Кода
ESP8266 I2C: настройка для master и slave
Подключение DHT11 к Arduino и Вывод на LCD 1602 I2C: Схема и Скетч
Подключение DHT11 к Arduino: Схема, Библиотеки и Скетч
ESP32 I2C: Настройка кода под master и slave
TM1637 Подключение к Arduino: Полное Руководство
Подключение часов DS3231 к Arduino и LCD 1602 I2C
Arduino: Часы Реального Времени DS1302 на LCD 1602 I2C
ESP32 SPI: Объявление SPI на ESP32 с Примером Кода
ESP8266 SPI: полная инструкция SPI на ESP8266
Протокол SPI: Регистровая Логика, Передача Данных и Режимы
Демультиплексор: принцип работы, схема и основы
Счетчики с синхронным и асинхронным сбросом на Verilog
Знаковость signed в Verilog: примеры, синтаксис, оптимизация
Директива Define в Verilog: Синтаксис, Примеры и Применение
Таблицы истинности триггеров: JK, RS, D и T
Fork и begin в Verilog: обзор и различия
Posedge и Negedge в Verilog: Синтаксис и Функциональность
Verilog always: Синтаксис, Примеры и Применение
Wire в Verilog: Основы использования, синтаксис и примеры кода
Блокирующие и неблокирующие присваивания в Verilog
Verilog Assign: что делает этот оператор?
Verilog Parameter: Ключевой Инструмент Оптимизации
Многомерные массивы в Verilog
Case Verilog
Дешифратор. Принцип работы и Примеры
Модули в Verilog
Описание FIFO. Примеры на Verilog и С++
Закрыть