Микроконтроллеры STM8 «с нуля»
Линейка микроконтроллеров 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 (www.raisonance.com), CXSTM8 от Cosmic software, IAR Embedded Workbench от IAR Systems. Сравнительный анализ средств разработки программного обеспечения представлен в таблице 1.
Таблица 1. Сравнительный анализ бесплатных средств разработки программного обеспечения
| Инструментарий | Среда разработки | Си-инструментарий | Си-инструментарий других производителей | Ограничение Си-иструментария, Кбайт | Программатор-отладчик |
|---|---|---|---|---|---|
| STMicroelectronics | ST Visual Develop | Нет | Cosmic software, Raisonance | Нет | ST-Link R-Link STICE |
| Raisonance | Ride 7 | Есть | Нет | 16 | R-Link |
| Cosmic software | CXSTM8 | Есть | Нет | 32 | Нет |
| IAR Systems | IAR Workbench | Есть | Нет | 8 или полная версия на 30 дней | 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», предварительно заполнив регистрационные данные. Далее устанавливаем инструментарий, отправляем информацию, выданную при его установке, на электронную почту «stm8_32k@cosmic.fr». Спустя некоторое время вам придет ответное письмо с файлом лицензии. Теперь вы можете активировать Си-инструментарий, запустив среду разработки «Пуск ® Программы ® 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» используется для конфигурирования библиотеки необходимых для работы периферийных модулей, задания определенных констант (например, тактовой частоты работы ядра). Это осуществляется через раскомментирование макроопределений, соответствующих определенному периферийному модулю, например, в приведенном ниже листинге расскомментированы вторая и четвертая строки:
2. #define _CLK (1)
4. #define _EXTI (1)
5. /**** FLASH/DATA EEPROM ****/
6. /**** #define _FLASH (1) ****/
В связи с наличием разной периферии в файле «stm8s_conf.h» учтены особенности периферийных модулей для определенного микроконтроллера. Например, в нижеприведенном листинге таймер 3 определен только в микроконтроллерах STM8S208, STM8S207 и STM8S105:
2. #if defined(STM8S208) || defined(STM8S207) ||
4. #endif /**** (STM8S208) || (STM8S207) ||
Работа с библиотекой и ее использование на конкретном примере будут рассмотрены ниже в разделе «Создание нового проекта, конфигурирование библиотек». Более подробную информацию, файл справки «stm8s_fwlib_um.chm» вы можете посмотреть либо по ссылке, либо в директории «STM8S_StdPeriph_Driver» загруженного пакета программного обеспечения.
При использовании прерываний необходимо быть внимательным, так как обработка источников прерывания различна для обоих инструментариев. Для инструментария от Raisonance используется функция без параметров (void) с префиксом «interrupt» и номера прерывания, например:
// Код обработки прерывания
// Код обработки прерывания
Для инструментария от 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»- директория состоит из двух частей:
- inc- в ней хранятся заголовочные файлы проекта, включая конфигурационные файлы для сенсорной библиотеки (STM8_TSL_RC_Configuration.h) и библиотеки периферийных устройств (stm8s_conf.h);
- src- в ней хранятся все файлы исходных текстов, включенные и используемые в проекте (main.c, stm8_interrupt_vector.c и др.);
- STVD(Raisonance, Cosmic)- в ней хранятся рабочие файлы проектов, областей, настроек (discover.stw).
- Source Files- содержит исходные файлы проекта;
- Source FilesFWLib- содержит исходные файлы библиотеки периферии;
- Source FilesTSLib- содержит исходные файлы сенсорной библиотеки;
- Include Files- содержит заголовочные файлы проекта;
- Include FilesFWlib- содержит заголовочные файлы библиотеки периферии;
- Include FilesSTlib- содержит заголовочные файлы сенсорной библиотеки.
- Скопировать файл «STM8_TSL_RC_Configuration_TOADAPT.h» из директории «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8_TouchSensing_Driverinc» в директорию проекта «C:Program FilesSTMicroelectronicsst_toolsetProjectnew_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», что будет описано ниже;
- Добавить строчку «#include <stm8_tsl_rc_api.h>» в основной файл проекта «main.c»;
- Некоторые функции библиотеки должны быть расположены в памяти по специальным адресам при использовании инструментария Cosmic software (рис.10):

Рис. 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».
// Заголовочный файл библиотеки периферии
// Заголовочный файл сенсорной библиотеки
// Объявление глобальных переменных
//Конфигурация тактового сигнала
// Конфигурация портов ввода/вывода
// Инициализация сенсорной библиотеки
// Инициализация сенсорных кнопок
// Старт таймера для управления частотой
мерцания светодиода LD1 с периодом 100 мс
// Основной цикл программы
// Главная функция сенсорной библиотеки
// Реализация объявленных функций
Программы для микроконтроллеров имеют похожие структуры, точкой входа программы является функция «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. В материале были рассмотрены лишь основные моменты, для более подробного и глубокого ознакомления читателю следует обращаться к справочным материалам, доступным на сайте.
Изучаем STM8S Медленный старт. Часть 0
При написании данной статьи, я предполагаю, что читающий умеет:
- Внимательно читать (что редкость)
- Немного работать с англоязычной технической литературой (ну или мотивацию научиться, т.к. первый язык программиста — английский)
- Паять (хотя бы минимальные навыки)
- Программировать на С (опять же, не все так сложно)
- Гуглить (без этого никуда)
- Пользоваться мультиметром и имеет прочие базовые навыки (по типу «не суй пальцы в розетку»)
- Обзорно пробежать все этапы разработки системы на базе микроконтроллера
- Дать необходимые вводные для человека практически не посвященного
- По возможности формирование у читающего понимания того, где, что и как найти
Думаю имеет смысл сделать подробный курс программирования МК.
Мне послужит поводом изучить всю периферию более детально и попутно поможет другим.
Знаю, что уже существует огромное количество статей и даже обучающих курсов, но я имею слегка иной подход. (Возможно получу адекватную критику, изменю мнение и примкну к MX Cube ребятам).Грустно видеть, как stm контроллеры превращают в arduino.
По поводу arduino:
Есть 3 (известных мне, мб я просто не дорос) подхода к разработке ПО на МК:
- Разработка на ассемблере
- Разработка под конкретную модель МК
- Разработка с использованием HAL и им подобных библиотек
2) Библиотеки HAL и т.п. для начинающего непрозрачна и слишком много моментов «просто пиши вот так». Потому — тоже в помойку.
3) Наиболее здоровым вариантом для начинающего считаю процесс создания ПО под конкретный МК, полученные навыки позволят разобраться и с 8L и 32 сериями (хоть это и больно делать единолично по документации).
Вы наверно заметили, что arduino в этом списке не фигурирует, потому что это образовательная платформа и для разработки на её базе компактных устройств не предназначена. Но подход к её программированию по какой-то (мне не известной) причине переносится и расползается по интернету. И даже применяется в реальных коммерческих проектах. (представляет собой, «скачал на форуме библиотеку, подключил, заработало, как работает не знаю»).
Я же предлагаю, с моей точки зрения, академически и методически более осмысленный подход.
1. Выбор микроконтроллера
У меня в наличии имеется несколько STM8S105K6 в корпусе LQFP32, он из этого семейства, потому выбираю его.
Вы можете выбрать любой МК в пределах серии.
Есть готовые Discovery платы от ST, можно купить у китайцев или заказать с других ресурсов. Есть готовые платы на STM8S103F3P6 и ей подобные от китайцев.
Но, следует учесть, что готовые платы предназначены для обучения.
На сайте производителя st.com, находим свой МК и скачиваем к нему документы:
Reference manual: RM0016 — общий документ для всех МК семейств STM8S и STM8AF. Далее RM.
Datasheet: У меня DS5855 — документ к моделям STM8S105C4/6, STM8S105K4/6 и STM8S105S4/6. Далее DS.Из вкусного у него (поверхностно):
- Поддержка 16 МГц
- 32 Кб Flash памяти, 1 Кб EEPROM и 2Кб RAM
- Питание 2.95-5.5В
- 8-и 16-битные таймеры
- UART, SPI, I2C
- 10-битный АЦП
- до 38 дискретных входов/выходов
2. Необходимое оборудование
Я вижу два варианта работы с МК:
Здорово, классно, мне нравится. Так делают многие люди.
В этом случае для МК нужна будет так называемая обвязка. План простой:
- Берем макетную плату, в моем случае TQFP(32-64PIN)0.8MM, запаиваем на неё МК
- Берем двухрядную гребенку PLS-2×40 припаиваем к отверстиям, которые ведут к выводам МК
- Берем печатную макетную плату (у меня 9х15 см) и припаиваем на нее прошлый бутерброд
- Смотрим RM пункт 7. Power supply, читаем. Написано нужен конденсатор соединяющий вывод VCAP и наши 0В источника питания. Еще написано, что подробней в смотреть нужно в DS к конкретному МК в секции electical characteristics. Для меня это пункт 10.3.1 VCAP external capasitor со ссылкой на Table 18 где и указан номинал 470 — 3300 нФ. Я взял 1 мФ (на схеме C3). (для чего он нужен, надеюсь, почитаете сами в RM)
- Там же в DS в пункте 10.3.8. Reset pin characteristics находим номинал конденсатора 0.1мФ(на схеме C4). Резистор R4 номиналом 10 КОм используют в отладочных платах и различных application note, хотя внутри МК уже есть подтягивающий резистор номиналом от 30 до 80 КОм (если верить тому же DS). Параллельно конденсатору C4 ставим нашу кнопку сброса. Такую схему сброса можно увидеть например в Desighn note DN0005.
- Также, ST любят добавлять на отладочные платы конденсаторы по питанию на 100нФ, в количестве N выводов подключенных к питанию +1. На схеме нарисовано всего C1, C2 и C5 3 шт, и на плату я их не паял, но смысл вы поняли. На столе работать будет и без них, а в реальной коммерческой разработке лучше этим делом озаботиться при разведении платы устройства.
- Распаять SWIM разъем программирования (я делаю из PLS-1×40)
Здорово, классно, мне нравится. Так делают многие люди.
Стоит ознакомиться с конфигурацией платы, если это плата от ST, то она сразу с программатором и подключается USB type B кабелем. На сайте ST будет схема на странице продукта. На плате будут кнопки, светодиоды, пищалки, ёмкостные кнопки и прочие прелести с которыми можно поиграться.
Если плата китайская, то часто платы без программатора, то нужен будет программатор.
Шелкографии названий выводов лучше не верить и перепроверить сравнив с DS.
Плюс нужен программатор, у меня китайский ST-Link V2. Умеет программировать и STM8 и STM32.
3. Выбор IDE
Для меня вопрос выбора пока не актуален, работаю в IAR для STM8, ибо в ней делали проект над которым я сейчас работаю, по той же причине старая версия.
Идем на сайт iar.com, в поиске набираем модель своего МК.
Скачиваем IAR Embedded Workbench for STM8, выбираем при установке size-limited evaluation и миримся с ограничением в 8 Кб кода. Или покупаем. Есть на запрещенных на территории РФ ресурсах взломанные версии, но для коммерческих проектов не годится.Инструкция по установке есть в самом установщике либо в гугле.
Я использую версию 6.5.3.2581.
Устанавливаем среду, вместе с ней драйвера на программатор.4. Создание проекта
Заходим в IDE, идем Project -> Create new project -> C++
Жмем OK, выбираем директорию (желательно не имеющую кириллицы и пробелов), выбираем имя (без пробелов и кириллицы).
Идем в корневую папку своей IDE и находим папку inc, для меня путь:
Находим среди заголовочных файлов iostm8 свою модель МК, для меня:
Подключаем её в самом начале и добавляем бесконечный цикл.
В меню Project -> Options -> General Options в графе Device выбираем свой МК.
В Project -> Options -> Debugger в графе Driver выбираем ST-LINK.
Находим на панели инструментов кнопку Download and Debug.
При первой компиляции среда попросит выбрать имя .eww файла. (Я называю так же как и проект.)Внизу в окне Debug Log должны быть сообщения, что:
- Preprocessor for STM8 — запустился препроцессор
- Debugger for STM8 — запустился отладчик
- Connected to STM8 SWIM Debugging system — произошло подключение к МК
- Loaded debugee — произошла загрузка прошивки
- Target reset — произошел сброс
Нажимаем Stop debugging, отладка прекращается, но МК питается от программатора и дальше выполняет программу, а именно крутит бесконечный цикл и делает ничего.
Итоги
Получился краткий обзор и вводная в программирование МК серии STM8S без самого программирования. Получилась только база для работы, с этого обычно все и начинается — со сборки макета.
Раскрывать тему подробней смысла не вижу.
Во многих статьях уже после введения, буквально через пару строчек мигают светодиодами, что мне не понятно.
Насколько выполнены цели судить можно будет по тому, получилось ли у начинающего что-то сделать самостоятельно, используя предложенную мной информацию. (индикатор окно Debug log)
Bare metal programming: STM8
This article will cover developing for STM8 series of microcontrolles completely from scratch, without using any vendor-supplied libraries.
Preface
STM8 is a cheap 8-bit microcontroller aimed towards low-cost mass-market devices. Initially I came across this part while searching for a simple microcontroller as a replacement for AVRs. Despite having various ARM Cortex-M0 devices available on the market for quite attractive prices, AVRs have one advantage — simplicity. Utilizing an ARM Cortex core to switch some lights on and off seems like an overkill. Some applications just don’t require that amount of flexibility and performance.
The main goal of this article is to demonstrate that ‘bare metal’ programming is not a difficult task and to give you an overview of STM8’s architecture and peripherals. Even though writing peripheral drivers from scratch might seem like reinventing the wheel, in many cases it is easier and faster to implement the functionality that you need for a specific task, instead of relying on vendor-supplied libraries that try to do everything at once (and fail).
Contents:
The Hardware
There is a number of ways to start working with STM8. The easiest one is to get a Discovery board, although I wouldn’t recommend it, since STM8 Discovery boards aren’t that good and the on-board ST-Link v1 firmware just sucks.
Instead, I’ll opt for the minimalist approach. All you need is an ST-Link v2, STM8S003F3 and a breakout board. STM8S003F3 comes in a handy TSSOP20 package which is very easy to solder.

Note: a 1uF capacitor on VCAP pin is required for the processor to operate.
Setting up toolchain
The biggest downside is that STM8 processors are not supported by GCC. There are 3 commercial compilers available for these processors: Raisonance, Cosmic and IAR. Some of these compilers have free versions with code size limit, but none of them are available for linux. Luckily, SDCC supports STM8 and that’s what we’re going to use. SDCC is being actively developed, so I suggest trying the latest snapshot build instead of the stable version. To program the microcontroller we’ll be using stm8flash. The first step is to download all the necessary tools:
Extract SDCC under
/local/sdcc. Now extract stm8flash, build it with make and copy stm8flash binary to
/local/sdcc/bin. I prefer to keep flasher with compiler for convenience. Next, add the following line to your .bashrc file (replacing username with your user name):
If everything was done properly, you should be able to run sdcc —version . The last remaining thing is to write udev rule for ST-Link programmer. Create a file /etc/udev/rules.d/99-stlink.rules :
Finally, run udevadm control —reload-rules && udevadm trigger as root. Now we’re all set and ready to start.
It’s all just memory..
Before we begin, let’s take a simple example of accessing port register on ATmega and see what’s going on under the hood:
Typecasting integer to a pointer is a valid operation in C. If you don’t quite understand what is going on with pointer arithmetics then here’s another example for you:
The only difference is that in the first example we know exactly which address in memory we are going to use. It’s important that you understand what’s going on here, since we’re going to use this mechanism for accessing hardware registers later on.
First program
These are the two most important documents: datasheet and reference manual. We’ll use the datasheet for the pinout and register map. Everything else is present in the reference manual: peripheral operation, register description, etc. Let’s begin by opening the GPIO section of the reference manual and taking a closer look at PORTD registers.

These registers are pretty much self-explanatory but just in case, here’s a brief overview: DDR is the direction register, which configures a pin as either an input or an output. After we configured DDR we can use ODR for writing or IDR for reading pin state. Control registers CR1 and CR2 are used for configuring internal pull-ups, output speed and selecting between push-pull or pseudo open-drain.
First, let’s define a macro that we’ll use later on for register definitions. Base address for all the hardware registers is 0x5000 so we can hardcode that into our macro.
Now let’s try blinking an LED. For this task we need to define ODR , DDR and CR1 registers for PORTD. We also need a delay function.
Save this in main.c and compile by running the following command:
Now attach st-link and flash the microcontroller.

Congratulations! We’ve just written our first program from scratch.
Note: some of the STM8 pins are labeled with (T) in the datasheet. These pins are ‘true’ open-drain and can only pull to ground. You should be extra careful when working with open-drain pins, since there are no protection diodes. I managed to accidentally blow PB5 by using it as a normal GPIO, which took me hours to figure out when my I2C code wasn’t working. One way of checking whether the pin is dead or not is by setting the multimeter in diode mode and measuring the voltage drop between the pin and ground — it should be roughly 0.7V in one direction.
Peripheral drivers
After toggling some IO pins the first thing that you should get up and running on a new platform is UART. It makes debugging much easier. As always, we begin with register definitions.
Usually, in order to initialize UART one has to calculate baud and write the resulting value into the corresponding HIGH and LOW registers. Let’s see how this is done in STM8.

So.. you get a 16-bit value and you write the first nibble [15:12] into BRR2[7:4], then you write bits [11:4] into BRR1 and finally you write the remaining bits [3:0] into BRR2[3:0]. Seriously, what were they thinking? Why couldn’t ST just implement BRR_HIGH and BRR_LOW for the sake of it? All this bit-fiddling just seems unnecessarily complicated.
Anyway, let’s move on to initialization. We’ll stick with the default 8 data bits, 1 stop bit and no parity. Since our master clock is 2MHz, for baud = 9600 we have UART_DIV = 2000000/9600 = 208 (0xD0). According to the bizarre diagram above, we end up with BRR1 = 0x0D and BRR2 = 0x00. One thing to keep in mind is that BRR2 register must be written before BRR1. Finally, we turn on receiver and transmitter in Control Register 2. Read and write functions are pretty straight-forward: you read/write the Data Register and wait until the appropriate bit in Status Register is set.
Redirecting stdout is easy with SDCC.
Now we’re all set and we can use printf() for debugging.
Next, we implement SPI master. SPI is quite an easy peripheral and is usually implemented as a simple shift-register in hardware. We need to define only 4 registers to start working with SPI.
Let’s implement initialization and read/write functions. Reading from SPI is achieved by writing a dummy byte, so we’ll hardcode SPI_write(0xFF) inside our SPI_read() function. Chip select pin will be managed in software.
To test our implementation I’ve written a simple loop that transmits some data.
Let’s hook up the logic analyzer and have a look.

Hmm.. something is wrong. It seems that we release chip select too early and the last byte will not be received by a slave device. This can only occur if the SPI peripheral didn’t have enough time to finish transmitting before we released CS pin.
That wasn’t supposed to happen — we are polling for TXE bit, aren’t we? Well, the problem is that TXE only indicates that Tx buffer is empty. It doesn’t tell us that all the bits were shifted out by the shift register. So in order to properly end the transmission we have to check for BSY flag, which tells us whether or not SPI has finished an operation. Let’s modify our chip_deselect() function to take that into account.

Our final test is the good old “Nokia 5110” LCD. Complete source is on github.

Now let’s get onto something more serious. I2C usually requires a bit more work to get it up and running comparing to SPI and UART. I2C has a lot of associated registers, so I will no longer list them from this point. You can find a header with register definitions here.
Let’s take a look at what the reference manual says about receive and transmit operations.
That does seem quite complicated: a lot of events are generated during communication. However, we don’t have to explicitly take care of every single event in order to have a working communication — some of the events are automatically cleared by hardware and some may just be ignored and left unattended. We’ll go with the easiest implementation.
We start by implementing initialization and IO functions. We also need dedicated functions to generate start and stop conditions.
According to the reference manual, writing slave address is a special case so we can’t simply use i2c_write() to do that. We need a dedicated function for this purpose.
Reference manual says we are supposed to to handle EV6 event after writing slave address: “EV6: ADDR=1, cleared by reading SR1 register followed by reading SR3”. After polling for ADDR bit we simply read SR3 register. I’m not sure why this is required, probably to check for BUS_BUSY, but that seemed a bit pointless so we cheated a little.
Now, let’s test our library with an HMC5883L magnetometer. First we define R/W flags and some magnetometer related stuff:
We’ll implement a simple function that reads the device Id and sends it over UART.
All seems to work fine, but let’s take a look at the logic analyzer just to make sure.

Hmm.. we do receive correct bytes, but what’s the deal with that 0xFF received right after the NACK? It seems that something is wrong with our code. Time to RTFM.
The Proper Way
So the first problem is how we generate STOP condition. According to the documentation, we are supposed to generate STOP before reading the last byte. I changed the code but it didn’t fix the problem. The real problem was that I was porting the magnetometer driver which I wrote for a different microcontroller, so I expected the I2C peripheral to work in a certain way. Well, I was wrong.
The i2c_read() function is supposed to receive only 1 byte of data. It turns out there are 3 different scenarios for N=1, N=2 and N>2, where N is the number of received bytes. We can’t simply use the function for N=1 to read more than a single byte. That means we need separate functions to handle each case! I wonder how many logic gates were dedicated to implement I2C peripheral on this MCU… (Note: I2C implementation on STM32F1xx series is actually identical to STM8.)
Looking at the reference manual I figured that we could possibly combine N=2 and N>2 cases and handle them with a single function. Below are proper implementations of I2C receive functions.
Now let’s update our code for reading device Id.
Note that our i2c_read_buf() function generates STOP so we no longer have to call i2c_stop() manually. Let’s take a look at the logic analyzer now.

Great, no 0xFF at the end! Now we’re ready to move onto something different.
Nothing exciting about the ADC on STM8: 10-bit resolution, single and continuous conversion modes, configurable prescaler.. all the usual boring stuff. There is also a data buffer that can hold a number of ADC samples, which is rather convenient.
The default printf() implementation provided by SDCC does not support floats. To enable floating point output, printf_large.c needs to be recompiled with -DUSE_FLOATS=1 option. For this example we are going to cheat and print the results in millivolts instead. Without further ado, let’s write some code for single ADC conversion.
Pretty straight forward. Note that EOC flag has to be manually cleared by software.
A few things that should be taken into account when working with ADC:
- The order in which DRL and DRH registers are accessed depends on data alignment.
- ADC has no internal voltage reference. STM8S003 does not have an external Vref pin, so it is tied to Vcc internally, which means that your supply voltage has to be spot-on for any serious measurements.
- Data buffer registers have no internal locking. ST provides an assembly snippet in the datasheet for reading buffer registers.
Timers and interrupts
You can’t get far without using timers and interrupts, which is what this last section will cover. STM8S003 has 16-bit ‘advanced control’ as well as 8-bit general-purpose timers. TIM1 is a really complicated peripheral with 32 dedicated registers, and covering it’s functionality would probably require a few extra articles. For this article, we’ll use TIM4 which is good enough for basic applications.
There isn’t much to tweak inside TIM4: it contains an 8-bit auto-reload up counter, 3-bit prescaler and an option to generate interrupt on counter overflow.
The prescaler divides counter clock frequency by a power of 2 from 1 to 128 depending on PSCR registers:
In this example we are going to toggle a pin each time the counter matches value in the ARR register. The frequency of the waveform generated by our IO pin is calculated as follows:
To achieve a frequency of 100Hz ARR has to be set to 77, given that our clock frequency is 2MHz. We need to enable Update Interrupt for TIM4 , but before that interrupts must be enabled globally by executing rim instruction.
Now, when I said that we’re going to implement everything from scratch, I wasn’t completely honest. We’re still using some start-up code which initializes the stack and interrupt vector table. If you look at the listing you can see that SDCC has generated the interrupt table for us:
Registering an interrupt handler is easy with SDCC: there is a special attribute _interrupt() which takes interrupt number as a parameter. Section 7 (‘Interrupt vector mapping’) of the datasheet describes which IRQ number corresponds to which peripheral. For TIM4 it is 23. Our interrupt handler will look like this:
Putting it all together
We have enough building blocks — now it’s time to put them together into some ‘real-world’ application. For this demo I picked up MMA8452 3-axis I2C accelerometer and a standard HD44780 1602 LCD, which is extremely popular among electronics enthusiasts for some reason.
The demo application will calculate inclination angle based on accelerometer readings and output it to the LCD. Calculating inclination angle will require some trigonometry and floating point arithmetic, which will consume a good amount of resources. Despite the floating point operations being quite slow, STM8 managed this task decently.

You might have noticed the lack of contrast adjustment potentiometer. The LCD module that I’m using is rated for 5V, however my setup uses 3.3V supply. I couldn’t be bothered with a separate supply for the display, so I cheated: the LCD is initialized in 1-line mode, which results in 1/8 duty cycle, and Vo pin is tied to ground.
Conclusion
STM8 is nice and cheap, but it is really hard to justify using this microcontroller, especially given the fact that price difference between STM8 and low-end Cortex-M0 devices like STM32F03 is negligible. The biggest downside for me was lack of GCC support. Despite SDCC being a reasonably good compiler, it does not fully support C99 and C11 standards, which means that I have to refactor most of my existing code to make it compatible. Code optimization isn’t great either, which is a shame, since most STM8 microcontrollers don’t have a lot of flash to spare.
STM8 — программирование, прошивка и всё-всё-всё
Наряду с Arduino у любителей микроконтроллеров сейчас популярна и линейка продуктов от компании STMicroelectronics, включающая 8-разрядные микроконтроллеры STM8 и 32-разрядные микроконтроллеры STM32 (на ядре Cortex).
Микроконтроллеры STM8 состоят из нескольких линееек:
STM8S — основная линейка,
STM8A — для автомобильной промышленности,
STM8L — со сверхнизким потреблением энергии,
STM8T — емкостный сенсор для детектирования прикосновения или приближения.Отладочную плату с микроконтроллером STM8 на борту можно приобрести за 1 (!) доллар и даже дешевле. Я приобрел несколько таких плат на основе микроконтроллера STM8S103F3P6 на торговой площадке ebay:

контакт назначение D4 PD4 / UART_CLK D5 PD5 / TX D6 PD6 / RX RST сброс A1 PA1 / Oscin A2 PA2 / Oscin GND земля 5V вход стабилизатора 3V3 выход стабилизатора A3 PA3 / SS D3 PD3 / Ain4 D2 PD2 / Ain3 D1 PD1 / SWIM C7 PC7 / MISO C6 PC6 / MOSI C5 PC5 / SCK C4 PC4 / Ain2 C3 PC3 B4 PB4 / SCL (шина I2C) B5 PB5 / SDA (шина I2C) Микроконтроллер STM8S103F3P6 содержит 8 КБайт флэш-памяти с ресурсом стирания 10 000 раз, 640 байт EEPROM и 1 КБайт RAM. Тактовая частота 8-битного процессора серии STM8S составляет 16 МГц.
Для питания платы можно использовать следующие варианты:
- подключение источника напряжением 4,5 . 15 В к контактам + или 5V и — или GND;
- подключение кабеля к microUSB-разъему (этот разъем используется только для питания!);
- подключение источника питания напряжением 3,3 В к контактам 3V3 и — или GND.
На плате установлен стабилизатор AMS1117-3.3. Вход стабилизатора соединен с контактом 5V, а выход — с контактом 3V3.
Использование компилятора SDCC
При разработке под микроконтроллеры STM8 можно использовать открытый (под лицензией GPLv3) набор компиляторов SDCC (Small Device C Compiler suite) языка программирования ANSI C под множество архитектур — от Intel 8051 до STMicroelectronics STM8. Версии под различные ОС — Windows, MacOS, Linux — (текущая новейшая стабильная версия — 4.0.0) доступны на http://sdcc.sourceforge.net.
Пишем код программы в файле TST.c:
Выполняем компиляцию программы командой
При компиляции создается hex-файл TST.ihx:

Для прошивки платы я приобрел на торговой площадке ebay программатор ST-LINK V2:
При первоначальном подключении к USB-порту компьютера программатор определяется как «неизвестное устройство» с VID 0483 и PID 3748:
На сайте ST доступен драйвер для программатора — STSW-LINK009:
После его установки при повторном подключении программатор распознается как «устройство USB«:
Разъем программатора имеет 10 контактов:
Номер Название Назначение 1 RST сброс 2 SWIM SWIM-интерфейс (для STM8) 3 GND земля 4 3.3V + 3,3 В 5 5.0V + 5 В 6 SWCLK синхронизация (SWD-интерфейс, для STM32) 7 SWDIO данные (SWD-интерфейс, для STM32) 8 GND земля 9 3.3V + 3,3 В 10 5.0V + 5 В 
Для подключения программатора к плате я использую 4 контакта на разъеме программатора и на плате — 3.3V(3V3), SWIM(SWM), GND, RST(NRST):
При общении программатора с платой используется коммуникационный протокол SWIM (через однопроводной интерфейс — контакт SWIM).
Для прошивки я использую утилиту stm8flash, для запуска которой следует выполнить команду:
Бинарная версия проекта для ОС Windows (можно взять здесь) содержит два необходимых файла:
stm8flash.exe — исполнимый файл
libusb-1.0.dll — библиотека для доступа к USB-устройствамПосле запуска утилиты она выполняет прошивку программы в память и отчитывается о числе записанных байт:

После прошивки указанной выше программы мигания светодиодом он начинает мигать с периодом около шести секунд.


Прошивка программатора может быть обновлена с помощью утилиты, доступной для скачивания на сайте ST — STSW-LINK007:
После запуска приложения (для Windows — ST-LinkUpgrade.exe) необходим присоединить программатор к USB-порту компьютера, нажать кнопку Device Connect — при этом отобразятся текущая версия прошивки программатора (Version) и его тип (Type), а также версия, до которой можно обновить прошивку (Upgrade to Firmware). Для запуска процесса обновления прошивки необходимо нажать кнопку Yes>>>>.
Работа в редакторе Visual Studio Code
Для написания исходного кода программы, а также для автоматизации процесса компиляции и прошивки удобно использовать бесплатный редактор Visual Studio Code от компании Microsoft (страница загрузки).
Вот как выглядит исходный код программы в Visual Studio Code:

Для удобства работы следует создать папку (например, sdcc), в которой будут располагаться файлы проектов для STM8. Затем следует добавить эту папку в рабочую область. В эту же папку помещаем файлы:
-
compile.cmd — с содержимым: c:/sdcc/bin/sdcc -mstm8 —std-c99 %
В этой папке следует создать папку .vscode, в которой разместить файл tasks.json с таким содержимым:
Этот файл описывает две задачи:
- compile — компиляция текущего открытого файла с исходным кодом (с расширением .c)
- flash — прошивка скомпилированного ранее hex-файла (c расширением .ihx)
Выбирая соответствующую задачу («Задачи» > «Запустить задачу. «)
можно запустить:
компиляцию
прошивку
Полезные подсказки
задание базовых адресов портов:
установка режима порта (DDR — регистр направления порта):
настройка вывода N порта X (PXN) на выход
настройка вывода N порта X (PXN) на вход
вывод (ODR — регистр выходных данных):
установка вывода N порта X (PXN) в состояние «1» :
установка вывода N порта X (PXN) в состояние «0» :
подключение заголовочных файлов

Вот как выглядит собранная схема из микроконтроллера, USB-UART преобразователя и программатора:
(1/16000000)*65536*предделитель = интервал в секундах
10 секунд = 2441 0x0989Необходимо задать номер канала АЦП, соответствующего используемому входу (например, вывод D2 — канал 3).
Напряжение можно определить умножением считанного из АЦП значения на VCC/1023, где VCC — напряжение питания на шине 3.3V.
Например, при подключении к входу 3.3V STM выхода 3.3V преобразователя USB-UART напряжение на нем составило 3,24 В. При этом масштабный коэффициент равен 3,24/1023 = 0,00317 В.Пример простейшего проекта, мигающего светодиодом
Разработка в среде IdeaSTM8
Установка среды разработки

Для программирования под микроконтроллеры STM8 можно использовать среду разработки IdeaSTM8 от компании Cosmic Software (в версии CXSTM8 special edition package — доступна с марта 2016 года, не имеет ограничений):

Для загрузки дистрибутива следует перейти по этой ссылке: http://cosmicsoftware.com/download_stm8_32k.php.
При этом для использования кросс-компилятора от Cosmic Software перед скачиванием необходимо пройти регистрацию, указав имя (Name), название компании (Company), страну (Other), адрес электронной почты (E-mail), а затем нажав для отправки сведений кнопку «Submit».
В версии 4.4.6 объем дистрибутива (cxstm8_FSE_stm32_32K.exe) составляет 20,7 МБайт.
Для получения годовой (затем продляемой) бесплатной лицензии при инсталляции необходимо нажать кнопку «Register on the Web», что приведет к отправке файла лицензии на адрес электронной почты, указанный при регистрации. Лицензия привязывается к компьютеру, на котором установлен компилятор (с помощью HOSTNAME, HOSTID и т.п.).
После получения файла license.lic следует разместить его в папке \COSMIC\FSE_Compilers\CXSTM8\License:В качестве примера создадим программу мигания светодиодом (Hello, world! в мире микроконтроллеров) TEST, размещенным на плате и подключенным к контакту PB.5.

Создаем новый проект, выполняя команду New Application:

Выбираем в качестве целевой платформы микроконтроллер STM8S103F3:
Копируем в папку проекта заголовочный файл с определениями stm8s.h, предварительно раскомментировав в нем определение используемого микроконтроллера STM8S103:
Создаем новый файл (tst.c) с исходным кодом:

создаем файл:

выбираем в качестве типа файла — файл с исходным кодом на C:

Добавляем созданный файл в проект:
Пишем код программы в созданном файле:

Для компиляции и сборки проекта следует нажать клавишу F7 или выполнить команду Build:
В результате сборки в папке проекта создается файл с именем проекта и расширением .sm8 (TST.sm8).
Для преобразования файла с расширением .sm8 в готовый для прошивки в микроконтроллер hex-файл я использую COSMIC Software Hexa Translator (chex.exe) с помощью команды:
где TST — имя проекта.
Полученный hex-файл (TST.hex) содержит информацию, необходимую для прошивки микроконтроллера:
Для прошивка этого файла в память микроконтроллера можно использовать описанный выше программатор ST-LINK V2.
Мои проекты на STM8
Преобразователь PS/2 — UART
Преобразователь для проекта cpm4nano позволяет подключать PS/2-клавиатуру через последовательный порт (UART).
Дистанционно управляемая аэролодка
Микроконтроллер STM8 принимает сигнал ИК-пульта и управляет движением модели аэролодки.
Каждый проект состоит из трех поддиректорий:
Итак, копируем папки «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. Создание нового проекта
Структура проекта состоит из следующих директорий:
Далее нам необходимо выбрать в свойствах проекта программатор-отладчик, Си-инструментарий, тип микроконтроллера, прописать пути к файлам, если они не указаны. Эти операции описывались выше.
Для использования библиотеки стандартной периферии необходимо убедиться, что в основном файле проекта «main.с» был подключен файл «stm8s.h» (#include <stm8s.h>), который содержится в директории «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), ползунков (до двух) и колец (до двух):

Рис. 9. Конфигурирование сенсорной библиотеки