разделы: STM8 , АССЕМБЛЕР , дата: 4 марта 2018г.
Вначале я хотел посвятить архитектуре STM8 краткую вводную главу, но когда начал вчитываться в документацию, то понял, что переводить надо все. Потому что лучше, чем написано в документации, я не скажу. Посвятить целую статью теории — это несколько выходит за формат моего сайта. Но все, что там изложено, стоит того, чтобы это прочесть.
Наибольшие вопросы в STM8 у меня вызывал 3-уровневый конвейер, поэтому в основу перевода легла глава, рассмативающая работу этого конвейера.
Если сравнивать систему команд STM8 с ассемблером AVR, то здесь имеется большое количество 16-битных команд, целочисленное умножение и деление, условные переходы объединены с проверками, не надо вечно перепрыгивать через команду. Имеются полноценные битовые команды, которые выполняются за один цикл. В целом, мне показалась, что писать на ассемблере STM8 можно также легко как на Си.
-
Содержание::
-
Описание ядра STM8
- Введение
- Регистры ЦПУ
-
Интерфейс памяти STM8
- Программное пространство
- Пространство данных
- Архитектура интерфейса памяти
-
Принципы работы конвейера
- Описание уровней конвейера
- Этап выборки (fetch)
- Декодирование и вычисление адреса
- Этап исполнения
- Конфликты на шине данных
- Примеры работы конвейера
- Предварительное соглашение
- Пример оптимизированной работы конвейера — выполнение программы из флеш-памяти
- Пример оптимизированной работы конвейера — выполнение программы из ОЗУ
- Пример работы конвейера с инструкциями перехода JP и CALL
- Приостановка конвейера
- Работа конвейера с ожиданием в один цикл
3 Описание ядра STM8
3.1 Введение
ЦПУ имеет полностью 8-битную архитектуру с 16-битными операциями
на индексных регистрах (для вычисления адресов). Шесть внутренних
регистров позволяют эффективно оперировать с 8-битными данными.
Система команд состоит из 80 базовых инструкций ЦПУ.
20 режимов адресации позволяют адресовать к 6 внутренним регистрам
и 16 Мбайтам оперативной памяти и/или регистрам ввода-вывода.
3.2 Регистры ЦПУ
Шесть регистров ЦПУ показаны на рисунке 1. Перед входом в обработчик прерывания
содержимое этих регистров сохраняется в стеке в порядке, показанном на рисунке 2.
При возвращении из обработчика прерывания содержимое регистров восстанавливается.
Аккумулятор
Аккумулятор — это главный 8-битный регистр, используемый для хранения операнда
и результата арифметических и логических операций, а также для операций с
данными.
Индексные регистры (X и Y)
Это 16-битные регистры, используемые для вычисления адреса или для хранения
временных значений при операциях с данными. В большинстве случаев компилятор
генерирует прекод инструкции (PRE) для обозначения того, что следующая инструкция
ссылается на Y регистр. Оба регистра X и Y автоматически сохраняются при возникновения
прерывания.
Программный счетчик (PC)
Программный счетчик — это 24-битный регистр для хранения адреса следующей
инструкции. Он автоматически обновляется после выполнения каждой инструкции ЦПУ.
Таким образом STM8 может адресовать 16-Мбайтное адресное пространство.
рисунок 1. Регистры ЦПУ
Указатель стека (SP)
Указатель стека — это 16-разрядный регистр. Он содержит адрес следующей
свободной ячейки стека. В зависимости от модели микроконтроллера, старшие биты
указателя могут быть аппаратно предустановлены в то или иное значение.
Стек используется для сохранения содержимого регистров ЦПУ при вызове подпрограммы
или возникновения прерывания. Пользователь также может напрямую использовать
стек через инструкции POP и PUSH.
После подачи питания на микроконтроллер, указатель стека устанавливается
в наибольшее допустимое значение. Значение регистра уменьшается при помещении
данных в стек и увеличивается при извлечении их оттуда. Когда указатель достигнет
нижней допустимой границы, его значение снова будет установлено в максимально допустимое значение.
Тогда ранее сохраненные данные будет переписываться и, следовательно, они будут
потеряны.
Вызов подпрограммы занимает две или три ячейки стека.
При возникновении прерывания регистры ЦПУ(CC, X, Y, A, PC) сохраняются
в стеке. Эта операция занимает 9 тактов и использует 9 байт ОЗУ.
Примечание. Режимы WFI/HALT сохраняют содержимое регистров заранее. Т.о., при
возникновении прерывания скорость реагирования на него увеличивается.
рисунок 2. Сохранение и восстановление содержимого регистров ЦПУ при возникновении прерывания
Глобальный конфигурационный регистр (CFG_GCR)
Глобальный конфигурационный регистр привязан к адресу в оперативной памяти.
Он управляет конфигурацией процессора и включает в себя AL-бит:
AL — уровень активности(activation level)
Если AL сброшен в ноль, то инструкция IRET (выход из обработчика прерывания) восстановит содержимое регистров из
стека, и основная программа продолжит выполнение со следующей инструкции после
WFI.
Если AL установлен в единицу (когда работают только прерывания), то IRET вернет
ЦПУ обратно в режим WFI/HALT, без извлечения содержимого регистров из стека.
Этот бит отвечает за пониженное энергопотребление микроконтроллером. В режиме пониженного
энергопотребления микроконтроллер большую часть времени проводит в режимах WFI/HALT, изредка
пробуждаясь (через прерывания) для выполнения своих задач. Эти задачи могут быть настолько
короткими, что могут выполняться непосредственно в обработчике прерывания, без возвращения
в основную программу. В таком случае флаг AL устанавливается в 1 переводом микроконтроллера
в режим пониженного энергосбережения (с помощью инструкций WFI/HALT). В результате
время выполнения обработчика прерывания уменьшается за счет того, что содержимое регистров ЦПУ
не сохраняется и не восстанавливается каждый раз при возникновении прерывания.
Статусный регистр (CC)
Статусный регистр — это 8-битный регистр, в который заносятся флаги результата только что выполненной
инструкции ЦПУ. Эти флаги могут быть проанализированы независимо друг от друга специальными
инструкциями, в результате чего могут быть приняты те или иные действия.
● V: флаг переполнения (overflow)
Если V флаг установлен, то это показывает, что при выполнении последней знаковой арифметической операции старший бит — MSB — был установлен в единицу. Для подробностей смотрите описание инструкций: INC, INCW, DEC, DECW, NEG, NEGW, ADD, ADC, SUB, SUBW, SBC, CP, CPW.
● I1: маска прерывания первого уровня
Этот флаг работает совместно с флагом I0 и определяет текущий уровень прерывания согласно нижеследующей таблице. Эти флаги могут быть установлены программно следующими инструкциями: RIM, SIM, HALT, WFI, IRET, TRAP и POP. Или они могут быть установлены автоматически аппаратным способом при входе в обработчик прерывания.
● H: флаг полупереноса
Этот флаг устанавливается в 1, когда произошел перенос из 3-го бита в 4-й при выполнении инструкций ADD или ADC. Флаг H используется при работе с BCD-арифметикой. В случае ADDW, SUBW этот флаг устанавливается, когда произошел перенос между 7-м и 8-м битами индексных 16-битных регистров.
● I0: маска прерывания нулевого уровня
см. флаг I1.
● N: флаг отрицательного числа
Флаг устанавливается в 1, когда последняя арифметическая, логическая или операция с данными привела к появлению отрицательного числа (т.е. старший бит был установлен в единицу).
● Z: флаг нуля
Флаг устанавливается в 1, когда последняя арифметическая, логическая или операция с данными привела к появлению нуля.
● C: флаг переноса
Флаг переноса — «C» устанавливается тогда, когда в результате последней арифметической
операции в АЛУ со старшим битом (MSB) произошел перенос или заимствование. Этот бит также
участвует в операциях проверки, ветвления, сдвига и загрузки. Смотрите описания инструкций:
ADD, ADC, SUB, SBC для подробностей.
В операциях битового тестирования инструкции работают с копией флага «C». Смотрите описания
инструкций: BTJF, BTJT для подробностей.
В операциях сдвига «C» флаг будет обновлен. Смотрите описания инструкций: RRC, RLC, SRL, SLL, SRA для подробностей.
Флаг может быть программно установлен, сброшен, или может изменить значение на противоположное
с помощью инструкций: SCF, RCF, CCF.
Пример: сложение
Влияние выполнения каждой инструкции на статусный регистр отображено в таблице инструкций STM8. Для примера:
Где:
N — не влияет;
Имя флага — влияет;
1 — устанавливается в единицу;
0 — устанавливается в ноль.
4 Интерфейс памяти STM8
4.1 Программное пространство
Программное пространство равно 16 Мбайт и оно линейно. Отличия 1-, 2-, и 3-байтных режимов
адресации показаны на рисунке 3.
● «Страница» [0xXXXX00 до 0xXXXXFF] — это 256-байтный участок памяти с одинаковыми двумя старшими
байтами (ХХХХ определяют номер страницы).
● «Секция» [0xXX0000 to 0xXXFFFF] — это 64КБ участок памяти с одинаковым старшим байтом
(ХХ определяют номер секции).
Reset и таблица векторов расположены по адресу 0х8000 для семейства STM8. (Примечание:
для последующих серий адрес может быть изменен.) Таблица векторов имеет 32 4-байтных
записей: RESET, Trap, NMI и 29 векторов нормальных пользовательских прерываний. Каждая запись
содержит опкод 0x82 и следующее за ним 24-битное значение: PCE, PCH, PCL — адрес расположения
обработчика прерывания. Главная программа и обработчики прерываний могут располагаться в любом
месте 16МБ пространства.
Инструкции CALL/CALLR и RET должны использоваться только в пределах одной секции.
CALL/RET использует смещение относительно текущего значения PCE регистра.
Для JP адрес перехода должен быть длиной 16 или 17 (при индексной адресации) бит.
Это значение добавляется к текущему значению PCE. Чтобы переместиться на любой адрес
программного пространства, инструкции перехода JPF и CALLF используют расширенную
адресацию с тремя байтами в качестве адреса. В то же время RETF возвращает из стека
три байта адреса возврата.
Т.к. программное пространство линейно, секции могут пересекаться двумя способами: выполнением
следующей инструкции (PC+1), относительным переходом, и, в некоторых случаях, инструкцией JP
(с использованием индексной адресации).
Примечание: в целях безопасного использования памяти, функции, пересекающие границы секторов,
ОБЯЗАНЫ:
— вызываться инструкцией CALLF;
— включать в себя инструкции только с расширенной адресацией(CALLF и JPF)
Все метки относятся к нулевой секции (пример: JP [ptr.w], — где ptr.w расположен в нулевой
секции, а JP адресуется к текущей секции).
Все неправильные опкоды, считанные из программного пространства, приводят микроконтроллер
к перезагрузке.
4.2 Пространство данных
Размер пространства данных составляет 16 Мбайт. Т.к. стек расположен в нулевой секции,
доступ к данным за пределами нулевой и первой секции осуществляется только инструкцией LDF.
Для максимальной эффективности вашей программы часто используемые данные должны
располагаться в нулевой секции.
Все метки данных расположены исключительно в нулевой секции.
Индексная адресация (16-битный индексный регистр в сочетании с длинным смещением) позволяет
адресовать нулевую и первую секцию.
Вся периферия имеет собственные адреса в адресном пространстве.
4.3 Архитектура интерфейса памяти
STM8 имеет гарвардскую архитектуру с независимыми шинами для программы и для данных.
Однако, логически, адресное пространство объединено через интерфейс памяти в одну адресную шину
размером в 16 Мбайт с непересекающимися участками. Интерфейс памяти показан на рисунке 4.
Он состоит из двух шин: шины исполняемого кода и шины данных, сигнала переключения режима доступа
в чтение-запись (R/W) и сигнала подтверждения(STALL).
Сигнал подтверждения STALL делает ЦПУ совместимым с медленными последовательными и
параллельными интерфейсами памяти. Когда интерфейс памяти работает медленно,
ЦПУ ожидает от интерфейса подтверждения перед тем как выполнять инструкцию. В таком случае
время выполнения инструкции увеличивается до значения, указанного в этом руководстве.
Шина исполняемого кода является 32-битной. Это позволяет большинству инструкций выполняться за
один цикл.
Поскольку все адресное пространство объединено в общую 24-битную шину, то данные могут быть
расположены в области программы (флеш-памяти), а программный код может выполняться из
оперативной памяти. В последнем случае пострадает быстродействие, т.к. программный
код и данные будет получаться из одной шины, которая за один такт может получить только
один байт. Следовательно, время выполнения инструкции будет больше.
5 Принципы работы конвейера
Семейство микроконтроллеров STM8 имеет 3-уровневый конвейер для ускорения выполнения инструкций.
Конвейер позволяет выполнять несколько операций одновременно, в отличии от их традиционного
последовательного выполнения.
Операции конвейера состоят из:
- Выборки
- Декодирования
- Исполнения
Программный счетчик всегда указывает на инструкцию на этапе декодирования, как показано на рисунке 5:
5.1 Описание уровней конвейера
Рисунок 6 и глава 5.1.1, глава 5.1.2 и глава 5.1.3 предоставляют исчерпывающую информацию
о работе каждого уровня конвейера.
5.1.1 Этап выборки (fetch)
Первый уровень работы конвейера включает в себя 64-битный буфер выборки и 32-битный
предварительный буфер. Все вместе они составляют три машинных слова, называемых F1, F2 и F3.
Структура буфера позволяет загрузить любую инструкцию (более 5 байт) через F1
(и F2, если необходимо) для немедленного декодирования.
Инструкции, получаемые из флеш-памяти, имеют 32-битный размер и выравниваются по
границе, кратной четырем байтам, т.е. 0хXXX0, 0xXXX4, 0xXXX8, или 0xXXXC и т.д.
В отличии от этапов декодирования и выполнения, этап выборки инструкции обращается к памяти
только при необходимости. Обращение к памяти прекращается, когда буфер полностью заполнен.
Это позволяет снизить энергопотребление.
Чтение инструкции из ОЗУ походит на чтение из ПЗУ. Однако, вследствие того, что шина ОЗУ
является лишь 8-битной, потребуется 4 последовательных операции чтения, чтобы заполнить одно
Fx слово. Вследствие этого код из ОЗУ выполняется медленнее, нежели с флеш-памяти.
5.1.2 Декодирование и вычисление адреса
Этап декодирования включает в себя операцию по выравниванию инструкции. Модуль выравнивания
использует 64-битный буфер выборки, извлекает из него инструкцию и подает ее в модуль декодирования.
- Инструкция состоит из двух частей:
- опкода (1 или 2 байта);
- данных или адреса (от 0 до 3-x байт).
На этом этапе декодируется опкод. Если присутствует адресная инструкция,
то сначала вычисляется непосредственный адрес, а если присутствует непосредственный операнд,
то он отправляется сразу на выполнение.
Длинные и невыровненные по границе 32 бит инструкции
Для длинных инструкций (более 5 байт) выборке необходимо дважды получать доступ к памяти,
для загрузки инструкции с операндом(и). В этом случае этап декодирования приостанавливается
(после декодирования опкода) в ожидании, пока выборка завершит работу.
В случае с короткими инструкциями такая ситуация может возникнуть, когда инструкция
пересекает 32-битную границу.
Косвенная адресация
В случае косвенной индексации ЦПУ приостанавливает работу в ожидании пока считается
указатель из памяти данных (т.е. из ОЗУ). Число пропускаемых при этом циклов зависит
от длины указателя (короткий, длинный или расширенный).
5.1.3 Этап исполнения
На этапе исполнения инструкция выполняется, а результат заносится в аккумулятор, индексный
регистр или в ОЗУ.
5.2 Конфликты на шине данных
Три типа операций получают доступ к памяти данных:
- вычисление адреса в случае косвенной адресации;
- операция чтения: получение исходного операнда;
- операция записи: сохранение или операция чтения-модификации-записи.
В случае одновременного доступа к одной и той же области памяти обоих уровней выполнения
конвейера: для записи (при выполнении) и для чтения (при декодировании), операция декодирования
приостанавливается, пока этап выполнения не освободит ресурс.
5.3 Примеры работы конвейера
Ниже приводятся несколько примеров работы конвейера. Приведенные в примерах количество циклов требуемых для этапов
декодирования и выполнения, соответствуют минимальному числу для каждой инструкции.
В некоторых случаях, в зависимости от последовательности инструкций, для выполнения той или иной инструкции
может потребоваться большее количество циклов, нежели было указано в документации.
5.4 Предварительное соглашение
Хотя для этапов декодирования и выполнения некоторых инструкций требуется различное
число циклов, ради упрощения, в этом разделе было принято соглашение обеспечивающее
хорошее соответствие с реальностью:
- Будем считать, что для этапа декодирования требуется только один цикл;
- Этап декодирования занимает несколько циклов, равных:
Cy = DecCy + ExeCy — 1
где:
Cy — количество циклов используемых для выполнения инструкции. В случае декодирования и выполнения,
это соответствует минимальному количеству циклов необходимых для выполнения инструкции,
и не учитывает влияние от последовательности инструкций.
DecCy — точное количество циклов декодирования.
ExeCy — точное количество циклов выполнения.
Этап декодирования следующей инструкции начинается на последнем цикле этапа выполнения
предыдущей инструкции. В случаях инструкций выполняющих сброс очереди конвейера, соглашение
состоит в том, что выборка следующей команды начинается в последний цикл этапа выполнения
предыдущей инструкции.
Точное количество циклов (см. таблицу 3) и количество циклов полученных при использовании
этого соглашения (см. таблицу 4) одинаково.
5.4.1 Пример оптимизированной работы конвейера — выполнение программы из флеш-памяти
В примере показанном в таблице 6, исполняемый код извлекается из флеш-памяти через
32-битную шину. Т.е., необходимо три цикла для заполнения всего 96-битного буфера выборки.
Каждый цикл загружает одно машинное слово в регистры буфера выборки: F1, F2, F3. Следующая
операция выборки для регистра Fx
сможет стартовать только когда все инструкции содержащиеся в нем будут декодированы.
По таблице видно, что только в 9-ом цикле последняя инструкция (SWAP A) содержащаяся в регистре
F3 будет декодирована и операция выборки сможет загрузить в F3 новое значение.
5.4.2 Пример оптимизированной работы конвейера — выполнение программы из ОЗУ
В примере показанном в таблице 8, программа считывается из ОЗУ через 8-битную шину.
В этом случае требуется 12 циклов чтобы заполнить 96-битный буфер выборки.
Каждые 4-е цикла, одно машинное слово загружается в регистр Fx. Декодирование первой
инструкции регистра Fx начинается только тогда, кода это регистр полностью загружен.
В примере это происходит на 4-м цикле, и первая инструкция (NEG A) начинает выполняться только
на пятом цикле.
В случае необходимости чтения или записи в ОЗУ, этап выборки может быть приостановлен.
Это происходит на 6-м цикле, когда требуется получить содержимое адреса ОЗУ 10 для
декодирования инструкции XOR A,$10.
5.4.3 Пример работы конвейера с инструкциями перехода JP и CALL
В примере данном в таблице 10, выполняются переходы после инструкций JP/CALL. Тогда кеш инструкций
содержащийся в буфере выборки теряется (происходит очистка буфера, т.н. «Flush»), и его требуется заполнить новыми инструкциями.
Начало выборки зависит от выполняемой инструкции.
Для инструкции перехода JP, выборка начнется во время последнего цикла выполнения инструкции.
Для инструкции вызова подпрограммы CALL, она стартует только после полного выполнения инструкции.
5.4.4 Приостановка конвейера
Этап декодирования может быть приостановлен, если выполнение длится более одного цикла.
Очистка очереди конвейера происходит в случае перехода. Выборка адреса перехода
осуществляется во время второго цикла инструкции BTJF.
Этап декодирования также может быть приостановлен когда используемая память или регистр
изменяются во время выполнения предыдущей инструкции. В примере данном в таблице 12,
инструкция INCW Y записывает в X регистр в течении первого цикла выполнения. В итоге, следующая
инструкция LD A,(X) не может прочитать источник в X регистре.
5.4.5 Работа конвейера с ожиданием в один цикл
В примере приведенном в таблице 14, выборка выполняется за 2 цикла, и
выборка в регистры не перекрывается(по строке таблицы).
Если инструкция декодируется / выполняется в течение последних 2 циклов выборки,
то состояние приостановки приравнивается к состоянию выполнения.
Введение
В 2016 году была написана серия статей «AVR на C — просто?» — Часть 1, Часть 2, Часть 3, Часть 4. Уже тогда были мнения что 8-битные микроконтроллеры ненужны. Но прошло 6 лет и 8-битные существуют наравне с 32-битными. Причем цена не играет существенной роли в выборе микроконтроллера. Целесообразно делать выбор в соответствии с поставленной задачей. Зачем использовать производительный и «нафаршированный» камень для простых задач, таких как поморгать светодиодом, сделать электронный градусник или простой вольтметр — показометр. Почему STM8? Почему не STM32? Почитав статью пришел к выводу что для начинающего любителя микроконтроллеров лезть в дебри 32-битной архитектуры на ядре ARM Cortex-M3 та еще задача. Пока разбирешся может пропасть интерес к микроконтроллерам. Да и для STM8 обучающие руководства далеки для понимания. Хочется чего то простого на подобии Ардуино, но написанного на напрямую, без «скетчей». И слово то какое придумали «скетч» созвучно со скотчем и на нем склеенное — это так отступление.
Для кого это все? Для начинающего программиста — любителя постараюсь изложить свой подход к изучению STM8. Профессионалам в области микроконтроллеров наверное будет не очень интересно, но конструктивная критика приветствуется, без навязывания своего видения процесса разработки простых устройств на микроконтроллере.
1. Подготовка
Нам понадобится:
-
Среда разработки (Code::Blocks);
-
Компилятор (SDCC — Small Device C Compiler);
-
Стандартная библиотека Standard Peripherals Library (SPL для STM8);
-
Программа для загрузки микропрограмм в микроконтроллер (ST Visual Programmer для STM8);
-
Программатор (обычный ST-Link подойдет);
-
Микроконтроллер (STM8S103F3P6 подойдет, лучше распаянный на макетной плате);
-
Прочее (провода, сопротивления, светодиоды, восьми сегментные индикаторы и др.).
1.1. Среда разработки
В качестве среды разработки остановимся на Code::Blocks. Скачать можно с сайта разработчика по ссылке. Скачивать можно последнюю версию, на сегодня это codeblocks-20.03. При этом предлагаю версию codeblocks-20.03mingw со встроенным компилятором GCC, вдруг вам захочется ознакомится c серией статей по AVR. Кстати описывать установку Code::Blocks в рамках данной статьи не вижу смысла, установка с подробностями и картинками описана в первой статье по AVR. Отмечу лишь что настройка для работы с STM8 будет подробно описана далее в этой статье.
1.2. Компилятор
Ну раз уж начали использовать свободно доступные программы, то и компилятор возьмем свободно распространяемый, а именно SDCC. К сожалению в GCC не поддерживается работа с STM8. Компилятор скачаем опять с сайта разработчиков по ссылке.
Рассмотрим установку под Win 7. Запускаем ранее скачанный файл sdcc-4.2.0-x64-setup.exe и по каритинкам:
-
Принимаем лицензионное соглашение.
-
Предлогает создать ссылку из меню «Пуск»
-
Список устанавливаемых компонентов
-
Путь установки
-
Установка
-
Добавление пути на файлы в PATH
-
И завершение установки
Весь процесс установки можно описать как запустить файл и Next – Iagree — Next — Next — Next — Next – Next – Finish.
1.3. Создание проекта
Для объединения SDCC и Code::Blocks добавим мастер создания проектов для STM8. Нам понадобится «мастер» создания проектов, скачаем скрипты по ссылке.
Из полученного архива codeblocks-wizard-stm8-master.zip извлекаем папку stm8. Ее нужно поместить по пути (в случае если у вас Win 64) для системы Win32 путь может отличатся.
C:Program FilesCodeBlocksshareCodeBlockstemplateswizard
Теперь в этой же папке находим файл config.script и в функцию function RegisterWizards() добави строку
RegisterWizard(wizProject, _T(«stm8»), _T(«STM8 Project»), _T(«Embedded Systems»));
Должно получится примерно так
Теперь проверим работоспособность среды разработки для проектов STM8
Запускаем CodeBlocks и жмем Create a new project
Выбираем категорию проекта STM8 Project и жмем Go
Жмем Next>
Задаем название проекта (Project title:), каталог размещения проекта (Folder to crete project in:) и жмем Next>
Проверяем чтоб Compiler был Small Device C Compiler снимаем галку Create “Debug” configuration (хотя можна и оставить) и жмем Next>
Тут просто Finish.
Видим пустой проект (открыть main.c). Нажимаем вверху
Внижней части окна видим результат компиляции нашего, пока еще пустого проекта. Если в синем тексте нули то среда разработки готова для проектов STM8, но без использования Standard Peripherals Library (SPL для STM8)
1.4. Стандартная библиотека STM8
Чтоб облегчить разработку добавим модернизированные для работы с CDCC библиотеки SPL для STM8. Скачиваем доработанные библиотеки по ссылке.
Распаковываем архив STM8-SPL-SDCC-master.zip например
C:STM8-SPL-SDCC-master
Подключаем к Code::Blocks
Менню Settings > Compiler
Подключаем библиотеки:
-
Selected compiler выбрать Small Device C Compiler
-
Вкладка Search directories
-
К имеющейся строке SDCC (выделена) добавляем строки библиотек SPL
1.4. Программа для загрузки микропрограмм в микроконтроллер
Для загрузки программ в микроконтроллер используем ST Visual Programmer (stvp) загрузить можно по ссылке на сайте STMicroelectronics. При первом запуске STVP запросит выбрать микроконтроллера
После выбора откроется программа
На этом настройку программного обеспечения можно считать завершенной (условно, нет предела совершенству).
1.5. Программатор
В качестве программатора используем ST-Link v2 из известного магазина
1.6. Микроконтроллер
В качестве подопытного завалялась плата из поднебесной
Тут установлен микроконтроллер STM8S103F3P6, что подойдет для наших изысканий.
1.7. Прочее
Также понадобятся провода, возможно макетная плата, и многое другое.
Об этом в следующей части этой серии статей. Попробуем выяснить что программировать 8-битные микроконтроллеры от STM мало чем отличается от AVR.
Продолжение читайте в продолжении «STM8 просто на C. Часть 2 +»
Теги:
Опубликована: 16.07.2022
Изменена: 28.09.2022
3
Вознаградить
Я собрал
0
0
x
Оценить статью
- Техническая грамотность
- Актуальность материала
- Изложение материала
- Полезность устройства
- Повторяемость устройства
- Орфография
0
Средний балл статьи: 0
Проголосовало: 0 чел.
-
Contents
-
Table of Contents
-
Bookmarks
Quick Links
Starting STM8 Microcontrollers
STM8 microcontrollers are 8-bit general purpose microcontrollers from STMicroelectronics (STM).
STM is famous mainly for its line of 32-bit ARM Cortex microcontrollers – the STM32s. STM8
microcontrollers are rarely discussed in that context. However, STM8 MCUs are robust and most
importantly they come packed with lots of hardware features. Except for the ARM core, 32-bit
architecture, performance and some minor differences, STM8s have many peripheral similarities to
STM32s. In my opinion, STM8s are equally or sometimes more matched than the popular PICs and
AVRs in all areas. Unlike PICs and AVRs however, I have seen STM8s mostly in various SMD packages.
Only a handful of STM8 chips are available in PDIP/through-hole packages. I think it is a big reason for
which most small industries and hobbyists don’t play with them as much as with other 8-bit families.
People like to setup their test projects in breadboards, trial PCBs or strip-boards first, prototype and
then develop for production. To cope with this issue, STM has provided several affordable STM8
Discovery (Disco) boards to get started with. Besides there are many cheap STM8 breakout-boards
from China.
I have experience playing with AVRs, PICs, 8051s, STM32s, MSP430s, TivaC and so on. To be honest, I
thought learning about STM8 micros is a pure waste of time and energy. The learning curve will be
steep. Things and tools would be different and thus difficult. However, gradually I found these MCUs
very useful and there’s literally no complexity at all. The main drive factor for learning STM8s is the
price factor. They are hell cheap. When it comes down to other things, I have not found any book on
STM8s written in English. There’s literally no 100% complete blog post on the internet that shows the
basics. Similarly, same story with tools. I have been using MikroC for AVRs, 8051s and ARMs and it is
my favourite but at the time of writing, there’s no MikroC compiler for STM8 family. I have also not
stumbled upon any Arduino-like IDE that supports STM8 micros. Arduino-based solutions are also not
my favourite as they don’t go deep and have several limitations. Maybe it is not my luck. After much
study and search, I found out that there are a few C compilers for STM8s. However, any new tool is
both different and difficult at first. It is not always easy to adapt to new environments. You may never
know what unanticipated challenges and harshness a new environment may throw at you even when
you reach certain levels of expertise. I also don’t want to use any pirated software and so a free
compiler was a major requirement. I found out ST Visual Develop and Cosmic COSC compiler are both
free tools. Cosmic used to be a paid tool but now it is absolutely free. The only easy thing till then was
buying the STM8S Value Line Discovery board for just a few dollars and downloading the stuffs.
Summary of Contents for STMicroelectronics STM8
Роман Попов (КОМПЭЛ)
В статье подробно рассказывается о том, как начать работать с микроконтроллерами STM8 компании STMicroelectronics. Мы рассмотрим среды разработки, разберемся, как настроить проект для работы, коснемся некоторых особенностей линковки библиотек к проекту, и, в конце концов, совместно разберем небольшой рабочий проект для закрепления полученных знаний.
Линейка микроконтроллеров STM8 заменила STR7 в 2008 году. На сегодня она состоит из трех семейств: для автомобильного, низкопотребляющего и общего применений. Это, соответственно, STM8A, STM8L и STM8S. Общая же номенклатура составляет более 160 позиций, и компания постоянно работает над расширением каждой линейки. Хотя на рынке наметилась тенденция перехода на 16/32-битные микроконтроллеры, 8-битные все еще составляют основную часть рынка, и в ближайшее десятилетие их доля останется значительной.
Инструментарий для работы
Для работы с любым микроконтроллером, и STM8 – в частности, нам понадобятся отладочный комплект и среда разработки c Си-инструментарием. В качестве отладочного комплекта можно использовать любой из предоставляемых комплектов как от ST, так и от сторонних производителей. Рассмотрим STM8S-Discovery, его внешний вид представлен на рис. 1.
Рис. 1. STM8S-Discovery |
Данный выбор обусловлен, в первую очередь, очень низкой стоимостью комплекта (меньше $15), его доступностью и дальнейшей пригодностью. Комплект состоит из двух частей. Одна – это контроллер STM8S105С6 со светодиодом, сенсорной кнопкой и разъемами, на которые выведены все свободные порты ввода/вывода. Вторая – программатор-отладчик ST-Link c USB-интерфейсом. Если внимательно посмотреть на изображение отладочного комплекта, то можно увидеть, что с помощью небольших усилий его можно разделить на две части, и в дальнейшем использовать отделенный ST-Link для программирования и отладки своих собственных разработок. Всю необходимую документацию вы можете посмотреть и скачать по ссылке.
Выбор программного инструментария для разработки
На данный момент для разработки и отладки программного обеспечения для STM8 существует четыре среды: ST Toolset от STMicroelectronics, Ride7 от Raisonance, CXSTM8 от Cosmic software, IAR Embedded Workbench от IAR Systems. Сравнительный анализ средств разработки программного обеспечения представлен в таблице 1.
Таблица 1. Сравнительный анализ бесплатных средств разработки программного обеспечения
Инструментарий |
Среда |
Си-инструментарий |
Си-инструментарий |
Ограничение |
Программатор- |
STMicroelectronics |
ST Visual Develop |
Нет |
Cosmic software, |
Нет |
ST-Link R-Link STICE |
Raisonance |
Ride 7 |
Есть |
Нет |
16 |
R-Link |
Cosmic software |
CXSTM8 |
Есть |
Нет |
32 |
Нет |
IAR Systems |
IAR Workbench |
Есть |
Нет |
8 или полная версия |
ST-Link STICE |
Пакет ST Toolset включает в себя среду разработки ST Visual Develop и отдельную программу для более функционального внутрисхемного программирования flash-памяти микроконтроллеров ST Visual Programmer. Среда разработки ST Visual Develop имеет встроенный инструментарий для разработки программного обеспечения на языке assembler, но у нее также имеется возможность подключения и использования Си-инструментария от Raisonance и Cosmic software. Стоит заметить, что все четыре среды с Си-инструментарием предоставляют возможность использования с некоторыми ограничениями, а именно – по загружаемому коду во flash-память. У Raisonance оно составляет 16 Кбайт, у Cosmic software — 32 Кбайт, а у IAR – 8 Кбайт или полную версию с 30-дневным ограничением. Самый дешевый и оптимальный вариант – это использование ST Visual Develop в качестве среды разработки и Си-инструментария либо от Raisonance, либо от Cosmic software. Вы, конечно же, можете заметить, что наиболее известным и популярным является инструментарий от IAR System, и тут с вами трудно не согласиться. Он представляет собой более серьезный продукт с лучшей технической поддержкой, но и является самым дорогим. Итак, мы останавливаем свой выбор на ST Visual Developer, плюс Си-инструментарий от Cosmiс software и Raisonance. Большой разницы в использовании обоих инструментариев нет, и далее в своих разработках вы можете остановиться на любом из них. Если вы – начинающий разработчик, и у вас недостаточный опыт, рекомендую устанавливать все программное обеспечение по предполагаемым установщиком местам расположения, т.е. по умолчанию. Это необходимо для меньшей путаницы при дальнейшей настройке проектов, расположении файлов, библиотек и синхронизации с информацией приведенных материалов.
Установка программного инструментария для разработки
Итак, скачиваем и устанавливаем ST Toolset по ссылке. Далее нам необходимо скачать Си-инструментарий от Raisonance и от Cosmic software.
Открываем браузер, входим по ссылке, скачиваем два установочных файла – это среда разработки Ride7 и инструментарий RKit-STM8. Устанавливаем в той же последовательности. После установки, необходимо получить бесплатную лицензию на использование Си-инструментария, заполнив регистрационную форму. В течение короткого срока вы получите лицензионный ключ по указанной в регистрации электронной почте. Запускаем среду «Пуск ® Программы ® Raisonance Tools ® Ride7 ® Ride7» и переходим на «Help ® License». Вводим общую информацию, выбираем «Manual Activation», копируем ключ из поля «This computer Serial Key» в поле «Serial Key», вводим ключ, присланный по электронной почте в поле «Paste the Activation code and Select Next» и, если все сделано верно, Си-инструментарий будет активирован и выдаст соответствующее сообщение.
Для установки Си-инструментария от Cosmic Software переходим по ссылке и скачиваем инструментарий «STM8 32k free tools 2010 special edition», предварительно заполнив регистрационные данные. Далее устанавливаем инструментарий, отправляем информацию, выданную при его установке, на электронную почту «[email protected]». Спустя некоторое время вам придет ответное письмо с файлом лицензии. Теперь вы можете активировать Си-инструментарий, запустив среду разработки «Пуск ® Программы ® Cosmic Tools ® STM8 32K Compiler 4.3.4 ® CXSTM8», которая предложит вам активировать продукт двумя методами. Мы выбираем «Specify the License File» и указываем файл с лицензией.
На сайте STMicroelectronics вы можете найти всю необходимую информацию для работы c STM8S. На основе одного из примеров мы рассмотрим проект, более подробно останавливаясь на ключевых моментах. Также мы остановимся на двух библиотеках – сенсорной и библиотеке стандартной периферии микроконтроллера – написанных инженерами STMicroelectronics для быстрого освоения всех линеек МК и вывода продукции на рынок. Вы можете отказаться от использования библиотек и работать напрямую с именами регистров или написать собственное программное обеспечение для работы с периферией микроконтроллера.
Обзор библиотек
Библиотека стандартной периферии содержит набор функций, структур данных и макросов, охватывающих свойства периферии микроконтроллеров STM8S. Использование библиотеки в значительной степени облегчает процесс разработки собственного программного обеспечения, т.к. устраняется необходимость изучения документации с именами регистров и их функционального назначения. Последняя версия библиотеки со всей необходимой информацией доступна по ссылке, раздел «firmware». Структура библиотеки представлена на рис. 2.
Рис. 2. Структура библиотеки стандартной периферии |
Заголовочный файл «stm8s.h» содержит определения констант и структур регистров для всей периферии. Для использования библиотеки данный файл необходимо включить («#include «stm8s.h»») в основной листинг программы «main.c», и раскомментировать строку («#define USE_STDPERIPH_DRIVER»). Функционал каждого периферийного модуля состоит из заголовочного и исполняемого файла, например, для GPIO – это «stm8s_gpio.h» и «sym8s_gpio.с». В заголовочном файле описаны все переменные, константы, структуры данных и функции, обеспечивающие полный функционал конкретного периферийного модуля. В исполняемом файле осуществляется реализация функционала, описанного в заголовочном файле.
В заголовочном файле «stm8s_type.h» стандартные типы переменных стандарта ANSI C переопределены в более короткие и понятные имена типов. В конечном счете вы можете скорректировать данный файл под наиболее понятные и удобные для вас имена типов.
Заголовочный файл «stm8s_conf.h» используется для конфигурирования библиотеки необходимых для работы периферийных модулей, задания определенных констант (например, тактовой частоты работы ядра). Это осуществляется через раскомментирование макроопределений, соответствующих определенному периферийному модулю, например, в приведенном ниже листинге расскомментированы вторая и четвертая строки:
1. /********* CLK *******/ 2. #define _CLK (1) 3. /********* EXTI **********/ 4. #define _EXTI (1) 5. /**** FLASH/DATA EEPROM ****/ 6. /**** #define _FLASH (1) ****/ 7. /**** OPTION BYTES *****/ 8. /**** #define _OPT (1) ****/
В связи с наличием разной периферии в файле «stm8s_conf.h» учтены особенности периферийных модулей для определенного микроконтроллера. Например, в нижеприведенном листинге таймер 3 определен только в микроконтроллерах STM8S208, STM8S207 и STM8S105:
1. /****** TIM3 ******/; 2. #if defined(STM8S208) || defined(STM8S207) || defined(STM8S105); 3. /**** #define _TIM3 (1) ****/; 4. #endif /**** (STM8S208) || (STM8S207) || (STM8S105) ****/
Работа с библиотекой и ее использование на конкретном примере будут рассмотрены ниже в разделе «Создание нового проекта, конфигурирование библиотек». Более подробную информацию, файл справки «stm8s_fwlib_um.chm» вы можете посмотреть либо по ссылке, либо в директории «STM8S_StdPeriph_Driver» загруженного пакета программного обеспечения.
При использовании прерываний необходимо быть внимательным, так как обработка источников прерывания различна для обоих инструментариев. Для инструментария от Raisonance используется функция без параметров (void) с префиксом «interrupt» и номера прерывания, например:
void timerA_handler(void) interrupt 8 { // Код обработки прерывания } void top_level_interrupt_handler(void) interrupt 0 { // Код обработки прерывания }
Для инструментария от Cosmic все «пустые» обработчики прерывания описаны в файле «stm8s_it.c», и весь код по обработке прерывания следует размещать здесь. Таблица векторов прерывания располагается в «stm8s_interrupt_vector.c», который связан с документом «stm8s_it.c» через заголовочный файл. Для более подробного ознакомления с обработкой прерываний и особенностями компилятора необходимо посмотреть документацию соответствующего компилятора.
Сенсорная библиотека разработана инженерами STMicroelectronics для применения в микроконтроллерах STM8, так как в настоящее время популярность и актуальность использования решений на основе сенсоров очень велика. Библиотека представляет собой набор совместимых С-файлов, включающих API, который образует интерфейс для работы с другими уровнями программного обеспечения. У компании STMicroelectronics существуют разнообразные решения в данной области, более подробную информацию вы можете получить на сайте компании. Структура библиотеки представлена на рис. 3.
Рис. 3. Структура сенсорной библиотеки |
Для использования библиотеки в приложении необходимо добавить все заголовочные и исполняемые файлы в проект. Исключение составляют два файла – «STM8_TSL_RC_Configuration_TOADAPT.h» и «STM8_TSL_RC_routines.asm». Первый копируется в директорию проекта и переименовывается в «stm8_TSL_RC_Configuration.h». Второй добавляется в проект только при использовании инструментария от Raisonance. Файлы «stm8_tsl_rc_api.h» и «stm8_tsl_rc_api.c» определяют функции API, переменные, структуры данных, константы для связи между библиотекой и кодом пользователя. Для использования библиотеки заголовочный файл «stm8_tsl_rc_api.h» должен быть включен в основной исполняемый файл «main.c». Документ «stm8_TSL_RC_Configuration.h» содержит статические конфигурационные параметры, которые должны быть сконфигурированы в соответствии с аппаратной частью проекта. Необходимо проверить все параметры с префиксом «#define» в соответствии с правильными значениями. Более подробно работа с библиотекой будет рассмотрена в разделе «Проект discover».
Среда разработки ST Visual Developer
Для начала работы нам необходимо ознакомиться со средой разработки ST Visual Developer. В среде существуют два основных понятия – проект и рабочая область.
Одна рабочая область может содержать несколько проектов. Это может быть удобно при разработке ПО. Рабочая область создается или открывается через «File ® New Workspace…» или «File ® Open Workspace…». В уже созданной рабочей области можно создавать, удалять и добавлять новый проект через «Project ® Add New Project to WorkSpace…», «Project ® Remove Project from WorkSpace» или «Project ® Insert Project to WorkSpace…». Для работы с определенным проектом необходимо его сделать активным: «Project ® Set Active Project». Все вышеописанные операции также можно выполнить, кликнув правой кнопкой мыши на проекте или рабочей области. Добавление папок и файлов в проект осуществляется кликом правой кнопки мыши на проекте или файле; в выпадающем меню вам будут доступны эти операции. Операции по компилированию и сборке проекта доступны во вкладке основного меню «Build ® Compile filename», «Build ® Build», «Build ® Rebuild All». Выбор программатора-отладчика доступен во вкладке «Debug Instrument ® Target Settings…», а все операции по отладке находятся во вкладке основного меню «Debug» и на дополнительной панели инструментов. Для отдельной настройки каждого проекта в среде, по умолчанию, доступны два режима конфигурации проекта – «debug» и «release». Режим «debug» предназначен для использования в режиме отладки. Режим «release» предназначен для автономной работы ПО в микроконтроллере без избыточной функциональности режима «debug». Каждый из режимов вы можете настроить персонально или создать свой собственный режим со специфичными для вас настройками. Более подробную информацию для работы со средой вы можете прочитать в соответствующем руководстве.
Структура пакета программного обеспечения микроконтроллера STM8S-Diccovery
Для дальнейшей работы нам необходимо скачать пакет программного обеспечения (примеры, библиотеки, файлы справки (8,5 Мбайт) для оценочного набора STM8S-Discovery. Пакет имеет следующую структуру:
- «Libraries» – директория состоит из двух частей:
- STM8_TouchSensing_Driver – сенсорная библиотека с заголовочными, исполняемыми и справочными файлами;
- STM8S_StdPeriph_Driver – библиотека периферии с заголовочными, исполняемыми и справочными файлами;
- «Project» – директория с примерами готовых проектов:
- discover – проект демонстрирующий работу сенсорной библиотеки и библиотеки периферии;
- program_template – шаблон для быстрого создания проекта;
- Справочная информация.
Каждый проект состоит из трех поддиректорий:
- inc – в ней хранятся заголовочные файлы проекта, включая конфигурационные файлы для сенсорной библиотеки (STM8_TSL_RC_Configuration.h) и библиотеки периферийных устройств (stm8s_conf.h);
- src – в ней хранятся все файлы исходных текстов, включенные и используемые в проекте (main.c, stm8_interrupt_vector.c и др.);
- STVD(Raisonance, Cosmic) – в ней хранятся рабочие файлы проектов, областей, настроек (discover.stw).
Итак, копируем папки «Libraries» и «Project» в рабочую область, где мы предполагаем их использовать, например, в следующее местоположение: «C:Program FilesSTMicroelectronicsst_toolset». Теперь запускаем среду разработки «Пуск ® Программы ® ST Toolset ® Development Tools – ST Visual Develop», кликаем «File ® Open Workspace…» и открываем проект «discover» из папки «C:Program FilesSTMicroelectronicsst_toolsetProjectdiscoverSTVDRaisonance» или «C:Program FilesSTMicroelectronicsst_toolsetProjectdiscoverSTVDCosmic». Теперь мы можем скомпилировать, собрать, прошить микроконтроллер и запустить программу на исполнение. Сборка проекта должна пройти без каких-либо проблем, единственное, что понадобится сделать – это выбрать программатор-отладчик ST-Link через «Debug instrument ® Target Settings ® Swim ST-Link» (рис. 4). Если по каким-то причинам сборка проекта произошла с ошибками, ниже будут приведены все настройки проекта.
Рис. 4. Свойства проекта |
Самостоятельная настройка проекта
Если вы решили разместить проект, библиотеки, исходные и заголовочные файлы по вашему собственному усмотрению или создать проект «с нуля», то у вас могут возникнуть проблемы с линковкой файлов библиотек. Все пути к этим файлам можно прописать вручную, но это слишком загромождает проект и делает ваш код менее наглядным. Ниже будут приведены основные настройки проекта для каждого из Си-инструментария в отдельности, и начнем мы с настройки инструментария от Raisonance. Заметим, что в качестве примера будет использоваться проект «discover», скачанный по вышеприведенной ссылке. Переходим на «Projects ® Settings…» (рис. 4).
В поле «Toolset» выбирается Си-инструментарий с необходимыми настройками, в нашем случае выбран инструментарий от Raisonance. В поле «Root path» указывается путь к Си-инструментарию, а в «Output directory» – режим конфигурации проекта, для которого и будут применяться все настройки; на рисунке 4 выбран режим «debug».
Следующая вкладка «Projects ® Settings… ®
Debug». В данной вкладке нас интересует поле «Source Directories:», где прописываются пути к используемым файлам проекта с исходным кодом. Для проекта «discover» – это «С:Program filesstmicroelectronicsst_toolsetprojectdiscoversrc», «C:Program filesstmicroelectronicsst_toolsetlibrariesstm8s_stdperiph_driversrc» и «C:Program filesstmicroelectronicsst_toolsetlibrariesstm8_touchsensing_driversrc».
Следующая вкладка «Projects ® Settings… ® MCU Selection». Здесь выбирается тип микроконтроллера – STM8S105C6 для выбранного нами оценочного комплекта.
Следующая вкладка – «Projects ® Settings… ® C Compiler» (рис. 5). В поле «Category» необходимо выбрать «Preprocessor» и далее в поле «Additional include directories» прописать пути к заголовочным файлам, используемым в проекте. Для проекта «discover» – это «C:Program FilesSTMicroelectronicsst_toolsetProjectdiscoverinc», «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8_TouchSensing_Driverinc» и «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8S_StdPeriph_Driverinc».
Рис. 5. Свойства проекта |
И последняя вкладка – «Projects ® Settings… ®
Linker». Если вы используете ограниченно-бесплатный Си-инструментарий, то необходимо убрать флажок «Run Code Compressor», иначе при сборке проекта будет сгенерирована ошибка.
Что касается использования Си-инструментария от Cosmic Software, необходимо всего лишь произвести некоторые изменения в поле «General» (рис. 6), остальные настройки идентичны приведенным выше для Raisonance. В частности в поле «Toolset» выбирается Си-инструментарий от Cosmic software и соответствующие настройки.
Рис. 6. Свойства проекта |
В разделе, посвященном настройке проекта, были затронуты лишь основные моменты. К сожалению, описать все настройки и тонкости не хватит места, да и в этом, собственного говоря, нет необходимости. Для более детальной информации вам следует обратиться к руководству описания среды ST Visual Developer. Что касается приведенных выше настроек проекта – путей к файлам, вы можете пересобрать и перекомпоновать проект по вашему усмотрению, нужно лишь прописать правильные пути к исходным и заголовочным файлам. По мере работы со средой и приобретения опыта вы сами разберетесь, какие настройки для чего необходимы.
Создание нового проекта, конфигурирование библиотек
Возможно, по каким-либо причинам у вас не возникнет желания использовать предоставляемые производителем библиотеки. В таком случае вам понадобится следующая информация. Все файлы с описанием регистров находятся в папке «C:Program FilesSTMicroelectronicsst_toolsetinclude». Пути для Си-компилятора прописываются в свойствах проекта «Project ® Settings ® C compiler ® Category Preprocessor». Свойства линковщика находятся в «Project ®Settings ® Linker ® Category Input».
Для создания собственного проекта с использованием библиотек наиболее простым и быстрым методом является использование шаблона проекта «Project_template», расположенного в скачанном пакете в папке «Project». При создании проекта вы вручную создаете папку с названием вашего проекта и копируете туда содержимое проекта «Project_template». Затем в среде ST Visual Develop открываем проект из вновь созданной папки (рис. 7).
Рис. 7. Создание нового проекта |
Структура проекта состоит из следующих директорий:
- Source Files – содержит исходные файлы проекта;
- Source FilesFWLib – содержит исходные файлы библиотеки периферии;
- Source FilesTSLib – содержит исходные файлы сенсорной библиотеки;
- Include Files – содержит заголовочные файлы проекта;
- Include FilesFWlib – содержит заголовочные файлы библиотеки периферии;
- Include FilesSTlib – содержит заголовочные файлы сенсорной библиотеки.
Далее нам необходимо выбрать в свойствах проекта программатор-отладчик, Си-инструментарий, тип микроконтроллера, прописать пути к файлам, если они не указаны. Эти операции описывались выше.
Для использования библиотеки стандартной периферии необходимо убедиться, что в основном файле проекта «main.с» был подключен файл «stm8s.h» (#include ), который содержится в директории «inc» библиотеки периферии микроконтроллера. Также файл «stm8s.h» необходимо добавить в поддиректорию «Include FilesFWlib», кликнув правой кнопкой мыши на папке, и выбрать в выпадающем меню «Add Files to Folder…» (рис. 7).
Шаблон проекта подразумевает, что разработчик будет использовать библиотеку стандартной периферии микроконтроллера. В другом случае вам нужно закомментировать строку «#define USE_STDPERIPH_DRIVER» в файле «stm8s.h». Если вы все же будете использовать библиотеку стандартной периферии, то вам необходимо выполнить следующие шаги:
1) Убедиться, что строка «#define USE_STDPERIPH_DRIVER» в файле «stm8.h» раскомментирована;
2) Добавить файл «stm8s_conf.h» из директории вашего проекта «My Projectinc» в папку корневого каталога «Include Files» проекта с помощью операции «правая кнопка мыши ® Add Files to Folder…». Для использования какого-либо периферийного модуля необходимо раскомментировать его название в файле «stm8s_conf.h» (рис. 8);
Рис. 8. Конфигурирование библиотеки периферии |
3) Вся периферия и функции работы с ней описаны в двух файлах: заголовочном (расширение .h) и исходном (расширение .с) с именем «stm8s_PeriphType». Данные файлы расположены в директориях «inc» и «src» по следующему пути «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8S_StdPeriph_Driver». При использовании любого периферийного модуля в вашем проекте необходимо добавить исходный файл в поддиректорию «Source FilesFWLib», а заголовочный – в «Include FilesFWLib» (рис. 8). Данные операции выполняются кликом правой кнопкой мыши на соответствующей папке: «Правая кнопка мыши ® Add Files to Folder…»
После вышеперечисленных действий вы можете использовать функционал библиотеки периферии. В примере «discover» используется сенсорная кнопка, работа с которой реализована в специальной библиотеке. Для использования библиотеки ее необходимо сконфигурировать следующим образом:
1) Сконфигурировать библиотеку в соответствии с количеством сенсорных кнопок (до 24), ползунков (до двух) и колец (до двух):
- Скопировать файл «STM8_TSL_RC_Configuration_TOADAPT.h» из директории «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8_TouchSensing_Driverinc» в директорию проекта «C:Program FilesSTMicroelectronicsst_toolsetProject ew_projectinc» и переименовать данный файл в «STM8_TSL_RC_Configuration.h»;
- Сконфигурировать файл «STM8_TSL_RC_Configuration.h» в соответствии с аппаратными особенностями проекта;
- Добавить файл «STM8_TSL_RC_Configuration.h» в директорию «Include Files» проекта: «правая кнопка мыши®Add Files to Folder…»;
- При использовании инструментария от Raisonance добавить файлы с расширением «.h» и «.c», исключая файл «STM8_TSL_RC_Configuration_TOADAPT.h» из сенсорной библиотеки C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8_TouchSensing_Driver», соответственно, в директории «Include FilesTSLib» и «Source FilesTSLib» (рис.9). При использовании инструментария от Cosmic Software файл «STM8_TSL_RC_routines.asm» также не добавляется, вместо него необходимо сконфигурировать «Project® Settings® Linker», что будет описано ниже;
Рис. 9. Конфигурирование сенсорной библиотеки |
- Добавить строчку «#include » в основной файл проекта «main.c»;
- Некоторые функции библиотеки должны быть расположены в памяти по специальным адресам при использовании инструментария Cosmic software (рис.10):
- Выбираем «Project ® Settings ® Linker»;
- На вкладке «Linker» в поле «Category» выбираем «Input»;
- В поле «Vector File name» прописываем путь к файлу «stm8_interrupt_vector.c»;
- В окне «Segment/Section name» добавляем «TSL_IO_ALCODE» в секции «Code,Constant» c опцией «-r2»;
Рис. 10. Конфигурирование сенсорной библиотеки для Cosmic software |
- При использовании инструментария Raisonance в операциях с «Project® Settings® Linker» нет необходимости. Необходимо всего лишь добавить файл «STM8_TSL_RC_routines.asm» в директорию проекта «Source FilesFWLib».
Общую настройку проекта с обеими библиотеками вы можете посмотреть на примере «discover» в загруженном пакете программного обеспечения.
Проект «discover»
Алгоритм работы программного обеспечения проекта следующий: программа ожидает срабатывания нажатия сенсора TS1 и меняет частоту мерцания светодиода LD1. Рассмотрим проект более подробно. Открываем среду разработки ST Visual Developer, затем «File ® Open Workspace…» и выбираем проект по следующему пути C:Program FilesSTMicroelectronicsst_toolsetProjectdiscoverSTVDRaisonance». Как вы можете заметить, у данного проекта структура фактически идентична шаблону проекта «project_template» и используются обе библиотеки – сенсорная библиотека и библиотека периферии. Рассмотрим более подробно основные моменты основного файла проекта «main.c».
#include «stm8s.h» // Заголовочный файл библиотеки периферии #include «stm8_tsl_rc_api.h» // Заголовочный файл сенсорной библиотеки // Макроопределения ...... // Объявление функций ...... // Объявление глобальных переменных ...... // Главная функция void main(void) { //Конфигурация тактового сигнала CLK_Configuration(); // Конфигурация портов ввода/вывода GPIO_Configuration(); // Инициализация сенсорной библиотеки TSL_Init(); // Инициализация сенсорных кнопок ExtraCode_Init(); // Старт таймера для управления частотой мерцания светодиода LD1 с периодом 100 мс TSL_Tick_Flags.b.User_Start_100ms = 1; // Основной цикл программы for (;;) { // Код разработчика ExtraCode_StateMachine(); // Главная функция сенсорной библиотеки TSL_Action(); } } // Реализация объявленных функций ......
Программы для микроконтроллеров имеют похожие структуры, точкой входа программы является функция «main()». Для начала работы с микроконтроллером, в зависимости от задачи, его необходимо сконфигурировать – настроить тактовые частоты, периферийные модули, разрешить прерывания, если необходимо. После этого уже запускается т.н. диспетчер, обычно – это бесконечный цикл «while(1){….}» или «for(;;){….}», в контексте которого уже и выполняются функции основной программы – реакция на события, выполнение вычислений и т.д.
В проекте из библиотеки стандартной периферии используются функции для настройки тактового сигнала, настройка работы с портами ввода/вывода. С помощью функции «CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1)» в качестве источника тактового сигнала выбирается внутренний генератор HSI, работающий на частоте 16 МГц, коэффициент деления равен 1, соответственно рабочая частота микроконтроллера равна 16 МГц. Для работы со светодиодом LD1 необходимо настроить соответствующую ему ножку ввода/вывода. Данная операция выполняется с помощью функции библиотеки «GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST)». По передаваемым параметрам функции видно, что используется ножка «0» порта «D» микроконтроллера, режим push – pull, режим быстрого переключения (до 10 МГц), и в данный момент на ее выходе – сигнал низкого уровня. Переключение состояния ножки осуществляется с помощью функции «GPIO_WriteReverse(GPIOD, GPIO_PIN_0)».
Процесс работы с сенсорной библиотекой начинается с ее инициализации: «TSL_Init()» – инициализация памяти, функций и структур данных. Далее необходимо настроить библиотеку согласно аппаратным требованиям. В нашем случае библиотека настраивается под сенсорную кнопку TS1 в функции ExtraCode_Init(). После того, как все настроено, можно начинать работать с библиотекой, которая предоставляет API для работы с ней, нам в частности необходимо определять событие нажатия TS1. Данная операция осуществляется в функции «ExtraCode_StateMachine()», также здесь задается режим мерцания светодиода LD1. Для работоспособности сенсорной библиотеки необходимо включать в основной цикл программы (диспетчер) функцию «TSL_Action()», которая выполняет необходимые операции для обработки и определения событий сенсорных кнопок и других сенсорных объектов.
Заключение
В статье мы представили необходимую информацию для начала работы с микроконтроллерами STM8. В материале были рассмотрены лишь основные моменты, для более подробного и глубокого ознакомления читателю следует обращаться к справочным материалам, доступным на сайте.
Уровень сложности
Простой
Время на прочтение
6 мин
Количество просмотров 5.9K
Речь пойдет о маломощном микроконтроллере STM8L001J3. Постараюсь подробно рассказать о необходимых шагах для прошивки «hello world» и различных подводных камнях.
Основные характеристики микроконтроллера:
Максимальная частота ядра |
16 МГц |
Объем памяти программ |
8 кБайт |
Объем EEPROM |
256 Байт |
Объем оперативной памяти |
1.5 кБайт |
Количество входов/выходов |
6 |
Поддерживаемые интерфейсы |
SPI, I2C, UART |
Напряжение питания |
1,8..3,6 V |
Корпус |
SO8 |
Из этих данных видно, что STM8L001J3 вполне может заменить так горячо любимый всеми ATTiny13. Более подробно можно посмотреть на официальном сайте STM.
Для изучения нам понадобятся:
-
Вот такой девайс — Модуль STM8L, он минималистичен, но все необходимое на борту имеется;
-
IDE, приложение для написания и редактирования кода; после долгих проб остановился на IAR EW for STM8;
-
Ну и, конечно, программатор ST-Link V2. Любой клон, главное чтобы был рабочий.
Часть 1. Установка и настройка IAR EW for STM8
Помимо этого варианта есть и другие возможные комбинации работы с микроконтроллером, например, Code::Blocks/SDCC/ST Visual Programmer или STVD/Cosmic/STVP. Кстати, «Cosmic» на мои письма не ответила по неизвестной причине. Мы же будем использовать IAR EW for STM8.
На сегодняшний день есть масса возможных ограничений, которые можно обойти, затратив некоторые усилия. Поэтому я буду освещать только общие моменты. Возможно, когда Вы будете читать эту статью что-то изменится. Скачиваем IAR EW for STM8 с официального сайта (не обязательно) последнюю версию и ставим на компьютер. Дальше настраиваем среду для работы. Маленькое отступление для тех, кто любит видеоуроки: есть очень хорошие обзоры у Бородатого Инженера. Там, правда, простая STM8, но первые уроки вполне подходят. А здесь расскажу в картинках, как это все настроить.
Открываем приложение и заходим в File/New Workspace, тем самым создаем новое рабочее пространство. Сохраняем проект, называем, к примеру «HW-STM8L»; нажимаем «ОК». Получаем вот такой экран:
Добавляем файлы библиотек в проект. Для этого создадим две новых группы, ПКМ (правая кнопка мышки) по корню, Add/Add Group, даем им имена «Inc» и «src».
Далее внимательно: если Вы параллельно смотрите видео, то будут отличия. Файлы библиотек SPL для STM8 и STM8L различные. Поэтому идем на официальный сайт ST и скачиваем библиотеки для нашей 8L. Называется файл «en.stsw-stm8012». Сохраняем на диске и разархивируем. Теперь, чтобы добавить файлы библиотек в наши вновь созданные папки, кликаем ПКМ по этим папкам, Add/Add Files. Находим на диске разархивированный файл en.stsw-stm8012STM8L10x_StdPeriph_LibLibrariesSTM8L10x_StdPeriph_Driver выбираем всё и добавляем в папки соответственно их названиям.
Теперь добавляем основной файл и файлы конфигурации. Находим разархивированный файл библиотек. Выбираем из папки en.stsw-stm8012STM8L10x_StdPeriph_LibProjectSTM8L10x_StdPeriph_Templates четыре файла и переносим их в папку с проектом.
Соглашаемся с заменой, «ОК». Для удобства перенесем эти файлы в корень. Для этого опять ПКМ на корне и добавляем три файла (mane.c уже поменялся):
Продолжаем настраивать конфигурацию: ПКМ по корневому файлу, далее Options. Появляется вот такое окно, выбираем в нём наш микроконтроллер:
Следующая настройка С/С++ Comiler/Preprocessor, туда добавим наши папки «inc» и «src».
Также добавляем папку с четырьмя добавленными файлами.
Прописываем наш микроконтроллер в это окно Defined:
Далее в этом окне идем в Debugger меняем Simulator на ST-Link. Следом в Output Converter: ставим галку и выбираем Output format как «Intel Extended».
Нажимаем «ОК» и ждём, пока настройки применятся. Потом F7 или зеленый многогранник со стрелочкой, именуем Work Space, «ОК», даем какое-то время для сборки. После сборки ошибок быть не должно. Если они есть, то исключите файл, на который жалуется приложение из папки «src». Примерно так: ПКМ на файле, «Options» и ставите галку здесь:
В моем случае жалоба была на файл «stm8l10x_itc.c», после его исключения ошибка пропала. Вот он, наш замечательный бесконечный цикл. Настройка завершена.
Часть 2. Разбираем Модуль STM8L
На борту этого модуля микроконтроллер, светодиод и кнопка. Питается от внешнего напряжения 5-15 Вольт. Есть отдельные пины для подключения программатора. При необходимости можно удалить перемычки J1 и J2, тем самым освободив пины микроконтроллера под свои нужды. В комплекте, кстати, идет дополнительно еще один микроконтроллер и макетка.
По схеме у нас светодиод на выводе №6 — PB6, а кнопка на выводе №7 — PB7, это нам понадобится в третье главе, когда будем писать код для микроконтроллера.
Также обратите внимание: здесь всего три вывода для внутрисхемного программирования. Отсутствует привычный четвертый вывод «Reset». У этого микроконтроллера его нет. Эту особенность, нужно учитывать при программировании, и она накладывает некоторые ограничения при написании кода. Подробнее в следующей главе.
Часть 3. Пишем код и заливаем
Прежде всего необходимо рассказать о главной особенности микроконтроллера STM8L001J3. Я уже писал, что разработчики отказались от «Reset» ножки. Поэтому в даташите рекомендуется при написании кода в первых же строках дать 5-секундную задержку перед началом выполнения основной программы. Таким образом, при подаче питания у нас есть 5 секунд для начала заливки кода. Если заливки нет, программа благополучно начнет работу после небольшой паузы. Когда же код будет полностью отлажен, можно убрать задержку и прошить, осознавая, что внести изменения кода в микроконтроллер больше нельзя.
Итак, полагаясь на даташит и знания Си, пишем наш Hello World:
/**
******************************************************************************
* @file Project/STM8L10x_StdPeriph_Templates/main.c
* @author KHod
* @version V1
* @date 20-JNR-2023
* @brief This file contains the firmware main function.
******************************************************************************
*
* https://elmodule.sytes.net/?p=130
*
*
******************************************************************************
*/
/* MAIN.C file */
#include "stm8l10x.h"
#include "stm8l10x_gpio.h"
#include "stm8l10x_clk.h"
#define ASM asm
/* This delay should be added just after reset to have access to SWIM pin
and to be able to reprogram the device after power on (otherwise the
device will be locked) */
#define STARTUP_SWIM_DELAY_5S
{
ASM(" PUSHW X n"
" PUSH A n"
" LDW X, #0xFFFF n"
"loop1: LD A, #50 n"
"loop2: DEC A n"
" JRNE loop2 n"
" DECW X n"
" JRNE loop1 n"
" POP A n"
" POPW X " );
}
/* not connected pins as output low state (the best EMC immunity)
(PA1, PA3, PA5, PB0, PB1, PB2, PB4, PC5, PC6, PD1, PD2, PD3, PD4, PD5,
PD6, PD7)*/
#define CONFIG_UNUSED_PINS_STM8L001
{
GPIOA->DDR |= GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_5;
GPIOB->DDR |= GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4;
GPIOC->DDR |= GPIO_Pin_5 | GPIO_Pin_6;
GPIOD->DDR |= GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 |
GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
}
/* pin for testing */
#define Led_PORT GPIOB
#define Led_PIN GPIO_Pin_6
main()
{
uint16_t i;
/* -------------STM8L001 startup-------------- */
/* configure unbonded pins */
CONFIG_UNUSED_PINS_STM8L001;
/* delay for SWIM connection: ~5seconds */
STARTUP_SWIM_DELAY_5S;
/* ------------------------------------------- */
/* configure all STM8L001 pins as input with pull up */
GPIO_Init(GPIOA, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT); // pin 1
GPIO_Init(GPIOA, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT); // pin 2
GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT); // pin 5
GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT); // pin 6
GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); // pin 7
GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT); // pin 8
/* initialize tested pin */
GPIO_Init(Led_PORT, Led_PIN, GPIO_Mode_Out_PP_Low_Fast);
while (1)
{
GPIO_ToggleBits(Led_PORT, Led_PIN);
/* delay */
for(i=0; i<64000; i++);
}
}
Можно скопировать весь текст на странице «main.c». Главный цикл находится в самом конце, это несколько строчек. Все остальное — инициализация и подготовка. Переносим текст, нажимаем зеленый квадратик со стрелкой (ALT+F7) и компилятор должен выдать «Ошибок 0».
Переходим к прошивке. Используем ST-LINK: скачиваем и устанавливаем под него свежие драйвера. Вставляем в USB. Подключаем три провода программатора ST-LINK: Gnd, Swim, +3.3 к соответствующим выводам Модуля STM8L. Здесь нужно заметить, что на Модуле STM8L уже загружена тестовая прошивка. Поэтому, на все про все есть ровно 5 секунд. За это время нужно соединить три контакта и нажать кнопку «Download and Debug» (Ctrl+D). После прошивки рестарт, ждем 5 секунд и видим наш мигающий светодиод. Можно поменять в программе паузу, правда, чтобы её увеличить, необходимо задать переменную «i» как uint32.
Это первые шаги. В даташите приводится код на Си. Можно самостоятельно дописать нашу программу, чтобы можно было использовать UART и таймеры.