Найти тему

STM32 + I2C (STM32CubeMX). Плюс недостаток Arduino

На днях столкнулся с неожиданной проблемой Arduino: в стандартной библиотеке I2C нет функции получении по этому протоколу пачки данных, большей по размеру чем 256. А все потому, что буфер хранения по этому протоколу фиксирован.

I2C в Arduino управляется библиотекой Wire. Данные получить можно с помощью функции requestFrom, которая возвращает количество полученных данных. Так вот: она возвращает тип uint8_t, который по определению от 0 до 255.

Протокол I2C позволяет получить пакет данных, достаточно большого размера, за один раз, а Ардуино искусственно нас в этом ограничивает. И что же делать?

Обратиться к stm32.

Две программы, которые будем использовать
Две программы, которые будем использовать

Дано:

1. Плата NUCLEO-F746ZG

Хорошая плата, много чего полезного в ней есть, даже встроенный прошиватор. Единственный недостаток -- это габариты.

2. STM32CubeMX

3. STM32CubeIDE

4. Модуль, с которым можно связаться по протоколу I2C

Важно! Все программы надо запускать от имени Администратора, иначе могут быть проблемы!

Запустим STM32CubeMX

-2

В открывшемся окне можно выбрать следующие действия:

1. Выбрать менеджер микроконтроллеров

2. Выбрать менеджер отладочных плат

3. Выбрать кросс-менеджер

В моем случае, в наличии есть NUCLEO-F746ZG (не самая удобная плата из-за ее габаритов, ее фишка в возможностях), а значит я выбираю второй пункт.

-3

В сменившемся окне нужно ввести характеристики платы:

У моего микроконтроллера 144 пина
У моего микроконтроллера 144 пина
Серия 7-ая
Серия 7-ая

Справа внизу появится искомая плата:

-6

Ее нужно выбрать, а потом нажать в правом верхнем углу "Start Project"

-7

После нажатия заветной кнопки перед нами во всей красе предстает наш микроконтроллер.

У нас готовая плата и некоторые пины уже заняты, например, светодиодом или кнопкой
У нас готовая плата и некоторые пины уже заняты, например, светодиодом или кнопкой

Сразу проверяем одну неприятную фишку Куба. Раньше он, по умолчанию, выставлял Debug в состояние Disable. Это блокировало напрочь микроконтроллер и перепрошить его потом можно было только в режиме Connect-under-reset. Но, в моем случае, все уже установлено в SWD режим.

-9

Далее настроим некоторые периферийные вещи:

1. Источник тактирования

2. Интерфейс UART для информационных сообщений

3. Интерфейс I2C для общения с модулем

Главное достоинство STM32CubeMX это графическое управление настройками инициализации. Это не Arduino, которое все само делает по умолчанию, но и не традиционное программирование по регистрам. Дружелюбное к пользователю, но потеряться все равно можно.

Тактирование в плате включено по умолчанию.

Подключен кварцевый резонатор
Подключен кварцевый резонатор

Интерфейс UART включаем самостоятельно.

Выбираем режим Asynchronous
Выбираем режим Asynchronous

С интерфейсом UART получились какие-то странности: Куб выбрал какие-то странные пины для его включения.

-12

Хотя по Мануалу должны быть PD5, PD6.

-13

Пришлось нажимать на кнопки :) Правой клавишей нажимаем на PD6, из списка выбираем USART2_RX

-14

После таких нехитрых манипуляций, все встает на свои места. Странно, что автоматический разводчик сделал не так как надо, возможно, тут какая-то хитрость, которая вылезет позднее.

Включаем интерфейс I2C

Интерфейс я подключаю в режиме Fast Mode, который работает с частотой 400КГц
Интерфейс я подключаю в режиме Fast Mode, который работает с частотой 400КГц

Для обоих интерфейсов I2C UART пины были выбраны так, чтобы они располагались на одной гребенке на плате.

Красными квадратами указаны задействованные пины.
Красными квадратами указаны задействованные пины.

С интерфейсами мы закончили, необходимо настроить часы. Достаточно просто.

Просто введите в подчеркнутую область число 216 и нажмите энтер :)
Просто введите в подчеркнутую область число 216 и нажмите энтер :)

Следующий пункт -- это настройка проекта. Немного страшно тут, потому что хочу попробовать новоиспеченную программу STM32CubeIDE. Как я понял, за ней подразумевается будущее, одного версия 1.0.1 означает, что багов там... Надеюсь, нет :)

Выбираем необходимую IDE, снизу расположены файлы библиотек, которые будут использоваться STM32CubeMX при генерации проекта
Выбираем необходимую IDE, снизу расположены файлы библиотек, которые будут использоваться STM32CubeMX при генерации проекта

Во вкладке Генератор Кода из всех пунктов интересен только пункт "Keep User Code when re-generating". Он означает, что в тексте исходных кодов будут оставлены секции, куда можно вписывать свой код, который не будет затерт при повторной генерации кода STM32CubeMX

В этой секции можно оставить все по умолчанию
В этой секции можно оставить все по умолчанию

Продвинутые настройки позволяют выбрать, какую библиотеку использовать при генерации кода: HAL или LL.

Hardware Abstract Level (HAL) -- библиотека, в которой большинство настроек оперируется через структуры. В дальнейшем будет рассмотрена подробнее.

Low Layer(LL) -- библиотека, по сути, обертка для операций на уровне регистров. Она гораздо более понятнее, если необходимо познакомится с микроконтроллером поближе.

Здесь также оставим все по умолчению
Здесь также оставим все по умолчению

Вкладка Tools рассмотрена не будет, так как она заточена под расчет батареи.

Теперь можно нажимать кнопку GENERATE CODE. После удачного завершения процедуры генерации кода появится окно.

-21

Обычно я пользуюсь кнопкой Открыть Проект, но он почему-то открывал в True Studio, также установленную у меня на компьютере. Поэтому пришлось сначала открывать STM32CubeIDE и уже оттуда открывать проект.

После открытия проекта сразу рекомендую скомпилировать проект.

Необходимо нажать на эту кнопку
Необходимо нажать на эту кнопку

Скомпилироваться должно удачно.

Следующий шаг -- подключение платы к компьютеру через порт USB.

Должно получится подобное
Должно получится подобное

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

Такие должны быть настройки
Такие должны быть настройки

У меня была новенькая плата, поэтому версия прошивки на ней была устаревшая, и ПО начало его обновлять.

-25

Это интерфейс модуля обновления.

Просто нажмите Upgrade
Просто нажмите Upgrade

После удачного обновления прошивки, можно заново нажимать на зеленого жука. Должно появится предложение перейти в интерфейс отладки, и если вы согласитесь, то увидите экран ниже.

-27

Этот экран знаменует то, что загрузка прошивки и запуск отладки завершились успешно.

Здесь оканчивается первая часть, посвященная STM32CubeMX. Следующая часть будет рассказывать о программировании в среде STm32CubeIDE.

Лайк?