© 2024 DiyTronic

Разработка для STM8 под Linux

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

В итоге чтобы не вводить людей в заблуждение всё перепроверил и результаты выкладываю ниже. В дальнейшем планирую несколько статей по разработке на этих контроллерах. Эта статья типа вводная — как установить и настроить средства разработки.

Железо

STM8

Для подключения и дальнейшей разработки нам понадобится Даташит и Мануал

Распиновка контроллера

У меня китайский ST-LINK. Где купил — уже и не помню. Что-то типа такого StLink v2. Для состоятельных парней готовых заплатить в 10 раз больше — можно купить и оригинал Оригинальный ST-Link V2.

Мой выглядит вот так:

Для наших экспериментов достаточно подключить 4 вывода ST-LINK к соответствующим выводам контроллера.

ST-LINK ST-LINK Pin STM8 STM8 Pin
RST 1 NRST 4
SWIM 3 SWIM 18
GND 5 Vss 7
3.3V 7 Vcap 8

Компилятор

Под Linux всё, что нам доступно это компилятор sdcc. В моём ArchLinux-е стандартный пакет sdcc работал, но напрочь отказывался линковать код. Это подтверждённый баг в определённых версиях sdcc, поэтому если при линковке вы не получите на выходе файлы *.ihx, то просто попробуйте откатиться до более старой версии. Ну или до более новой — я просто скачал текущий девелоперский релиз отсюда и всё заработало.

Позже в ArchLinux нашёл пакет sdcc-svn который фактически тянет и собирает текущий код проекта. Он тоже оказался работоспособным и в конечном итоге остановился именно на нём. Я всё-таки предпочитаю использовать средства операционной системы, а не городить собственные велосипеды.

Прошивка

Выше уже написал, что для прошивки пользуюсь китайским клоном ST-LINK. Для работы с ним в Linux у нас есть проект https://github.com/vdudouyt/stm8flash, который и позволяет нам заливать прошивку в устройство.

По счастью для Arch Linux-а есть готовый пакет и руками собирать ничего не надо.

1
$ yaourt -S stm8flash-git

Как-то бы надо проверить работает ли оно вообще. Поэтому цепляем St-Link и пробуем прочитать содержимое контроллера. Но для начала на всякий пожарный пробуем его разблокировать.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ stm8flash -c stlinkv2 -p stm8s003f3 -u
Determine OPT area
Unlocked device. Option bytes reset to default state.
Bytes written: 11
$ stm8flash -c stlinkv2 -p stm8s003f3 -r test.hex
$ cat test.hex
:20800000000000000000000000000000000000000000000000000000000000000000000060
:20802000000000000000000000000000000000000000000000000000000000000000000040
:20804000000000000000000000000000000000000000000000000000000000000000000020
:20806000000000000000000000000000000000000000000000000000000000000000000000
:208080000000000000000000000000000000000000000000000000000000000000000000E0
:2080A0000000000000000000000000000000000000000000000000000000000000000000C0
:2080C0000000000000000000000000000000000000000000000000000000000000000000A0
...

Видим дамп заполненный нулями, что собственно нам и нужно.

В данном случае я в качестве устройства выбрал stm8s003f3 т. к. именно такой контроллер у меня в наличии. Полный же список поддерживаемых устройств можно посмотреть так:

1
2
$ stm8flash -l
stlux???a stm8af526? stm8af528? stm8af52a? ...

Стандартная библиотека

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

Основная проблема этой библиотеки это то, что она изначально разрабатывалась под коммерческие компиляторы и соответственно с sdcc работать не будет. Но мир не без добрых людей и нашлись умельцы, доработавшие её до полной совместимости. Но тем не менее все изменения нам придётся вносить вручную … ну или почти вручную.

Сборка вручную

Существует несколько патчей от разных умельцев. Изначально я писал эту статью 2 года назад и всё было несколько проще. Но попробовав воспроизвести написанные мной же действия понял, что слишком много воды утекло и данные устарели. Поэтому пришлось перебрать несколько вариантов прежде чем получить нужный результат. Здесь выложу только последний — успешный вариант.

Итак для начала нам нужно зарегистрироваться на сайте www.st.com. Раньше это не было обязательным, но сейчас вот оно вот так — деваться некуда. Сам я выкачать и выложить библиотеку не рискну, ибо обвинения в пиратстве мне не нужны. Придётся каждому делать это самостоятельно.

После успешной регистрации весь софт с примерами можно найти на этой странице:

http://www.st.com/en/embedded-software/stm8-embedded-software.html? querycriteria=productId=SC1807

Соответственно для STM8S ищем там STSW-STM8069 (STM8S/A Standard peripheral library).
Прямая ссылка — http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm8-embedded-software/stsw-stm8069.html
И качаем оттуда архив en.stsw-stm8069.zip.

Для работы нам понадобятся утилиты make, unzip и patch. Они уже должны быть установлены в системе.

Итак создадим папку и скачиваем туда файл en.stsw-stm8069.zip. Туда же скачиваем мой Makefile. В Makefile-е нужно поправить имя используемого чипа, которое должно быть одним из следующих.

1
2
3
4
5
6
7
8
9
10
11
12
STM8S208     /* STM8S High density devices with CAN */
STM8S207 /* STM8S High density devices without CAN */
STM8S007 /* STM8S Value Line High density devices */
STM8AF52Ax /* STM8A High density devices with CAN */
STM8AF62Ax /* STM8A High density devices without CAN */
STM8S105 /* STM8S Medium density devices */
STM8S005 /* STM8S Value Line Medium density devices */
STM8AF626x /* STM8A Medium density devices */
STM8AF622x /* STM8A Low density devices */
STM8S103 /* STM8S Low density devices */
STM8S003 /* STM8S Value Line Low density devices */
STM8S903 /* STM8S Low density devices */

Имя чипа нужно указать в переменной CHIP

Указываем чипlink
1
2
3
4
5
CC = sdcc
AR = sdar

CHIP = STM8S003
...

Далее просто запускаем командой make сборку библиотеки.

Собственно что при этом происходит? Файл распаковывается, выкачивается нужный патч, накладывается на исходники библиотеки, библиотека собирается, финальный файл вместе с исходниками и заголовочными файлами переносится в папку ./<название чипа>_stdlib и затем удаляется весь мусор.

1
2
3
4
5
$ ls -l
итого 10912
-rw-r--r-- 1 roman roman 11164420 дек 23 00:18 en.stsw-stm8069.zip
-rw-r--r-- 1 roman roman 2680 дек 24 20:29 Makefile
drwxr-xr-x 5 roman roman 4096 дек 24 20:58 STM8S003_stdlib

Готовые файлы будут в папке ./<название чипа>_stdlib. В моём случае это STM8S003_stdlib. Внутри будет бинарник библиотеки, заголовочные файлы и исходники (они не нужны, но бывает полезно в них поковыряться, поэтому оставляю их).

Готовый проект на github

Нашёл слишком поздно — тут уже готовая пропатченная библиотека. Знал бы раньше не занимался бы геморроем выше. Справедливости ради должен сказать, что в работе её не проверял.

Итоги

Итого у нас всё готово для дальнейшей разработки. В следующих статьях постараюсь показать как это всё использовать.

Источники

Комментарии