STM8S105 + COSMIC: Запись в EEPROM и FLASH память микроконтроллера

разделы: STM8, дата: 21 сентября 2018г.

Когда я писал драйвер FM-модуля RDA5807, то у меня возникла необходимость сохранять куда-то найденные станции, чтобы на них можно было переключиться минуя поиск. Но когда я полез в документацию STM8, чтобы поискать, как это можно было бы осуществить, то понял, что EEPROM и FLASH в STM8 - это отдельная подсистема микроконтроллера, и изучать ее надо всю.

Один из режимов записи в EEPROM/FLASH требует выполнения из ОЗУ. Вопрос копирования кода в ОЗУ и выполнения его оттуда я затрагивал в предыдущей статье, однако там вся реализация была на ассемблере. Сейчас же мне захотелось показать как это делается в Си.

В качестве компилятора я выбрал COSMIC, по которому уже как-то писал быстрый старт. Но тогда я писал об использованию COSMIC совместно с SPL библиотекой. На этот раз мне хочется раскрыть тему программирования в COSMIC, используя "чистый" Си в связке с ассемблером. Правда должен оговориться, что несколько отредактированные загловочные файлы из SPL в этой статье я все-таки использовать буду, т.к. нужны будут именновые константы масок периферийных регистров.

В итоге статья получилось составленной из двух взаимосвязанных тем: сначала рассматривается вопрос использования компилятора COSMIC, а затем, как с его помощью сохранять данные в EEPROM/FLASH памяти микроконтроллера.

В качестве Develop Board я буду использовать собственную плату с чипом STM8S105C4T6. Это Medium-Density чип с 16 КБ флеш-памяти, 2 КБ ОЗУ и 1 КБ ЭСППЗУ(EEPROM). Он более интересен чем STM8S103-й чип, т.к. в 105-ом имеется встроенный загрузчик(bootloader), механизм read-while-write (RWW), а размер блока составляет 128 байт вместо 64 байт на 103-м чипе. Вы в свою очередь можете использовать фирменную отладочную плату STM8S-DISCOVERY с чипом STM8S105C6T6. Там флеш-памяти будет побольше - 32 КБ. На худой конец, можно воспользоваться ещё одной китайской платой на 105-м чипе. Также как в STM8S-DISCOVERY в ней установлен кварц на 8 МГц. Сама плата выполнена в форм-факторе удобном для установки в беспаячную макету.

Cosmic у меня работает в связке с STVD, обе программы установлены на виртуалку, которая в свою очередь установлена в Linux. Гостевой ОС в виртуалке служит Windows XP SP3. О превратностях установки Cosmic я уже писал в вышеупомянутой статье два года назад. К сожалению, я тогда я не упомянул, что получить регистрационный ключ можно онлайн. Т.е. не надо ждать несколько дней чтобы ключ скинули на e-mail, как было в моем случае. Если не ошибаюсь, ключ действует один год, и по истечении регистрационного периода, его нужно получать заново. Кроме того, ключ "слетает" при копировании виртуальной машины. В этом случае его также следует получать по новой. В последнем случае я просто удалял Cosmic и затем ставил его заново, получая свежий ключ. Сейчас у меня следующая версия компилятора:

COSMIC Software STM8 C Cross Compiler (Special Edition) V4.4.7

Так же как и в предыдущей статье, для контроля кода прошивки я буду использовать дизассемблер из комплекта утилит stm8-binutils.

    Список используемой документации:
  1. Cosmic CXST7 - User Manual - документация по компилятору COSMIC
  2. Reference Manual STM8S - RM0016, глава 4 "Flash program memory and data EEPROM"
  3. Programming Manual PM0051 - руководство по записи в EEPROM и FLASH память для микроконтроллеров STM8S/STM8A
  4. Application note - AN2659, - глава пятая - "Configuring the Cosmic compiler for RAM code execution".
  5. Работа с EEPROM и Flash / STM8 / Сообщество EasyElectronics.ru хорошая вводная статья по теме на русском языке. Написано по существу, без лишней воды.

Содержание статьи:

    I. Основы работы со связкой COSMIC + STVD
  1. Создание базового проекта в среде разработки STVD+COSMIC
  2. Добавление ассемблерного файла к проекту
  3. Добавление ассемблерных обработчиков прерываний
  4. Маппинг на физические адреса
    II. Основы работы с EEPROM/FLASH подсистемой в микроконтроллерах STM8
  1. Особенности EEPROM/FLASH подсистемы в микроконтроллерах STM8
  2. Регистры подсистемы EEPROM/FLASH
  3. Запись в EEPROM средствами COSMIC
  4. Безопасное снятие защиты MASS, однобайтный режим записи в EEPROM/FLASH
  5. Четырехбайтный режим записи в EEPROM/FLASH
  6. Блоковый режим записи в EEPROM/FLASH. Копирование кода в ОЗУ и выполнение его оттуда средствами COSMIC

Скачать исходники, workspace с проектами и скомпилированными прошивками к статье можно будет по ссылке в конце статьи.

Читать дальше

STM8 + STVD + ASSEMBLER: Быстрый старт

разделы: STM8, АССЕМБЛЕР, дата: 22 августа 2018г.

Вновь возвращаюсь к фирменной среде разработки - ST Visual Develop, для чего есть две причины. Во-первых, оказалось, что писать на ассемблере сколь-либо сложные прошивки без отладчика невозможно, у меня по крайней мере не получилось, т.к. программа все-равно так или иначе отлаживается с помощью светодиода или по UART, через отладочный интерфейс это просто делается быстрее. Во-вторых, мне показалось, что изучать архитектуру только лишь руководствуясь datasheet'ом не совсем правильно. Что-то может быть неправильно понято, что-то может быть упущено. С такими штуками как DMA, встроенный RTC или выполнение кода из ОЗУ, будет проще разобраться с помощью отладчика, не забывая при этом посматривать в datasheet.

STVD - довольно простая среда разработки, я ее освоил за вечер. В этой статье я хочу рассказать, как "с нуля" начать писать и отлаживать прошивки на ассемблере STM8, используя ST Visual Develop.

STVD - работает в ОС семейства Windows, начиная с XP и выше. При этом она прекрасно работает из-под виртуальной машины в Linux. В этой статье я использую STVD 4.3.12, последнюю доступную версию на этот момент, и Windows XP SP3 в качестве гостевой ОС. В качестве микроконтроллера я буду использовать 20-пиновый STM8S103F3P6.

В качестве дизассемблера я буду использовать комплект утилит stm8-binutils. Бинарные файлы этого комплекта для Windows скомпилированы для работы в CYGWIN, т.е. они понимают unix'овский формат пути файла с прямым слешем в качестве разделителя. CYGWIN для Windows 7 и выше ставится без проблем следуя инструкциям на сайте https://cygwin.com/install.html, что касается Windows XP, инструкция которая имеется на оф. сайте устарела, и более неработоспособна. Ссылка с инстркуций по которой ставил я, - сдохла за время написания статьи. В качестве альтернативной ссылки могу указать - windows xp - Is it still possible to get Cygwin for XP? - Super User. Сколько проживет эта ссылка, не берусь сказать.

В качестве альтернативы связке binutils+cygwin, можно использовать naken_util из комплекта naken_asm.

Содержание статьи:

I. Создание минимального проекта Blink

  1. Открытие шаблонного проекта на ассемблере
  2. Добавление в проект файла с таблицей векторов и обработчиками прерываний
  3. Добавление в проект констант с адресами периферии
  4. Добавление в проект файла с подпрограммой

II. Язык ассемблера STVD

  1. Основные сведения об ассемблере STVD
  2. Формат числовых констант
  3. Формат метки
  4. Сегментация
  5. Основные директивы ассемблера

III. Процесс отладки

  1. Копирование кода в ОЗУ и выполнение его оттуда
  2. Интерфейс отладки STVD
  3. Процесс отладки в STVD

IV. Макроассемблер

  1. Введение в макроассемблер STVD
  2. Макрос задержки delay_ms
  3. Макрос условного оператора сравнения регистра с числом
  4. Задержка длительностью 1 мкс на инструкции условного перехода

Читать дальше

Проектирование и изготовление своей STM8 Develop Board

разделы: STM8, дата: 22 июля 2018г.

Пару лет назад я публиковал "героический эпос" о пайке STM8L-чипов в адаптеры TSSOP/QFN48 - DIP. Насколько помню, тогда это был мой первый опыт пайки SMD компонентов. Сейчас конечно та статья кажется наивной, за пару прошедших лет много чего изменилось. Вошли в обиход сервисы изготовления печатных плат и сейчас каждый может заказать десяток плат заводского качества по весьма умеренным ценам. Можно открыть Service Manual какого либо устройства и заказать набор плат для его изготовления. Звучит как фантастика, и я не смог удержаться, чтобы не сделать свою STM8 Develop Board. Благо за два года ковыряния различных отладочных плат, идей у меня накопилось достаточно. Загвоздка была только в том, я никогда этим не занимался.

Т.к. за один заказ можно было разместить только один дизайн платы, моя задача была одним выстрелом убить три зайца, т.е. реализовать в одном проекте решение следующих задач:

Во-первых, я хотел попрактиковаться в пайке SMD компонентов, т.к. я не так часто этим занимаюсь. Поэтому в качестве микроконтроллера я выбрал 48-пиновый чип с расстоянием между ножками 0.5 мм. Чипы в 44-пиновом корпусе имеют практически тот же функционал, но при этом у них расстояние между ножками 0.8 мм. Пайка таких чипов В РАЗЫ легче. Также я хотел попробовать свои силы в пайке микросхем в безвыводном корпусе и поэтому добавил опциональный USB-UART преобразователь CP2102. Есть разные мнения о сложности пайки чипов в таком корпусе, кто-то умудряется даже паять их без фена, но я бы не советовал.

Во-вторых, я хотел сделать универсальный дизайн печатной платы пригодный как для отладочных, так и для плат конкретных устройств.

Ну и в третьих, я хотел поработать с чипами 200-й серии, которые являются самыми производительными среди 8-битных микроконтроллеров STM.

Вроде желаний немного, а во что все это вылилось, я расскажу далее.

    Содержание:
  1. Предыстория
  2. Общий концепт платы
  3. Распиновка платы
  4. Ошибки
  5. Пайка CP2102
  6. Особенности работы STM8S207 на частоте 24MHz
  7. USB-UART адаптер CP2102
  8. Установка Customized драйверов CP2102 в Windows
  9. Работа с CP2102 через Xpress Сonfigurator в Simplicity Studio 4

Читать дальше

STM8S + SDCC: Программирование БЕЗ SPL. Интерфейсы: UART в режиме передатчика, АЦП в режиме однократного замера, I2C в режиме мастера

разделы: STM8, UART, I2C, дата: 5 мая 2018г.

В этот раз разговор пойдёт про аппаратные интерфейсы STM8S: UART, АЦП и I2C. Каждый их этих интерфейсов поддерживает несколько режимов работы, но сейчас мне хотелось бы сфокусироваться на наиболее типовых, на мой взгляд, примерах их использования: а)организация передатчика на UART, б) режим однократного замера АЦП, в) использование I2C в режиме мастера. Напомню, что вариант использования SPI в режиме мастера я приводил на примере драйвера для 4-x разрядного семисегментного индикатора .

Документация которая понадобится для прочтения статьи: Reference Manual STM8S - RM0016, главы: 22 (UART), 24 (АЦП), 21 (I2C). В качестве целевого микроконтроллера я буду использовать 20-пиновый STM8S103F3P6.

Так же как и в прошлый раз, упор будет делаться на "чистом" программировании на Си и Ассемблере без использования сторонних библиотек. В качестве компилятора используется open-source SDCC версии 3.7. Справедливости ради замечу, что я ввёл макросы для прямого доступа к битовым инструкциям, что бы хоть как-то оптимизировать код.

Скачать полные исходники со сборочными файлам и скомпилированными прошивками, можно по ссылке в конце статьи.

В статье используются формулы в формате MathML который поддерживается браузером Firefox, для браузеров Chrome и Opera потребуется установить одноимённое расширение MathML.

    Содержание:
  1. UART1 передатчик со скоростью 921600 baud;
  2. АЦП в режиме однократного замера;
  3. I2C в режиме мастера, на примере RTC DS1307/DS3231. Инициализация.
  4. I2C в режиме мастера, на примере RTC DS1307/DS3231. Функция передачи адреса и данных.
  5. I2C в режиме мастера, на примере RTC DS1307/DS3231. Функция чтения данных.

Читать дальше

STM8S + SDCC: Программирование БЕЗ SPL. Cистема автопробуждения AWU, модуль генерации звуковой частоты BEEP, cторожевые оконный и независимый таймеры

разделы: STM8, дата: 22 апреля 2018г.

Статья рассматривает вспомогательные таймеры и систему низкочастотного тактирования в микроконтроллерах STM8S. Упор делается на "чистом" программировании на Си и Ассемблере без использования сторонних библиотек.

Несмотря на то, что рассматриваются вспомогательные модули, на мой взгляд тема довольно сложная, в первую очередь из-за огромного количества "подводных камней".

Документация которая понадобится для прочтения статьи: Reference Manual STM8S - RM0016, главы: 12 (AWU), 13 (BEEP), 14 (Independet Watchdog), 15 (Window Watchdog). В качестве целевого микроконтроллера я буду использовать 20-пиновый STM8S103F3P6.

В статье используются формулы в формате MathML который поддерживается браузером Firefox, для браузеров Chrome и Opera потребуется установить одноименное расширение MathML.

Скачать полные исходники со сборочными файлам и скомпилированными прошивками, можно по ссылке в конце статьи.

    Содержание:
  1. Режимы энергосбережения;
  2. Описание системы автопробуждения;
  3. Blink на таймере AWU;
  4. Измерение частоты LSI с помощью захвата по таймеру TIM1;
  5. Тактирование AWU от внешнего кварца или генератора HSE;
  6. Генератор для пьезодинамика;
  7. Независимый сторожевой таймер Watchdog;
  8. Оконный сторожевой таймер;

Читать дальше

STM8S + SDCC: Программирование БЕЗ SPL, система тактирования

разделы: STM8, дата: 11 апреля 2018г.

Систему тактирования я уже бегло рассматривал в случае использования SPL. Стандартная периферийная библиотека, на мой взгляд, предлагается фирмой STM в качестве инструмента для быстрого освоения семейства микроконтроллеров STM8, программистами ранее не работавшими с ними. Сейчас я считаю, что она совершенно лишняя. Хотя, в примерах я использую именованные константы взятые из заголовочных файлов SPL.

Документация которая понадобится для прочтения статьи: Reference Manual STM8S - RM0016, глава 9. В качестве целевого микроконтроллера я буду использовать 20-пиновый STM8S103F3P6.

    Содержание:
  1. Система тактирования STM8S, ключевые особенности;
  2. Подключение и отключение периферии к шинам тактирования. Регистры CLK_ICKR, CLK_PCKENR1 и CLK_PCKENR2;
  3. Внутренний высокочастотный генератор HSI. Регистр CLK_CKDIVR;
  4. Подключение внешнего кварца к HSE генератору тактовой частоты. Регистры CLK_ECKR, CLK_CMSR, CLK_SWR и CLK_SWCR;
  5. Модуль безопасности системы тактирования CSS. Регистр CLK_CSSR;
  6. Тактирование микроконтроллера от низкочастотного внутреннего генератора LSI;
  7. Тактирование микроконтроллера от внешнего часового генератора DS3231;

Скачать полные исходники со сборочными файлам и скомпилированными прошивками, можно по ссылке в конце статьи.

Читать дальше

STM8S + SDCC: Программирование на связке языков Си и ассемблер

разделы: STM8, АССЕМБЛЕР, дата: 13 марта 2018г.

В данной статье я попытался рассмотреть вопрос использования ассемблера в Си-программах для компилятора SDCC. Данный компилятор часто подвергается критике по качеству кода, однако он является единственным Open Source компилятором для архитектуры STM8, и единственным компилятором доступным в Linux. Поэтому данная статья может рассматриваться как HowTo по выжимании максимума возможного из SDCC.

Когда я пытался в прошлый раз (почти два года назад) подружиться с SDCC у меня оказалось большое количество вопросов к нему, что вылилось в метания между SDCC, IAR и Cosmic. Была даже идея отказаться от STM8 в пользу Cortex-M0. Однако теперь для Linux появился отладочный интерфейс, что побудило меня еще раз взглянуть на SDCC и попытаться найти к нему подход.

Статья построена аналогично предыдущей: ATtiny13a: использование ассемблера GNU-AS в программах на Си с той разницей, что вместо ATtiny13a будет использоваться 20-пиновый STM8S103F3P6, а вместо GCC - SDCC.

В качестве операционки при написании использовался Slackware GNU/Linux (русские физики рекомендуют), но теоретически, все должно работать и в Windows при условии использования CYGWIN.

По ходу изложения, я буду сравнивать систему команд STM8 и AVR. Я делаю это не для того что "уронить" AVR, а потому что считаю эту архитектуру хорошо сбалансированной, удобной в использовании и легкой в освоении. STM8 это более современная архитектура, и по определению обязана быть более лучшей. Однако AVR удобно рассматривать в качестве какой-то базовой системы, этакой точкой отсчета.

    Содержание:
  1. Создание Си - проекта Blink для SDCC.
  2. Создание проекта Blink на ассемблере SDCC.
  3. Добавление ассемблерной функции в Си-программу.
  4. Передача параметров из Си в ассемблерную функцию.
  5. Задержка по таймеру TIM4, с обработчиком прерывания на ассемблере.
  6. Счетчик на 4-x разрядном семисегментном индикаторе.
  7. Переписывание драйвера индикатора на ассемблере STM8.
  8. Использование аппаратного SPI-интерфейса в режиме мастера.
  9. Счетчик импульсов, вариант на Си.
  10. Счетчик импульсов, вариант на ассемблере.

Полные исходники, сборочные файлы и скомпилированные прошивки можно будет скачать по ссылке в конце статьи.

Читать дальше

3-х уровневый конвейер STM8: перевод глав 3, 4, 5 руководства по программированию микроконтроллеров STM8 (PM0044)

разделы: STM8, АССЕМБЛЕР, дата: 4 марта 2018г.

Вначале я хотел посвятить архитектуре STM8 краткую вводную главу, но когда начал вчитываться в документацию, то понял, что переводить надо все. Потому что лучше, чем написано в документации, я не скажу. Посвятить целую статью теории - это несколько выходит за формат моего сайта. Но все, что там изложено, стоит того, чтобы это прочесть.

Наибольшие вопросы в STM8 у меня вызывал 3-уровневый конвейер, поэтому в основу перевода легла глава, рассмативающая работу этого конвейера.

Если сравнивать систему команд STM8 с ассемблером AVR, то здесь имеется большое количество 16-битных команд, целочисленное умножение и деление, условные переходы объединены с проверками, не надо вечно перепрыгивать через команду. Имеются полноценные битовые команды, которые выполняются за один цикл. В целом, мне показалась, что писать на ассемблере STM8 можно также легко как на Си.

    Содержание::
  1. Описание ядра STM8
    1. Введение
    2. Регистры ЦПУ
  2. Интерфейс памяти STM8
    1. Программное пространство
    2. Пространство данных
    3. Архитектура интерфейса памяти
  3. Принципы работы конвейера
    1. Описание уровней конвейера
    2. Этап выборки (fetch)
    3. Декодирование и вычисление адреса
    4. Этап исполнения
    5. Конфликты на шине данных
    6. Примеры работы конвейера
    7. Предварительное соглашение
    8. Пример оптимизированной работы конвейера - выполнение программы из флеш-памяти
    9. Пример оптимизированной работы конвейера - выполнение программы из ОЗУ
    10. Пример работы конвейера с инструкциями перехода JP и CALL
    11. Приостановка конвейера
    12. Работа конвейера с ожиданием в один цикл

Читать дальше

Отладка микроконтроллеров STM8 в Linux, сборка toolchain для STM8

разделы: STM8, дата: 4 октября 2017г.

До недавнего времени отладка микроконтроллеров STM8 в Linux была невозможна, для этого приходилось использовать Windows, сталкиваясь при этом с ограничениями проприетарного ПО. Например, даже в COSMIC STM8, где формально сняли ограничение на размер кода, при копировании виртуальной машины слетает лицензионный ключ, и его приходится запрашивать заново.

Однако популярность микроконтроллеров STM8, как альтернативы STM32 Cortex-M0, продолжает расти, и нашлись таки светлые головы, которые собрали патчсет для сборки тулчейна STM8.

    Для начала, решим что нам нужно для отладки микроконтроллера:
  • Компилятор с возможностью выдавать ELF файл, а не только голый Intel Hex;
  • Собственно сам отладчик GDB;
  • Сервер для отладчика, который будет обеспечивать связь GDB с микроконтроллером.

В качестве компилятора будем использовать пропатченный SDCC, в качестве сервера OpenOCD, а отладчик GDB придется собирать из binutils.

На главной странице проекта излагаются краткие инструкции по сборке тулчейна:

export PREFIX=

To download, patch and configure:

./patch_binutils.sh
./configure_binutils.sh

./patch_sdcc.sh
./configure_sdcc.sh

Until stm8 openocd official binaries are available:

./patch_openocd.sh
./configure_openocd.sh

Когда я в первый раз увидел это, я не очень понял что к чему. Я бы предпочел скачать исходники и собрать их вместо того чтобы что-то патчить, поэтому далее я опишу краткую инструкцию по сборке тулчейна.

Читать дальше

STM8+SPL+COSMIC+STVD: Быстрый старт

разделы: STM8, среда разработки, дата: 6 ноября 2016г.

Как всем известно, с марта этого года компилятор COSMIC for STM8 стал полностью бесплатен и без ограничений на размер генерируемого кода. Он имеет полную поддержку SPL(Standard Peripheral Library) и фирменой среды разработки - STVD(ST Visual develop IDE).

К сожалению, Cosmic работает только под операционными системами Windows, и для активации требует лецензионный ключ который можно прождать несколько дней. С другой стороны, stm8flash в Linux не умеет прошивать STM8L151C8, а с COSMIC через виртуалку вполне можно работать, да из под Wine он тоже запускается.

Ок, для начала нам потребуется скачать SPL и STVD c сайта https://my.st.com, а с сайта http://www.cosmic-software.com/download.php сам компилятор COSMIC. Как скачать SPL я рассматривал год назад в Введение в STM8: программирование и прошивка с помощью клона ST-Link v2, версия для Linux, а связку STVP+STVD весной в STM8 + IAR + ST-LINK2: программирование, прошивка и отладка из под Windows. Однако с тех многие ссылки побились, поэтому предлагаю пройти квест заново. Потому что поиск чего-то на st.com, действительно напоминает дурной квест.

В качестве целевого чипа я буду использовать STM8S103F3P6, изредка переключаясь на STM8L051/STM8L151 там, где есть необходимость.

Читать дальше