Уже довольно давно в продаже появилась новая плата из серии discovery от STMicroelectronics. Думаю, хабрасообществу будет интересно познакомиться с ней поближе. Под катом вас ожидает краткий обзор новой демоплаты и интересный пример её применения.
Плата предназначена для демонстрации возможностей STM32L053C8, представителя серии ультранизкопотребляющих микроконтроллеров. Помимо него, на плате установлен ещё один чип от ST (STM32L152CCT6), который измеряет ток, потребляемый главным МК в различных режимах. Традиционно на плате реализован программатор/отладчик ST-Link (версии 2.1), позволяющий прошивать и отлаживать по интерфейсу SWD как целевой МК, так и внешние чипы. Ещё ST-Link 2.1 реализует преобразователь USB-COM, а также появляется в системе как съёмный диск, позволяя прошивать микроконтроллер простым копированием бинарного файла.
Основной особенностью платы является дисплей, выполненный по технологии электронных чернил. Дисплей не большой (2.04 дюйма, 172x72) и до собратьев, установленных в электронных книжках ему далеко, но он вполне подходит для отображения разнообразной информации.
Плата поставляется с демонстрационной прошивкой, которая работает в двух режимах (впрочем, толковый из них только первый): измерение и отображение на e-ink экране потребляемого STM32L053C8 тока или в режиме USB мыши. Выбор режимов осуществляется сенсорным слайдером.
Концепция применения платы
Когда я получил плату и увидел на обесточенном экране логотип ST, то сразу захотел сделать автономное, практически не потребляющее энергии устройство, которое будет отображать какую-либо редко меняющуюся информацию. Про него можно вообще забыть, а оно всё равно будет что-то показывать спустя месяцы и даже годы. Например, сколько дней осталось до какого либо события. Так и родилась концепция устройства: электронно-бумажный счётчик дней обратного отсчета, который будет всё время напоминать о неумолимом приближении дедлайна, нового года, дня рождения (нужное подчеркнуть).
Сказано — сделано! Через некоторое время отладочная плата превратилась в устройство. Для питания используется батарейка малой ёмкости. Можно использовать любую с напряжение 3 В, у меня это «таблетка» CR2032 в держателе. Микроконтроллер находится в спящем режиме с включенным модулем часов реального времени (RTC). При наступлении очередного дня, RTC будит контроллер, который обновляет счётчик обратного отсчета дней на экране. Так как экран потребляет энергию только в процессе перерисовки, все основное время батарейка питает часы в контроллере и лишь изредка энергия уходит на обновление счётчика. Для настройки используется USB (точнее UART через USB-COM преобразователь предоставляемый отладчиком на плате). Плата вместе с батарейкой отлично умещается в родную пластиковую упаковку. В процессе реализации добавилась ещё одна функция – нарастающий счётчик дней, который обнуляется нажатием кнопки User. Это может быть полезным для мотивации, например: «не курю 38 дней», «не пропускал тренировки 15 дней» и т.д. Ну или что-то вроде: «56 дней без ининцидентов».
Реализация
Теперь о том, что нужно сделать, чтобы всё это заработало. Так как на плате помимо STM32L053C8 и дисплея, есть ещё два других МК, нужно её доработать, чтобы не тратить впустую энергию батарейки.
2. Монтируем на плату кварц X2 (32.768 кГц), конденсаторы C47 и С50 (~10 пФ), резисторы R70 и R71 замыкаем каплями припоя. Также желательно выпаять резисторы-перемычки SB18, SB19 (их можно впаять на место R70 и R71).
3. Перерезаем дорожку на плате возле транзистора T6, добавляем резистор на 100 кОм, держатель для батарейки CR2032:
Должно получится вот так:
4. Замыкаем перемычки SB2, SB3:
5. Снимаем джампер с разъёма JP4:
Вот и всё!
Перемычку SB13 нужно выпаять, чтобы отключить сигнал сброса T_NRST, который генерирует ST-Link. Без этого сигнала можно обойтись, STM32L053C8 будет прошиваться и без него (разве что придется нажимать на кнопку сброса, если он будет в спящем режиме).
Резистор R50 нужно убрать, так как через него токоизмерительный МК паразитно питается от шины VDD, на которую мы подадим напряжение батарейки.
Для работы RTC необходим источник тактовой частоты. Внешний «часовой» кварц на 32.768 кГц, на плате отсутствует (но под него предусмотрено место) и чтобы избежать лишних переделок, я сначала попробовал использовать встроенный в МК RC генератор. Точность такого решения оказалась абсолютно неприемлемой (часы убегали на полчаса в день), поэтому нужно впаять кварц X2, два конденсатора C47 и С50 (~10 пФ 0603) для него и подключить его к МК. Подключать кварц предполагается запаяв два резистора R70 и R71, я же обошёлся просто каплями припоя. Также желательно выпаять перемычки SB18 и SB19 (их можно впаять на место R70 и R71), чтобы сигнальные дорожки кварца не выходили на разъёмы платы.
Ещё нужно перерезать одну дорожку (не люблю резать дорожки, но здесь это меньшее из зол). Дело в том, что STM32L053C8 через транзистор T6 управляет питанием дисплея и эту возможность необходимо сохранить, так как если запитать дисплей напрямую от батарейки и не выключать его на периоды бездействия, будет лишнее потребление. Транзистор T6 подаёт питание на дисплей с шины 3V3, которая подключена к токоизмерительному МК и его обвязке. Так как мы не хотим тратить на него энергию, мы вообще не будем питать шину 3V3 и подключим плюс батарейки на шину VDD. Значит и на исток транзистора T6 нужно подать шину VDD, а 3V3 убрать. Вот почему нужно отрезать эту линию от него и подать в эту точку напряжение батарейки.
Ещё придётся выпаять резистор R44. Его можно было бы и оставить, но тогда пришлось бы заниматься фигурным вырезанием меди, поэтому его проще выпаять и заменить выводным номиналом в 100 кОм. Этот резистор подтягивает затвор транзистора к питанию для предотвращения случайного открытия.
Батарейка припаивается плюсом к шине VDD, а минусом её нужно подключить к GND. Шина VDD это фактически пины питания STM32L053C8, так что напряжение от батарейки пойдет на него напрямую, без стабилизаторов напряжения и какой-либо защиты от переполюсовки. Нужно обязательно соблюдать полярность и подавать не больше 3.3 вольт (максимально допустимо 3.6).
И последняя доработка: замыкание перемычек SB2, SB3. Для установки времени и даты используется последовательный порт МК (USART1) подключенный к UART-USB преобразователю, реализованному на ST-LINK v2.1. Это подключение и осуществляется замыканием перемычек SB2, SB3.
После вышеописанных манипуляций, ток потребления платы в периода покоя (МК в режиме Standby with RTC), стал равен 0.7 мкА, что крайне немного и батарейки должно хватать надолго (годы). При этом сохраняется возможность использования встроенного ST-Link для прошивки STM32L053C8. Прошивать можно не отключая батарейку, главное чтобы джампер JP4 отсутствовал. Если же хочется работать с платой без батарейки, то нужно отсоединив батарейку, вернуть на место джампер JP4 (положение OFF), чтобы STM32L053C8 питался от платы. Но если подключена батарейка и одет джампер JP4, плату нельзя подключать к USB, потому что тогда напряжение с платы пойдет в батарейку!
Программа
Программа написана в EmBlocks 2.30 (компилятор ARM-GCC) и базируется на примерах работы с периферией из пакета STM32Cube_FW_L0_V1.1.0. Вообще хотелось использовать CoIDE, но он ещё не поддерживает этот МК.
Несколько слов про алгоритм работы программы и то как пользоваться устройством. После сброса, проверяется установлены ли дата и время. Если нет, то на экране появляется приглашение установить часы, используя терминал:
Для этого нужно подключить плату к компьютеру, используя USB разъём (центральный). В терминале задать скорость/чётность: 9600, 8n1, открыть соединение, и нажать на плате кнопку Reset. В терминале должно появится приглашение для установки даты и времени. Также нужно задать количество дней для обратного отсчета. После успешного конфигурирования на экране отображается 2 счётчика: увеличения и уменьшения количества дней. Затем микроконтроллер переходит в режим Standby (самый энергоэффективный). Пробудить его может наступление нового дня (в полночь), нажатие кнопки Reset или кнопки User. При наступлении нового дня, на экране обнавляются оба счётчика. Для сброса увеличивающегося счётчика нужно нажать кнопку User (категорически запрещено делать это в полночь!). Для просмотра текущей времени и даты нужно нажать кнопку сброс. Если нужно изменить время и дату (например для подстройки часов) или задать новое значение счётчика обратного отсчета, то это можно сделать, если после нажатия кнопки Reset, в течении 10 секунд, установить соединение по терминалу (нажать Enter). На экране при этом будет:
Исходники и готовый hex файл доступны на github.
Возможные усовершенствования:
- поддержка кириллицы, чтобы можно было на самом экране описать событие, например: «До нового года осталось 365 дней»;
- отказаться от конфигурирования через терминал в пользу эмуляции съёмного диска. Тогда для настройки нужно будет отредактировать текстовый файл в котором задавать дату/время, новое значение счётчика и отображаемую фразу.
Автор: stml