Нам осталось познакомиться с возможностями конфигурации STM8. С одной стороны, смысл конфигурационной информации остался таким же, как в уже рассмотренных микроконтроллерах - настройка микроконтроллера до начала выполнения программы. С другой стороны, реализация заметно отличается. В ST отошли от аналогии с разрушаемыми перемычками. Теперь это просто переключатели, которые могут быть замкнутыми и разомкнутыми. Причем начальное состояние именно разомкнутое.
Option Byte
В STM8 конфигурация хранится в виде байт опций. Количество доступных байт и их формат зависит микроконтроллера. При этом каждый байт конфигурации хранится в виде пары байт, прямого и инверсного значений. Исключением являются байт ROP, о котором речь пойдет чуть позже.
Option Byte располагаются в специально выделенной области адресного пространства микроконтроллера начиная с адреса 0х004800, примерно так же, как в PIC, и имеют собственные адреса. Пример распределения адресного пространства STM8 я уже приводил в статье "Микроконтроллеры для начинающих. Часть 9. Процессор и память в STM8", там Option Byte показаны.
Давайте для примера рассмотрим возможности настройки конфигурации STM8S003F3
Самый первый байт (OPT0, ROP) будет рассмотрен немного позже. Хорошо видно, что каждый байт OPTx конфигурации дополняется следующим за ним инверсным байтом NOPTx. Если значения прямого и инверсного байт не соответствуют друг другу считается, что конфигурации разрушена и используются значения по умолчанию. При этом микроконтроллер сбрасывается, а в регистре RST_SR устанавливается флаг EMCF, что позволяет программе исправить проблему. В дальнейшем обсуждении я не буду упоминать инверсные дополнительные байты конфигурации. Я буду использовать имена байт, которые показаны в столбце Option Name.
UBC - размер, в страницах, области загрузчика. Область для загрузчика выделяется начиная с адреса 0х008000. То есть, с начала области Flash памяти для кода программы. Здесь же располагаются векторы прерываний. По умолчанию загрузчик отсутствует. Собственно говоря, этот байт конфигурации просто запрещает запись в страницы памяти программ, занятые загрузчиком, из собственно загрузчика. То есть, загрузчик не может перезаписать сам себя.
AFR - переназначение функций выводов микроконтроллера на альтернативные. Например, для STM8S003F3 (корпус TSSOP20) вывод 10 по умолчанию является битом 3 порта A, но программно может быть переключен на 3 канал второго таймера. А вот с помощью установки AFR1 можно использовать этот вывод для выбора режима master/slave SPI.
С помощью Misc. option можно управлять разрядность регистра подстройки внутреннего тактового генератора и работой сторожевых таймеров.
С помощью Clock option можно переключиться на использование внешнего тактового генератора вместо внешнего кварцевого резонатора и управлять тактированием AWU. Про AWU я кратко упоминал в статье "Микроконтроллеры для начинающих. Часть 40. Использование режимов сна STM8".
HSE Clock startup задает время ожидания стабилизации кварцевого резонатора.
Задание конфигурации микроконтроллера в исходном тексте программы
Поскольку каждый байт опций имеет свой адрес, ничего не мешает задать их значение в исходном тексте программы. Так? А вот не совсем так... Во всяком случае, при использовании программы stm8flash.
С одной стороны, вот такой способ задать значение действительно работает. С точки зрения компилятора
const unsigned char __at(0x4809) OPT5=0xB4;
const unsigned char __at(0x480A) NOPT5=~0xB4;
В сгенерированном hex файле появится нужная нам строка
Однако, stm8flash требует указания в командной строке типа записываемой памяти (eeprom, flash, opt и т.д). При этом stm8flash не может извлечь из единого файла, полученного при компиляции, необходимый диапазон адресов для соответствия указанному типу памяти. Эта программа считает, что входной файл полностью соответствует указанной области памяти (а вот это она проверяет).
В результате мы получим примерно такое сообщение об ошибке
Address 8000 + 4 is out of range at line 1
Ну что же, справедливо, код программы располагается по адресам отличным от адресов конфигурации. Если же удалить все лишние записи и оставить только нужную (и строк конца файла конечно), то stm8flash прекрасно отработает. Победа? Ошибаетесь.
В чем же дело? А вот в чем - мы задали значения только для двух байт, а размер страницы для Low density микроконтроллеров (STM8S003F3 как раз такой) равен 64 байтам! Я об этом уже говорил в статье "Микроконтроллеры для начинающих. Часть 9. Процессор и память в STM8" и тогда многие сочли эту информацию излишней. Но она не была излишней.
Не заданные в явном виде байты stm8flash сочла нулевыми. Поэтому область памяти для Option Byte оказалась заполнена неверными значениями, кроме наших двух байт.
Что же делать? Собственно, выхода два. Первый, создавать отдельный файл с Option Byte, где значения всех байт. Второй, переписать под себя программу stm8flash, исходный код которой доступен.
Есть и третий вариант, использовать предоставляемую ST программу STVP, которая работает только под Windows.
Чтение Option Byte
Разумеется, прочитать блок памяти с данными конфигурации можно внешним программатором. Можно сделать это из из выполняемой микроконтроллером программы, так как каждый байт в области Option Byte имеет свой адрес. Фактически, здесь нет никаких отличий от чтения EEPROM данных.
Изменение Option Byte
Изменить Option Byte можно не только внешним программатором, но и из выполняемой микроконтроллером программы. Как и для других микроконтроллеров, я не буду особо углубляться в эту тему, так как она выходит за рамки цикла для начинающих. Но возможно опишу это в отдельной статье, вне рамок цикла.
Скажу лишь, что такое изменение действительно возможно и безопасно, если четко соблюдать все процедуры и шаги. Для этого необходимо разблокировать именно запись в область Option Byte. В остальном нет существенных отличий от записи в EEPROM. Но необходимо быть особо внимательным, так как, в отличии от простых данных в EEPROM, перезапись Option Bytes непосредственно влияет на аппаратную конфигурацию микроконтроллера.
ROP
Защита памяти от считывания, или Read Out Protection. Не смотря на то, что под эту защиты выделен целый байт, защита может быть только включена или выключена. Для включения защиты в байт ROP нужно записать 0хАА. После этого внешний программатор не сможет прочитать или изменить память программ и EEPROM. Более того, модуль отладки не сможет запустить выполнение программы.
При снятии защиты от считывания выполняется автоматическое стирание памяти программ и EEPROM.
Unique ID
В некоторых микроконтроллерах STM8 есть дополнительная область памяти содержащая уникальный идентификатор. Эта область памяти может быть только прочитана. Вот формат этой области для STM8S105
Уникальный идентификатор занимает 12 байт (96 бит) и может использоваться произвольным образом.
Заключение
На этом мы заканчиваем краткое знакомство в возможностью настройки аппаратных конфигураций микроконтроллеров. Более подробно отдельные тонкости будут рассматриваться по мере необходимости, при описании отдельных модулей микроконтроллеров или примерах практических устройств.
Во многих случаях не требуется изменение конфигурации микроконтроллера. Но так везет не всегда, особенно для PIC, где приходится уделять конфигурации некоторое внимание.