SportIduino и активный чип. Часть 2. Выбор платформы, создание прототипа.

В 1-й части я описал идею создания активного чипа. После этого я практически сразу заказал в интернет-магазине ЧИП&ДИП микросхемы STM32L011D4 и NT3H2211. Срок поставки был указан 3-6 недель и я, ожидая микросхемы, начал штудировать информацию по STM32, поскольку с ними я ранее еще не работал.

Так как ассортимент микросхем, производимых STM32, по сравнению с AVR намного больше, и состав программируемых периферийных блоков внутри каждой микросхемы STM32 также гораздо больше, то вполне логично, что производитель создал бесплатное приложение STM32CubeMX, в котором сначала создается проект (выбирается микросхема STM32), а затем в интерактивном режиме конфигурируются задействованные в этом проекте пины (выводы микросхемы) (см.рис.1), а также задействованная в проекте периферия микросхемы (таймеры, ЦАПы, шины I2C, UART и т.п.).

Рис.1
Конфигурирование выводов микросхемы в STM32CubeMX

На закладке «Clock Configuration»  (см.рис.2) настраивается система тактирования микросхемы под нужды своего проекта. Здесь наглядно конфигурируются источники тактирования внутренних блоков микросхемы (с учетом выбранной ранее периферии), опять же под нужды своего проекта.

Рис.2
Настройка системы тактирования в STM32CubeMX

После чего на закладке «Project Manager» можно указать среду разработки (компилятор Си), для которого STM32CubeMX сгенерирует начальный код инициализации микросхемы согласно интерактивно сделанным настройкам. Также там можно указать, какого типа драйвера следует использовать для генерации начального кода. Выбор типов драйверов там небольшой:

    • HAL – драйвера высокого уровня, именно их рекомендует использовать производитель, потому что функции HAL универсальные и обеспечивают переносимость программного кода, написанного с использованием HAL, при переходе с одной модели STM32 на другую (а в ассортименте STM32 сотни, если не тысячи моделей);
    • LL – низкоуровневые драйвера, имеют (по сравнению с HAL) компактный размер и более высокую производительность, однако набор функций зависит от выбранной в проекте микросхемы (нет универсальности).

Ну я такой окрыленный естественно выбрал драйверы HAL, выбрал периферию (пару таймеров, АЦП, I2C, UART для отладки) с использованием прерываний и сгенерировал программный код для бесплатной среды Atollic TrueSTUDIO. Открыл в ней сгенерированный программный код, скомпилировал его и … не поверил своим глазам! Размер программного кода слегка превышал весь размер flash-памяти микросхемы STM32L011D4 (у нее 16KB flash-памяти)!!! И это только первоначальная конфигурация микросхемы, в которой еще нет ни байта прикладного кода! Я посмотрел внимательнее, куда же расходуется память в этом HAL? А там подход следующий – перед тем, как будет вызвана функция инициализации какого-нибудь периферийного блока (например, таймера), сначала заполняются параметры этой функции. Как правило это структуры размером в большие десятки байт, в значения которых записываются как значения, необходимые для последующей записи в конфигурационные регистры этой периферии, так и адреса функций обратного вызова (переопределяемые адреса обработчиков событий, в том числе и по прерываниям). Размеры структур были 68 байт, 54 байта и т.п. И затем уже вызывалась функция инициализации, в которой значения из параметров (структур) частично записывались в конфигурационные регистры этой периферии, а частично сохранялись в других структурах, используемых при вызове обработчиков событий. Учитывая, что регистры в STM32 сплошь 32-х разрядные, то и программный код, оперирующий заполнением структур и значений регистров, получался немаленьким (по сравнению с 8-ми разрядными AVR).

Ладно, тогда я умерил аппетиты, убрал в STM32CubeMX использование прерываний там, где это некритично, установил использование низкоуровневых драйверов LL, сгенерировал еще раз программный код для Atollic TrueSTUDIO, скомпилировал его (см.рис.3). Этот программный код занял уже чуть более 53%:

Рис.3
Скомпилированный программный код инициализации с драйверами LL занимает около 53%

Это примерно в 2 раза компактнее кода, сгенерированного с драйверами HAL, но все равно размер слегка ошарашивает. Я для отладки добавил использование маломощного последовательного порта LPUART, если убрать LPUART из состава периферии STM32CubeMX, то размер инициализационного кода будет около 40%. Но на первое время без отладки будет тяжело, поэтому пока решил оставить.

Но далее я случайно наткнулся на упоминание о новой серии микросхем ATTINY – это микросхемы AVR ATTINY1614 и не только. В 1-й части я сравнивал микросхему STM32L011D4 с ATtiny45V (старая серия ATTINY), а вот новая ATTINY1614 обладает уже совсем другими характеристиками:

    • 14 выводов (как и STM32L011D4), и при этом несколько выводов способны пробуждать микросхему из глубокой спячки. У нее более умно (в сравнении STM32L011D4) используются выводы под коммуникационную периферию – выводы под UART, SPI и I2C изначально никак не перебивают друг друга и можно без проблем задействовать всю эту периферию одновременно;
    • Размер flash-памяти программ равен уже 16KB (как и у STM32L011D4), но при этом это 8-ми разрядный микроконтроллер, и программный код для него должен быть компактнее;
    • Размер оперативной памяти равен 2KB (как и у STM32L011D4);
    • Значительно расширен состав встроенной периферии: есть уже 5 таймеров, 2 АЦП, еще масса всего, и при этом почти у каждой периферии в регистре управления есть отдельный бит, разрешающий оставлять эту периферии работать в режиме сна или нет. Что позволяет очень гибко регулировать энергопотребление;
    • Программирование и отладка возможна по 1-му сигнальному выводу UPDI. Если для полноценной отладки необходимо покупать фирменную отладочную плату (например, ATTINY3217-XPRO), то для программирования достаточно залить готовый скетч в плату Arduino NANO, превращающий эту плату в UPDI-программатор (здесь подробно описано, как это сделать).

Чем больше я заочно знакомился с возможностями ATTINY1614, тем больше я загорался)) В итоге через неделю после 1-го моего заказа в ЧИП&ДИП я сделал 2-й заказ – на этот раз заказал микросхемы ATTINY1614 и NT3H2211. С таким же сроком доставки 3-6 недель. Как ни странно, но в конце прошлой неделе я получил 2-й заказ (1-й еще едет). На выходных выкроил немного времени (спасибо дождливой погоде) и спаял себе прототип активного чипа и собрал на макетной плате отладочный стенд (см.рис.4), в состав которого входит прототип активного чипа (пока без антенны и батарейки, но со светодиодом), UPDI-программатор и адаптер USB-UART TTL (для вывода отладочных сообщений на компьютер):

Рис.4
Отладочный стенд в сборе

Написал тестовый скетч, который подает питание на микросхему NT3H2211, а затем в бесконечном цикле (один блок раз в 5 секунд) по шине I2C читает сначала содержимое сессионных регистров микросхемы NT3H2211, а затем содержимое блоков EEPROM и RAM. Залил из Arduino этот скетч в микросхему ATTINY1614, открыл в отдельном окне терминальную программу  (см.рис.5) – все работает и занимает 36% flash-памяти:

Рис.5
Тестовый скетч чтения данных из NT3H2211

Кстати говоря, в новой серии ATTYNY есть микросхемы ATTYNY412 с 8-ю выводами. Этого количества выводов для активного чипа хватает как раз: 2 вывода под питание, 2 — под шину I2C, 1 – под программирование UPDI, а 3 оставшихся вывода — включение светодиода активного чипа, чтение вывода FD с микросхемы NT3H2211 и подача питания на микросхему NT3H2211. Есть только одно «НО» — размер flash-памяти у них составляет всего 4KB. Хватит ли  этой памяти под рабочую прошивку – это покажет только время. Сейчас все занимает отладочная информация, а в рабочем варианте прошивки не будет использоваться UART и функция sprintf(), жрущая память.