В данной статье рассматриваются способы вывода текста на дисплей ST7735 с помощью микроконтроллера STM32F103C8. В качестве шрифтов используются два шрифта с кириллицей 8х8 и 8х16, а также шрифт Cybercafe 8х16 без кириллицы.
Статья является продолжением предыдущей "Работа с SPI дисплеями Nokia_5110 и ST7735", где я рассматривал подключение дисплея к микроконтроллеру, его инициализацию, и затрагивал вопрос о максимально быстрой работе с дисплеем по SPI интерфейсу. В этот раз рассматривается вывод текста на дисплей ST7735, сжатие шрифтов, а так же отрисовка простых графических примитивов.
Содержание:
Шрифт Terminus (добавлено 22 мая 2023г.)
Конвертация векторных шрифтов
Дизайнерские шрифты (добавлено 16 июня 2023г.)
Все примеры и готовые прошивки можно скачать с портала GitLab
В продолжение темы работы с дисплеями, в данной статье рассматривается работа с монохромными дисплеями от телефона Nokia 1202 и OLED дисплеем SSD1306. Первый дисплей продавался на али пару лет назад, и сейчас снят с продажи. Тем не менее, на его примере рассмотрим использование USART интерфейса в качестве 9-битного SPI, а так же коснемся вопроса конвертации шрифтов (пока растровых) для использования в своих проектах. В исходниках можно будет найти полные кодовые наборы в 256 символов конвертированных растрового шрифта 8х8 (кириллица) и 8х16 (латиница).
Про OLED дисплей SSD1306 достаточно сложно написать что-либо новое, по нему есть куча материалов в сети. Но мне показалось, что это не повод, что бы не упоминать его вообще.
Все примеры с скомпилированными прошивками можно скачать с портала GitLab по ссылке: https://gitlab.com/flank1er/stm32_bare_metal
Содержание:
I. SPI дисплей HX1230 (Nokia 1202)
II. OLED дисплей SSD1306 на I2C интерфейсе
Данная статья посвящена ультраэкономичным режимам энергосбережения микроконтроллеров STM8L: "Low Power Run Mode" и "Low Power Wait Mode". Данные режимы характерны тем, что в них отключатся флеш-память, а весь код выполняется из оперативной памяти. Также отключается главный регулятор напряжения MVR, а тактирование осуществлется от низкочастотного генератора на 38 кГц или от часового кварца. За счет этого удается добится кардинального снижения энергопотребления микроконтроллера до 3-5 мкА.
На мой взгляд, данная технология ST привлекательна за счет того, что в отличии от большинства других режимов энергосбережения, микроконтроллер не находится в режиме сна подавляющую часть времени, а продолжает свою работу, пусть и на невысокой частоте, тактируясь от LSE.
В качестве примера для данных режимов энергосбережения я бы хотел рассмотреть создание часов на батарейном питании. Пусть будет две пальчиковые батареи с ресурсом работы в один год. В качестве индикатора будет использоваться шести-разрядный жидко-кристаллический индикатор (ЖКИ) на контроллере HT1621. Данный индикатор недорогой (около 200р), и он свободно продается на али.
На первый взгляд задача может показаться примитивной, но с учетом необходимости работы в режиме пониженного энергопотребления все становится не так просто. Отключая флеш-память, вы остаетесь без прерываний вообще, т.к. в stm8 таблица прерываний не может менять местоположение, она всегда располагается на флеш-памяти. В качестве альтернативы прерываниям существует механизм Event'ов, которого нет в S-линейке микроконтроллеров STM8. Кроме того, требуется рабочий цикл программы вместе с используемыми подпрограммами и функциями размещать в оперативной памяти, размер которой в микроконтроллере STM8L051F3 равен всего одному килобайту. А кроме кода программы, там еще располагаются глобальные переменные и стек. И вот так с ходу написать такой проект мало у кого получится, прежде придется порядочно посидеть над Reference Manual. А в проекте, еще используются недокументированные функции.
Из софта нам понадобится компилятор Cosmic и среда разработки STVD, т.к. у SDCC нет инструментов загрузки кода в оперативную память и компиляции кода без абсолютных адресов, т.е. строго с относительной адресацией.
Полезные материалы:
Содержание:
I. ЖК дисплей на контроллере HT1621
II. Работа с микроконтроллером STM8L151C8 в среде STVD+Cosmic
III. Энергосберегающие режимы "Low Power Run Mode" и "Low Power Wait Mode"
За последнее время у меня скопилось некоторое количество дисплеев, и я хотел бы начать понемногу описывать работу с ними на STM32F1xx. Дисплей это один из основных модулей периферии, и его характеристики зачастую определяют выбор микроконтроллера. В настоящее время, благородя широкому распространению мобильных телефонов, нет проблем с приобретением дисплея с нужными характеристиками, однако производительность микроконтроллера при работе с данным дисплеем становится критичным параметром. Именно вопрос производительности микроконтроллера мне кажется очень важным вопросом, т.к. на производительность влияют не только характеристики самого микроконтроллера, но и качество того кода, который выходит из под рук программиста.
Кроме того, работа с дисплеями довольно обширная тема, которая затрагивает множество смежных вопросов, и это на мой взгляд отличный повод, чтобы эти вопросы разобрать. Поэтому статья не посвящена целиком дисплеям, как можно было бы подумать на первый взгляд, на самом деле она посвящена работе с микроконтроллерами stm32f1хх.
Итак, в этой статье, в качестве целевого микроконтроллера я буду использовать stm32f103c8 в виду его широкой распространенности. Полагаю, что bluepill имеется у всех.
В качестве дисплея я буду использовать т.н. Nokia 5110 дисплей на контроллере PCD8544. И хотя я уже писал очень длинную статью по работе с ним на ATmega8, с тех пор я многое переосмыслил. Главное же конечно то, что дисплей все еще продается на али, он доступный в плане цены, и скорее всего, он уже имеется у всех, кто читает эти строки. Впоследствии, алгоритмы написанные для Nokia 5110 мы будем переносить на другие дисплеи.
И чтобы статья совсем не казалось скучной, в завершении рассмотрим работу c цветным дисплеем на контроллере ST7735 с разрешением 128 на 160 пикселей и диагональю 1.8 дюйма (4.5 сантиметра). Будем пытаться добится от него работы на 90 fps (я серьёзно).
Из дополнительной периферии рассмотрим работу с энкодерам на таймерах STM32. Они часто применяются для управления различными меню на дисплеях, так что уметь с ними работать также важно как и с самими дисплеями.
Содержание:
I. Часть первая, вводная
II. Часть вторая, дисплей Nokia 5110
III. Часть третья, дисплей ST7735
Бонус. IPS дисплеи ST7789 320х240 и 240х240 (добавленно позже)
Все примеры с скомпилированными прошивками можно скачать с портала GitLab по ссылке: https://gitlab.com/flank1er/stm32_bare_metal
Недавно у меня сгорел мой единственный ST-Link v2 с оригинальным STM32, который верой и правдой прослужил мне семь лет. Выкидывать его у меня не поднялась рука, и я что называется "приобрел практический опыт" восстанавливая его работу. Данная проблема заставила меня провести личное исследование о доступных альтернативах отладчику ST-Link V2, и результаты этого мини исследования легли в основу данной статьи.
Вторым мотивом которым я руководствовался, была ситуация сложившаяся на рынке микроконтроллеров. Полагаю, что все уже понимают, что микроконтроллеры STM32 скорее всего уже не будут доступны никогда, и нужно искать альтернативы. В виду этого теряется ценность брендированных отладчиков таких как ST-LinkV2, которые могут работать только с микроконтроллерами STM, и соответственно вопрос опять упирается в поиск альтернатив.
В своих проблемах и поисках я не был одинок, поэтому ниже привожу список материалов, на которые я опирался.
Содержание:
Для работы я использовал Slackware Linux и виртуальную машину с Windows. Если вы пользуетесь Windows, то вам соответствено понадобится виртуальная машина с Linux.
Спустя долгое время, я решил узнать как обстоят дела с поддержкой STM8 в SDCC. Последней версией SDCC которой я пользовался был 3.6. За это время OpenOCD официально обзавелся поддержкой STM8. И т.к. в Linux я пользуюсь преимущественно IDE QtCreator, был соблазн перетащить туда проекты на STM8. Главная сложность возникла с системой управления сборки. QtCreator умеет работать только с qmake, qbs и cmake проектами. Qmake не поддерживает sdcc никоим образом. У CMake поддержка заявлена, но она чисто декларативная. Таким образом нам остается только Qbs.
Ранее для STM8 я пользовался STVD+Cosmic, но это требовало работы из виртуальной машины. STVD - отличная среда разработки, но в визуальном плане она устарела уже давно. Отсутствие темной темы и линтера конечно не принципиально, но без этого уже не комфортно работать. Кроме того Cosmic для проверки лицензии постоянно стучится в интернет. Я же предпочитаю отключать интернет в виртуалке.
Ок, но какие сложности нас ожидают?
Итак, софт который нам понадобится для программирования микроконтроллеров STM8:
Из аппаратного обеспечения нам достаточно будет платы c чипом STM8S103F3 и ST-Link V2 с поддержкой SWIM протокола.
Руководств и мануалов по использованию Qbs в baremetal-проектах почти нет. Есть несколько примеров для STM32, но так как там используется GCC, скрипт проекта будет отличаться от такового для SDCC.
Прежде чем начать что-то делать, настоятельно рекомендуется пройти по последним трем ссылкам, и изучить их содержимое.
Содержание:
I. Консольный Qbs проект для STM8+SDCC
II. Работа с проектом в Qt Creator
III. Бонус
IV. Добавленно позже
Внимание! Статья была отредактирована в ноябре 2023 года (последнее изменение 28 июля 2024г). Были исправленны битые ссылки, логи и скриншоты STM32CubeProgrammer были приведены к версии 2.15. Кроме этого, был добавлен новый раздел "BlackPill в 2023 году, альтернативные платы WeAct", где рассмотренна современная ситуация с прошивками микропитона для BlackPill. Также был добавлен легкий экскурс по программированию на микропитоне на примере написания драйвера дисплея SSD1306 с I2C интерфейсом. Кроме этого было затронуто асинхронное программирование на микропитоне. Также был добавлен обзор альтернативных плат WeAct в форм-факторе Blackpill на чипах: AT32F403ACGU7, RP2040 и STM32WB55. Старую версию статьи можно найти по следующему адресу: "перейти по ссылке".
Изначально статья была посвящена плате Blackpill на чипе STM32F411, и немного была затронута тема микропитона. Немного, потому-что это казалось скорее игрушкой для студентов и не более того. За последние три года произошли какие-то тектонические сдвиги в микроэлектронике, и ситуация поменялась.
Таким образом, я вижу с одной стороны дрифт в сторону от продукции ST, а с другой - микроконтроллеров в сторону SoC. Микропитон же похоже пытается стать Java для микроконтроллеров. Так или иначе байткод-интерпретатор там уже имеется.
Еще один аспект - микропитон выполняет роль интерактивной операционной системы для микроконтроллеров. Там есть дисковая система, командная строка и возможность запускать скрипты с диска. Т.о. микропитон позволяет работать с периферией и аппаратными интерфесами в диалоговом режиме.
Хочу заметить, что вопрос прошивки модулей ESP8266/ESP32 микропитоном рассматривалась в статье про EPS8266: "Установка прошивки MicroPython".
Полезная документация по теме статьи:
Содержание:
I. Обзор платы BlackPill на чипе STM32F411CE
II. Основы работы c MicroPython
III. BlackPill в 2023 году, альтернативные платы WeAct
IV. Микропитон в 2024 году
В статье пошагово описывается процесс написания драйвера для FM-приемника RDA5807m, где в качестве микроконтроллера используется STM8S103F3, а в качестве языка программирования - ассемблер со средой программирования STVD.
Структурно статью можно разделить три части. С одной стороны это статья об ассемблере STM8, в частности здесь имеются замечания об использовании косвенной адресации и использования указателя стека в качестве индексного регистра. Собственно, вся статья построена на ассемблерном коде STM8. С другой стороны, рассматривается периферия STM8, в частности в статье описывается создание UART приёмо-передатчика для микроконтроллера STM8. Это может быть использовано для управления коммуникационными модулями с UART интерфейсом, навроде: esp8266, esp32, rda5981 и пр. С третьей стороны, в статье главной темой является RDA5807m. Здесь ему, правда, уделяется всего одна глава, т.к. сам по себе чип несложный.
Совершенно другое дело - система передачи данных RDS (Radio Data System). Я смог добиться лишь декодирования RDS - текста. Это восемь символов латиницей, через которые передается название станции. К сожалению, я не смог найти станцию которая бы передавала текущее время, но я все-равно планирую рассказать об этой возможности во второй статье (устарело, сейчас чтение RDS уже реализовано).
Данная статья является первой частью, в ней рассматривается лишь минимальный драйвер RDA5807m, который годится лишь для проверки модуля. Полноценный драйвер я планирую описать во второй статье, кроме того, там должно быть много материала по RDS. Это будут выдержки из стандарта: "EN50067. Specification of the radio data system (RDS) for VHF/FM sound broadcasting in the frequency range from 87,5 to 108,0 MHz. April 1998. с описанием формата, а также логи принятых данных.
Кого-то может смутить использование ассемблера в наше время. Лично я считаю развитие темы интернета вещей и различных SoC постепенно вытеснит низкоуровневое программирование в принципе, поэтому данная статья - это реверанс в сторону хардкорного программирования.
Полезные материалы по теме статьи:
Содержание:
I. Реализация командного интерфейса посредством UART
II. Минимальный драйвер RDA5807m
III. Драйвер с переключением диапазонов и интервалов частот
IV. Прием RDS данных (добавлено 25 июня 2020г.)
V. Подключение энкодера и дисплея к драйверу
Посмотреть исходники, или скачать скомпилированные прошивки можно с портала GitLab по следующей ссылке: https://gitlab.com/flank1er/stm8_rda5807m.
Данную статью по содержанию можно разделить на две или три части. С одной стороны я хотел рассказать в ней о конфигурации ряда IDE основанных на кодовой базе Eclipse, т.к. когда я впервые настраивал подключение отладчика к Eclipse и SW4STM32, мне не показался этот процесс простым и "интуитивно понятным".
Вторая часть статьи в каком-то роде продолжает прошлогоднюю статью по STM32, Т.к. в качестве демонстрационного примера берётся проект из той статьи. Однако, одним заимствованием ограничиться не получилось, и для развития идеи, я описал недостатки данного проекта, и предложил более совершенный вариант Makefile'а.
Получившийся Makefile дал возможность перенести проект на систему сборки CMake. Это в свою очередь дало возможность продемонстрировать использование Qt Creator для программирования и отладки микроконтроллеров STM32.
В техническом плане, проект используемый в качестве примера, очень простой. Это обычный Blink, состоящий из Си-кода и ассемблере ARM. Из ресурсов микроконтроллера используется лишь порт ввода-вывода GPIO_C и системный таймер SysTick. В проекте не затрагиваются DMA, USB, FSMC и прочие интерфейсы. Также в стороне осталась библиотека newlib, поддержка языка программирования C++, и работа с проектами STM32CubeMX. Т.е. несмотря на доработку проекта в статье, он все ещё годится лишь для несложных задач, и более соответствует уровню микроконтроллеров с архитектурой Cortex-M0/M0+.
Используемые в статье Hardware и Software. В качестве операционной системы использовалась Slackware GNU/Linux (русские физики рекомендуют), в качестве целевого микроконтроллера - STM32F103C8T6 (Blue Pill). В качестве программатора и отладчика использовался китайский клон: "ST-Link v2", а также JTAG отладчик на чипе FT232H. Из софта, в качестве gdb сервера в статье используется: "OpenOCD", а в качестве флешера: "st-flash". Используемый туллчейн arm-none-eabi-gcc имеет версию - 8.3.1, релиз от 20190703. Версия CMake - 3.15.5. Qt Creator используемый при написании статьи был версий 4.9.2 и 4.10.2.
Должен предупредить, что свой ST-Linkv2 я покупал достаточно давно, и он на чипе STM32. Сейчас на али продаются программаторы ST-Linkv2 на чипе CKS32F103C8T6, и с ними могут быть нюансы.
Полезные материалы по теме статьи:
Содержание:
I. Отладка в Eclipse, SW4STM32 и STM32CubeIDE:
II. "Допиливание" Makefile и создание на его основе CMake проекта:
III. Использование Qt Creator для программирования и отладки микроконтроллеров STM32:
В данной статье я хочу рассмотреть наиболее простые примеры для работы с сетью средствами SDK. При работе с сетью, SDK использует неблокирующее программирование. В связи с этим, программирование сводиться к написанию коллбек-функций, которые будут вызываться из SDK при наступлении того или иного события. Это затрудняет чтение и разбор алгоритма программы, поэтому в статье я всега стараюсь говорить, что за чем следует.
Статья по структуре будет напоминать предыдущую: "ESP8266: подключение, прошивка и работа с AT-командами", за тем исключением, что в этот раз все будет делаться с помощью программирования через ESP8266-NONOS-SDK.
Конфигурация WiFi сети будет, опять же, состоять из двух компонентов: а) точки доступа на роутере с прошивкой OpenWRT; б) и собственно ESP8266 выступающего в роли клиента. На стороне роутера запущен web-сервер для обслуживания ESP8266. Для передачи и получения данных от роутера, ESP8266 будет использовать GET - запросы.
В качестве "транспорта" для работы с TCP/IP я буду использовать штатный интерфейс espconn, который описан в ESP8266 Non-OS SDK API Reference.
Для захвата и анализа трафика между ESP8266 и точкой доступа на OpenWRT, я буду использовать программы tcpdump и Wireshark. Все примеры статьи используют SDK версии 2.1.0.
Содержание:
Посмотреть исходники, сборочные файлы, скачать скомпилированные прошивки, можно с портала GITLAB https://gitlab.com/flank1er/esp8266_sdk_examples