company_banner

Начинаем писать под stm8, выбираем среды разработки и стартуем

  • Tutorial
image

На пути в программировании stm8 есть развилка, о ней сегодня и поговорим.

Определимся что речь будет идти о средах которые могут писать под си. Для начала поговорим о подходах, я выделю 2 основных.

Первый установка ST Visual Develop и выбор в качестве компилятора COSMIC Бывший платный, а ныне бесплатный, но со своими заморочками; регистрация, получение ключа, и прочие танцы с бубном.

Второй же вариант, более простой VS Code + PlatformIO и компилятор SDCC полностью свободный. И опять же не все так просто. Sdcc не умеет исключать не используемые функции. Я решил этот вопрос хоть и успешно, но не без дополнительных действий при написании кода.

Первая среда, для любителей всё делать правильно


Для начала нам нужен ST Visual Develop. Устанавливаем и ставим запуск ярлыка всегда от администратора. В придачу к нему нам дают ST Visual Programmer, полезный инструмент, особенно когда стоит защита от записи и надо разблокировать микроконтроллер, а ведь китайские blue pill всегда приходят заблокированными. Китайцы бояться что мы украдём их круто оптимизированный Blink.

Вот так выглядит STVD
image
Я так понял её создали, когда в моде были 16 битные цвета...

Дальше нужно будет получить компилятор COSMIC и его лицензионный ключ. Заполняем то что просят, получаем дистрибутив и делаем запрос ключа по электронной почте (тут рулетка кому то сразу придёт, кому то придётся подождать).

После пройденного лабиринта из форм и запросов, когда всё уже установлено, начнём
image
image
При первом запуске нужно указать расположение ключа, его лучше поместить в директорию компилятора. После создания нажимаем F7, ошибок быть не должно. Если писать на чистых регистрах, то всё готово, но я такой хардкор не люблю, поэтому продолжим и добавим SPL библиотеку.

Распакуем куда-нибудь и заходим в папку STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Template. Тут у нас шаблон проекта stm8s_conf.h — это конфигурационный файл библиотеки, через него выбирается контроллер. Зайдём в main тут сразу с первых строк #include "stm8s.h" это ссылка на основную библиотеку, а так же кусок кода отладки который начинается с #ifdef USE_FULL_ASSERT, без отладочного кода будут сыпаться ошибки.

Теперь когда мы прошлись по верхам давайте пробовать запускать библиотеку. Добавляем в проект из шаблона main и конфигурационный файл в. В include files добавляем всё из STM8S_StdPeriph_Lib\Libraries\STM8S_StdPeriph_Driver\inc.
image
Теперь всё должно собраться.

Добавим stm8s_gpio.c и соберём простецкую мигалку. У меня один из светодиодов висит на D3, конфигурация ноги на выход выглядит так:

GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW);

Её вписываем в main до бесконечного цикла.

А вот функция смены состояния. GPIO_WriteReverse(GPIOD, GPIO_PIN_3); вписываем её в бесконечный цикл.

Но вот незадача, в SPL нету функций задержки, скопипастим из примера GPIO в библиотеке. Там она выглядит следующим образом.

void Delay(uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}

Впишем её в конец перед #ifdef USE_FULL_ASSERT. Так же впишем её прототип в начало, где под это выделено место в шаблонном main.

/* Private function prototypes -----------------------------------------------*/
void Delay (uint16_t nCount);

Ну и наконец впишем функцию со значением в бесконечный цикл после функции смены состояния: Delay(0xFFFF);

Подключаем ST-Link и прошиваем, для этого нажимаем Start Debugging и Run. Светодиод моргает значит всё хорошо.

У кого не получилось вот полный main.c
/**
  ******************************************************************************
  * @file    Project/main.c 
  * @author  MCD Application Team
  * @version V2.3.0
  * @date    16-June-2017
  * @brief   Main program body
   ******************************************************************************
  * @attention
  *
  * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */ 


/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void Delay (uint16_t nCount);
/* Private functions ---------------------------------------------------------*/

void main(void)
{
GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW);
  /* Infinite loop */
  while (1)
  {
	GPIO_WriteReverse(GPIOD, GPIO_PIN_3);
    Delay(0xFFFF);
  }
  
}

void Delay(uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}

#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


Теперь посмотрим со стороны на эту среду.

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

Вторая среда, для тех кто не любит заморачиваться.


Второй подход — это свободный и обновляемый компилятор SDCC, а так же среда PlatformIO.

Для начала установим VS Code и станем рабами Microsoft, далее найдём расширение PlatformIO.

image

Ждём пока миллион ползунков пройдёт до конца и перезапускаем программу. Открываем расширение (может быть и само откроется). Создаём новый проект и выбираем ближайшую плату с stm8s (микроконтроллер можно будет изменить в конфигурационном файле). В качестве фреймворка выбираем SPL мы же не ардуинщики, нас интересует хардкор.

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

Разберем поподробнее среду разработки. Во первых весь проект должен лежать в src, иначе среда ведёт себя неадекватно. Во вторых открываем stm8s_conf.h и видим что все библиотеки кроме GPIO закомментированы, если этого не сделать то у мк не хватит памяти что бы поместить весь SPL в микроконтроллер (помните в начале я говорил что он загружает все функции что видит в код?).

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

/* Private define ------------------------------------------------------------*/
#define _GPIO_DeInit
#define _GPIO_Init
#define _GPIO_WriteReverse
#define _CLK_DeInit
#define _CLK_SYSCLKConfig
#define _TIM4_DeInit
#define _TIM4_ITConfig
#define _TIM4_ClearITPendingBit
#define _TIM4_Cmd
#define _TIM4_TimeBaseInit
#define _TIM4_ClearFlag
#define _HAL_GPIO_WritePin
#define _GPIO_WriteLow
#define _GPIO_WriteHigh
//#define STM8S003
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

/* Uncomment the line below to enable peripheral header file inclusion */
#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) ||\
    defined(STM8S001) || defined(STM8S903) || defined (STM8AF626x) || defined (STM8AF622x)
// #include "stm8s_adc1.h" 
#endif /* (STM8S105) ||(STM8S103) || (STM8S001) || (STM8S903) || (STM8AF626x) */
#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF52Ax) ||\
    defined (STM8AF62Ax)
// #include "stm8s_adc2.h"


Каждую функцию я включаю через макрос, для этого у меня переписана большая часть SPL. Если вам оптимизация сильно не нужна, то такой упоротостью можете не заниматься.

Пройдёмся по преимуществам: работает почти из коробки, полностью бесплатно без попрошайничества, редакции языка обновляются и не придётся учить и переписывать код под си 80-90г. Сам интерфейс настраиваемый и намного приятнее. Для тех кто не любит win есть linux версия.

По минусам: нету полноценной отладки (над ней активно работают, но пока ничего приближённого к cosmic я не видел), в проекте небольшой хаос, раскидать по папкам пока нельзя.

Послевкусие.


Ну и на последок есть ещё среды, варианты и компиляторы, но либо это тот же SDCC вкрученный силой в Eclipse или ещё куда и работающий хуже чем в VS Code, либо это платные варианты IAR, Raisonance. Я лично пользуюсь и тем и тем, но чаще VS Code. Рекомендовать ничего не буду каждому своё, увидимся в комментариях)

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

Интересует углублённое изучения программирования stm8?

  • 12,6%Да. Хочу писать на ассемблере.11
  • 14,9%Да. Хочу писать на регистрах.13
  • 20,7%Да. Интересует библиотека SPL.18
  • 8,0%Только ардуино, всё остальное не интересует.7
  • 40,2%Только STM32, всё остальное в топку.35
  • 3,4%Не люблю микроконтроллеры.3
RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Комментарии 23

    +2
    Мой вариант: любой удобный редактор, патченая библиотека, всё тот же компилятор sdcc, и прошивальщик stm8flash. Для сборки использую идущий с библиотекой Makefile, переделав под себя.
    Проблема с неиспользуемыми функциями, конечно, мешает, поэтому многие куски SPL переписал сильно упростив. Отсутствие отладчика печалит, но для домашних поделок сойдёт.
      +3
      Я без отладчика даже с домашними поделками уже совершенно не желаю возиться :)
        0
        Я убрал assert полностью, сделал активацию функций макросами, остальное не трогал.
        0
        >Начинаем писать под stm8

        так то уже заканчивать пора писать под stm8…
          0
          Простые проекты мне удобнее делать на stm8, а то что там много 5v контроллеров добавляет удобств.
            +1
            Так вы и не начинаете. Не холивара ради, но новичку, знающему на старте максимум диодомигательную ардуйню, но морально готовому потратить ближайшие полгода-год на глубокое изучение некой архитектуры Х, честно не очень понимаю, в чем смысл начинать изучение с чего бы то ни было, кроме кортексов, т.к. это позволит сразу решать любые задачи, и простые, и сколь угодно сложные. При этом, порог полноценного вхождения в те же аврки или стм8 не намного ниже.

            А уж инвестировав тонну времени в изучение архитектуры, способной решать любые задачи, изучать нишевые архитектуры, которые даже по экономике не приносят казалось бы очевидного выигрыша, это уже как-то лениво что-ли… (все эти аргументы про 5 вольт, DIP-корпуса, EEPROM на борту — уже не убеждают, и контрятся отсутствием очень много чего ещё). Да, сразу оговорюсь, что речь про партии устройств до 1000 штук: всё, что выше, там уже и каждые 10 р. цены могут зарешать.

            По мне это примерно как в 2021 году начать осваивать программирование с какого-нибудь perl или ruby on rails: если инструмент уже освоен, то почему нет, работать будет, но в 2021 именно с этого начинать — зачем, мягко говоря, непонятно.
              +1

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

                +1
                Если речь о Arduino, то чем дольше на нём сидеть тем сложнее будет слезть на что то нормальное. AVR без Arduino среды не чуть не легче…
                  0

                  Arduino != AVR. AVR намного легче освоить, чем stm. Да хотя бы взять систему тактирования. Можно ли в ней с первого раза разобраться? Думаю нет. У аврок же все проще — одна частота на всё: настроил таймер с помощью пары регистров, и вот уже диод мигает. Со всем остальным аналогично.

                  +2
                  но в кортексах периферия сложнее и менее документирована.

                  ой какое не корректное утверждение. кортекс это архитектура ядра, она на сложность периферии практически не влияет.

                  Периферию прикручивает конкретный производитель, например STM или Nordic. Документацию дают они же. Её сложность только в том, что она написана на английском. Возьмем тех же ST, у них мало того что reference manual есть весьма подробный (в том числе пошаговые инструкции для запуска\настройки), так ещё и куча appNote с подсказками как лучше реализовать ту или иную вещь (например начать экономить мкА перенастроив GPIO пины).

                  Основная проблема в том, что человек открывает документацию, видит 2298 страниц текста и закрывает со словами ну нафиг это все сложно, задокументировано плохо. При этом из всего это разнообразия для домашних проектов как правило посмотреть GPIO, TIMER, SPI\I2C\USART.

                  AVR легко осваивается, есть удобные среды и кучи гайдов

                  Но в этой кучи полезной информации все же мало. Опять же, принцип «бери и делай как я» это не способ
                  понять принцип работы с микроконтроллерами
                  Это быстрый способ получить работающий (если повезло) продукт и потешить свое ЧСВ, потому что весьма мало кто работая с готовыми библиотеками или гайдами вникает почему это сделано так. А вдруг сделано не правильно или не оптимально? весьма часто видишь, что вместо использования аппаратных возможностей пишут свою программную реализацию, аргументируя словами тем, что железо работает криво.

                  кучи гайдов
                  есть и для STM. Причем на любой вкус хочешь с HALом, хочешь «на регистрах» и на выбор С/С++/Asm. Так что вопрос скорее в желании потратить время на изучение.
                    +1
                    менее документирована
                    ахахахах просто в голосину! Сразу видно человека, который никогда не видел cortex-ы.

                    Серьезно? Менее документирована? 2000-3000 страниц reference manual + еще аппноуты на каждую периферию на сотню-две страниц + errata. Действительно, документации очень мало и вообще ST/NXP/Infineon/etc не дают ни полноценных IDE, ни документации, а Eclipse вообще платный!

                    что бы понять принцип работы с микроконтроллерами
                    Для этого разве не достаточно потратить пару дней, чтобы понять всю суть? Тем более, если речь о 8-ми битнике.

                    Вообще ваше предложение изучать мертворожденные архитектуры, которые еще и не имеют нормальных инструментов разработки и отладки это что-то из серии «вредные советы».

                    Если уж хочется простых архитектур, то есть MSP430, эти чипы хотя бы обладают кучей преимуществ, при этом простые, имеют нормальный инструментарий и главное — это не изучение ради изучения, а они очень активно применяются в том же индастриале.
              +2
              Не пробовал VSCode (+PlatformIO) с Stm8, но с Stm32 все, как мне кажется, более чем адекватно работает. Код можно вполне разделить на части, если есть какая-то личная библиотека, то она помещается в папку lib, нужно создать простой json с указанием расположения заголовков и исходников (или вообще разместить их соответственно в папках include/src и тогда вообще ничего делать не нужно). Отладка (говорю про stm32, поправьте, пожалуйста, если в stm8 все действительно по-другому) тоже вроде особых проблем не доставляет: watch-и можно поставить (правда, приходится часто пометить переменную как volatile), все регистры и периферия доступны, окно memory есть, пошаговое выполнение тоже, что еще нужно?
                0
                К STM32 я предпочитаю STM32CubeIDE, по отладке с stm8 всё сложно)
                  0

                  Куб из-за возможности в GUI проинициализировать всё и сгенерировать код или сама IDE нравится? Просто сейчас студента озадачил генерацией заготовки проекта из кубовского ioc, но на своем фреймворке, и вот думаю, актуально ли это.

                    0
                    Как IDE и если что то простое, то можно и сконфигурировать там, а так у меня есть проекты даже на libopencm3 в cube ide.
                      0
                      По мне так все эти бесплатные кейлы становятся всё более бесплатными не от хорошей жизни (как и смерть кукокса и иже с ним). Когда куб поглотил алкоголика, это был лишь первый шаг: с неиллюзорным переползанием основной части некорпоративного комьюнити на него, кмк, инвестировать время в изучение чего бы то ни было ещё, будет попросту чревато его потерей.
                  0
                  Как раз собирался разучить S003/S103, и Ваша статья очень в тему.
                  Спасибо
                    –1
                    Учитывая то, что из всего разнообразия свободных компиляторов лишь SDCC может работать с STM8, тут как-то не развернешься особо. SDCC почти не умеет оптимизировать код, поэтому заголовочные файлы от ST, где регистры объявляются через структуры (как у STM32), идут лесом! Я писал свое (здесь можно глянуть). Сборка посредством makefile, прошивка при помощи stm8flash. В качестве IDE сначала использовал geany, потом всецело перешел на qt-creator.
                    Но я как-то забросил восьмибитки: по соотношению цена/качество они значительно уступают STM32. Сейчас пишу все исключительно под STM32F0x2 (на крайняк — STM32F103). Естественно, никакого калокуба. Все свое. Хочу изучить STM32F303, но это когда-нибудь потом.
                      0

                      Стоит заметить что Platformio нормально работает не только с vs code, но и с другими ide. Тот же clion и visual studio. Platformio сам создаст все нужные файлики для вашей ide, если к уже созданному проекту прописать следующую команду:


                      pio init --ide idename
                        0
                        Вот читаю это, и так и хочется встать и снять шляпу перед инженерами SiLabs, где всё сделано ясно, понятно, и работает без сбоев. Чудовищно приятно, если что бы надеть шляпу не надо снимать трусы. Надеюсь следующее замечание автор воспримет как конструктивную критику — что за «фреймворк»?, что за «хочу писать на регистрах»? Вы не в Техас случайно пишете? С уважением и без иронии, спасибо автору за статью! Было интересно.
                          0
                          где всё сделано ясно, понятно, и работает без сбоев

                          из-за наличия на работе прокси-сервера так и не смог нормально использовать их IDE, так как не мог докачать недостающие пакеты. а в ручном режиме скачать их не давали, по крайней мере года 2 назад. Так что не все там ясно)
                          0
                          «Потом штурман сказал — Хватит извращений! — и закопал стюардессу» (с)
                            0
                            Да ладно в массовом сегменте до сих пор STM8 популярен, особенно у Китая. Рано ещё закапывать)

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

                          Самое читаемое