На днях столкнулся с неожиданной проблемой Arduino: в стандартной библиотеке I2C нет функции получении по этому протоколу пачки данных, большей по размеру чем 256. А все потому, что буфер хранения по этому протоколу фиксирован.
I2C в Arduino управляется библиотекой Wire. Данные получить можно с помощью функции requestFrom, которая возвращает количество полученных данных. Так вот: она возвращает тип uint8_t, который по определению от 0 до 255.
Протокол I2C позволяет получить пакет данных, достаточно большого размера, за один раз, а Ардуино искусственно нас в этом ограничивает. И что же делать?
Обратиться к stm32.
Дано:
Хорошая плата, много чего полезного в ней есть, даже встроенный прошиватор. Единственный недостаток -- это габариты.
2. STM32CubeMX
3. STM32CubeIDE
4. Модуль, с которым можно связаться по протоколу I2C
Важно! Все программы надо запускать от имени Администратора, иначе могут быть проблемы!
Запустим STM32CubeMX
В открывшемся окне можно выбрать следующие действия:
1. Выбрать менеджер микроконтроллеров
2. Выбрать менеджер отладочных плат
3. Выбрать кросс-менеджер
В моем случае, в наличии есть NUCLEO-F746ZG (не самая удобная плата из-за ее габаритов, ее фишка в возможностях), а значит я выбираю второй пункт.
В сменившемся окне нужно ввести характеристики платы:
Справа внизу появится искомая плата:
Ее нужно выбрать, а потом нажать в правом верхнем углу "Start Project"
После нажатия заветной кнопки перед нами во всей красе предстает наш микроконтроллер.
Сразу проверяем одну неприятную фишку Куба. Раньше он, по умолчанию, выставлял Debug в состояние Disable. Это блокировало напрочь микроконтроллер и перепрошить его потом можно было только в режиме Connect-under-reset. Но, в моем случае, все уже установлено в SWD режим.
Далее настроим некоторые периферийные вещи:
1. Источник тактирования
2. Интерфейс UART для информационных сообщений
3. Интерфейс I2C для общения с модулем
Главное достоинство STM32CubeMX это графическое управление настройками инициализации. Это не Arduino, которое все само делает по умолчанию, но и не традиционное программирование по регистрам. Дружелюбное к пользователю, но потеряться все равно можно.
Тактирование в плате включено по умолчанию.
Интерфейс UART включаем самостоятельно.
С интерфейсом UART получились какие-то странности: Куб выбрал какие-то странные пины для его включения.
Хотя по Мануалу должны быть PD5, PD6.
Пришлось нажимать на кнопки :) Правой клавишей нажимаем на PD6, из списка выбираем USART2_RX
После таких нехитрых манипуляций, все встает на свои места. Странно, что автоматический разводчик сделал не так как надо, возможно, тут какая-то хитрость, которая вылезет позднее.
Включаем интерфейс I2C
Для обоих интерфейсов I2C UART пины были выбраны так, чтобы они располагались на одной гребенке на плате.
С интерфейсами мы закончили, необходимо настроить часы. Достаточно просто.
Следующий пункт -- это настройка проекта. Немного страшно тут, потому что хочу попробовать новоиспеченную программу STM32CubeIDE. Как я понял, за ней подразумевается будущее, одного версия 1.0.1 означает, что багов там... Надеюсь, нет :)
Во вкладке Генератор Кода из всех пунктов интересен только пункт "Keep User Code when re-generating". Он означает, что в тексте исходных кодов будут оставлены секции, куда можно вписывать свой код, который не будет затерт при повторной генерации кода STM32CubeMX
Продвинутые настройки позволяют выбрать, какую библиотеку использовать при генерации кода: HAL или LL.
Hardware Abstract Level (HAL) -- библиотека, в которой большинство настроек оперируется через структуры. В дальнейшем будет рассмотрена подробнее.
Low Layer(LL) -- библиотека, по сути, обертка для операций на уровне регистров. Она гораздо более понятнее, если необходимо познакомится с микроконтроллером поближе.
Вкладка Tools рассмотрена не будет, так как она заточена под расчет батареи.
Теперь можно нажимать кнопку GENERATE CODE. После удачного завершения процедуры генерации кода появится окно.
Обычно я пользуюсь кнопкой Открыть Проект, но он почему-то открывал в True Studio, также установленную у меня на компьютере. Поэтому пришлось сначала открывать STM32CubeIDE и уже оттуда открывать проект.
После открытия проекта сразу рекомендую скомпилировать проект.
Скомпилироваться должно удачно.
Следующий шаг -- подключение платы к компьютеру через порт USB.
Как только подключили, то можно попробовать загрузить прошивку в устройство и начать отладку: для этого нажмите на кнопку в виде зеленого жука. В появляющихся окнах со всем соглашайтесь, только проверьте, что включен интерфейс SWD.
У меня была новенькая плата, поэтому версия прошивки на ней была устаревшая, и ПО начало его обновлять.
Это интерфейс модуля обновления.
После удачного обновления прошивки, можно заново нажимать на зеленого жука. Должно появится предложение перейти в интерфейс отладки, и если вы согласитесь, то увидите экран ниже.
Этот экран знаменует то, что загрузка прошивки и запуск отладки завершились успешно.
Здесь оканчивается первая часть, посвященная STM32CubeMX. Следующая часть будет рассказывать о программировании в среде STm32CubeIDE.