Содержание статьи
Железо
Нам понадобятся официальная оценочная плата Discovery компании STMicroelectronics и модуль Wi-Fi на ESP8266. Последних существует огромное количество, подойдет практически любой. Главное, чтобы там были выводы RX/TX UART и стандартная прошивка для работы с АТ-командами. Я использую отечественный Troyka (модуль компании «Амперка») просто потому, что он у меня уже есть.
F746G Discovery — это практически Ferrari в мире хобби-электроники. Мощный микроконтроллер (Cortex-M7, 216 МГц) тут сочетается с микросхемой SDRAM внушительных объемов (целых 8 Мбайт) и полезной периферией: экран 480 × 272 с 24-битным цветом, интерфейс SDIO для карт памяти, разъемы аудио и Ethernet.
Я не буду перечислять все доступные возможности этой платы — ты можешь найти подробности на сайте производителя STMicroelectronics. Все то, что раньше приходилось добавлять к Arduino с помощью дочерних плат расширения или модулей, тут доступно «из коробки». Да, цена соответствующая — порядка 6500 рублей. Но когда это спортивные автомобили были для простого народа?
INFO
F746G Discovery — не единственный вариант демоплаты для этого проекта. Ты можешь с таким же успехом использовать, например, отладочную плату из серии Nucleo: F767ZI Nucleo. Для нее тоже есть поддержка в пакете STM32duino, и она гораздо дешевле — около 3000 рублей. Такого разнообразия периферии у нее, правда, нет.
Полноценно нагрузить все компоненты и использовать возможности F746 Discovery на сто процентов в одном проекте непросто. Сегодня с помощью библиотеки bearSSL мы протестируем только вычислительную мощь ядра Cortex-M7 в прикладных задачах криптографии.
WWW
Программирование под STM32 предполагает внимательное изучение сопроводительной документации. Сегодня я постараюсь осветить все подробности и интересности, которые встретятся нам на пути, но в дальнейшем все же настоятельно рекомендую обратиться к следующим материалам (все ссылки — на PDF):
- UM1907 — самая полная информация о плате Discovery: компоненты, схемы, назначение разъемов и прочее.
- DS10916 — даташит на микроконтроллер. Полезен распиновкой микросхемы F746NG в различных корпусах.
- RM0385 — говорят, на тех, кто осилит полностью все 1700+ страниц мануала, снисходит божественное просветление.
Настраиваем IDE
В качестве среды разработки я выбрал Arduino IDE. Проект открытый, и вокруг него успело сложиться большое сообщество, так что это хороший выбор как для новичка, так и для продвинутого пользователя. Кроме того, этот выбор позволит нам воспользоваться уже готовой кодовой базой. Таким образом, мы пропустим тривиальную настройку периферии и быстро перейдем к вещам более интересным.
Изначально в Arduino IDE доступны только платы на AVR-микроконтроллерах, ни о каком ARM она и не слышала. Чтобы включить поддержку плат STM32duino, нужно перейти в раздел Arduino → Preferences и добавить дополнительную ссылку. После этого в «Менеджере плат» ты сможешь скачать все необходимые файлы пакета.
INFO
Во время установки опция с STM32duino может и не появиться в списке доступных для установки расширений. В этом случае проверь разрешения для Arduino IDE на работу по сети или добавь в список исключений для антивируса.
Ищем пропавший Serial
Если ты еще не проверил корректность работы компилятора и самой платы на парочке простых примеров из числа встроенных, то сейчас самое время. Потому что мы переходим к правке исходных файлов по адресу «Библиотеки → Arduino15 → packages → STM32 → hardware → stm32» (советую сделать копию папки, ты знаешь, как оно бывает). Все дело в том, что проект STM32duino поддерживается энтузиастами (хотя сейчас им заинтересовалась сама STMicroelectronics) и, как следствие, часть функций Arduino реализована, а часть почему-то оказалась забыта.
Например, по умолчанию отсутствует последовательный порт (Serial) на выводах D0 и D1 разъема Arduino. Если ты знаком с оригинальными итальянскими платами (и их многочисленными китайскими клонами), то знаешь, что этот порт связан с разъемом USB через UART — USB-преобразователь в основном используется для общения с компьютером и при перепрошивке флеш-памяти. На Discovery все несколько по-другому.
Микроконтроллер F746NGH6 прошивается с помощью встроенного программатора ST-Link/V2-1 (небольшая микросхема возле miniUSB-порта). Он же выступает в качестве преобразователя интерфейсов при отправке данных на ПК. Но все это делается по другому UART — вовсе не тому, который выведен на плате на разъем Arduino (да, у контроллеров ST богатая периферия, об этом следовало сказать заранее).
Если в прошлом ты использовал плату Arduino Leonardo, то можешь предположить, что для этого интерфейса используется объект Serial1
. Но нет! В проекте STM32duino нумерация программных портов Serial
соответствует номеру аппаратного периферийного блока UART, и поэтому в любом коде для нашей Discovery Serial
и Serial1
— это один и тот же объект (используется переопределение).
Как тогда обращаться к UART на разъеме Arduino? Изучив таблицу 4 на странице 23 документации демоплаты, ты узнаешь, что это RX/TX-выводы UART6.
Впрочем, одного лишь этого знания будет недостаточно: компилятор сообщит, что Serial6
не определен. Чтобы добавить порт UART для работы с ESP8266, нужно отредактировать конфигурационные файлы самой платы — они располагаются по адресу stm32 → 1.4.0 → variants → DISCO_746NG. В самих файлах нет ни намека на возможное решение проблемы, но тщательное изучение исходников проекта STM32duino (папка cores на уровне с variants) должно навести на определенные идеи. На самом деле нам достаточно добавить несколько строчек в файл variants.h
:
#define ENABLE_HWSERIAL6 1
#define PIN_SERIAL6_RX PC7
#define PIN_SERIAL6_TX PC6
Почему их нельзя было оставить в файле закомментированными, чтобы пользователи не тратили время на знакомство с нюансами реализации Arduino-окружения на платах от ST, — это для меня загадка. Однако теперь объект Serial6
станет доступен в нашем коде, и мы наконец сможем наладить взаимодействие с модулем Wi-Fi.
INFO
Следующие шаги опциональные, однако, если ты хочешь получить максимум быстродействия от связки F746 и ESP8266, советую их не пропускать. Тем более что после них с настройкой окружения будет наконец покончено.
Дополнительно
Нам нужно настроить размеры внутренних буферов класса HardwareSerial
на прием и передачу информации по интерфейсу UART. По умолчанию размеры подобраны для плат Arduino с микроконтроллерами AVR, и это может стать проблемой при передаче больших массивов данных (как раз наш случай). В папке cores → arduino открой файл HardwareSerial.h
и найди в нем такие строчки:
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»