«Хакер» немало писал об уязвимостях самых разных гаджетов, а вот о том, как создать защищенное устройство самому, мы до сих пор не говорили. Настало время посмотреть на эту проблему с другой стороны: в этой статье мы сделаем свой девайс, запустив шифрованное соединение TLS на микроконтроллере STM32.
Нам понадобятся официальная оценочная плата 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 рублей. Но когда это спортивные автомобили были для простого народа?
F746G Discovery — не единственный вариант демоплаты для этого проекта. Ты можешь с таким же успехом использовать, например, отладочную плату из серии Nucleo: F767ZI Nucleo. Для нее тоже есть поддержка в пакете STM32duino, и она гораздо дешевле — около 3000 рублей. Такого разнообразия периферии у нее, правда, нет.
Полноценно нагрузить все компоненты и использовать возможности F746 Discovery на сто процентов в одном проекте непросто. Сегодня с помощью библиотеки bearSSL мы протестируем только вычислительную мощь ядра Cortex-M7 в прикладных задачах криптографии.
Программирование под STM32 предполагает внимательное изучение сопроводительной документации. Сегодня я постараюсь осветить все подробности и интересности, которые встретятся нам на пути, но в дальнейшем все же настоятельно рекомендую обратиться к следующим материалам (все ссылки — на PDF):
В качестве среды разработки я выбрал Arduino IDE. Проект открытый, и вокруг него успело сложиться большое сообщество, так что это хороший выбор как для новичка, так и для продвинутого пользователя. Кроме того, этот выбор позволит нам воспользоваться уже готовой кодовой базой. Таким образом, мы пропустим тривиальную настройку периферии и быстро перейдем к вещам более интересным.
Изначально в Arduino IDE доступны только платы на AVR-микроконтроллерах, ни о каком ARM она и не слышала. Чтобы включить поддержку плат STM32duino, нужно перейти в раздел Arduino → Preferences и добавить дополнительную ссылку. После этого в «Менеджере плат» ты сможешь скачать все необходимые файлы пакета.
Во время установки опция с STM32duino может и не появиться в списке доступных для установки расширений. В этом случае проверь разрешения для Arduino IDE на работу по сети или добавь в список исключений для антивируса.
Если ты еще не проверил корректность работы компилятора и самой платы на парочке простых примеров из числа встроенных, то сейчас самое время. Потому что мы переходим к правке исходных файлов по адресу «Библиотеки → 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.
Следующие шаги опциональные, однако, если ты хочешь получить максимум быстродействия от связки F746 и ESP8266, советую их не пропускать. Тем более что после них с настройкой окружения будет наконец покончено.
Нам нужно настроить размеры внутренних буферов класса HardwareSerial
на прием и передачу информации по интерфейсу UART. По умолчанию размеры подобраны для плат Arduino с микроконтроллерами AVR, и это может стать проблемой при передаче больших массивов данных (как раз наш случай). В папке cores → arduino открой файл HardwareSerial.h
и найди в нем такие строчки:
Материалы из последних выпусков можно покупать отдельно только через два месяца после публикации. Чтобы продолжить чтение, необходимо купить подписку.
Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке
1 год7190 р. Экономия 1400 рублей! |
1 месяц720 р. 25-30 статей в месяц |
Уже подписан?
Читайте также
Последние новости