Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

STM8 просто на C. Часть 2 +

В первой части описан порядок подготовки среды разработки для программирования микроконтроллеров серии STM8. Было много комментариев, даже разгорелась горячая дискуссия на форуме, и без вмешательства модератора не обошлось.

Будем считать что рабочая среда готова, микроконтроллером STM8 и программатором обзавелись. Пора бы и приступить к программированию. В комментариях несколько раз упомянули о необходимости иметь инструменты отладки. Исправим этот недочет.

1.8. Отладка

В п.1.3. первой части, в Code::Blocks мы добавили мастер создания проекта. Так вот в скрипте допущена ошибка, не позволявшая получить полноценный файл .elf прошивки с метками отладки. Откорректированные файлы можно скачать по ссылке. Нужно заменить каталог stm8 как в пункте 1.3.

C:\Program Files\CodeBlocks\share\CodeBlocks\templates\wizard

Также понадобятся openocd и stm8-gdb.exe скачиваем по ссылке файл gdb.7z.

Приступим. Распакуем gdb.7z например в каталог C:\STM8Project\dbg и получим следующее.

Для поддержки STM8S103 скачиваем с github архив xpack-openocd-0.11.0-4-win32-x64.zip извлекаем файл xpack-openocd-0.11.0-4-win32-x64.zip\xpack-openocd-0.11.0-4\scripts\target\stm8s103.cfg и копируем в

C:\STM8Project\dbg\openocd\scripts\target

Настроим Code::Blocks. В меню Выбираем Tools > Configure toolss… В открывшемся окне жмем Add

Указываем путь к файлу openocd.exe и его рабочей папке, а в поле параметры вводим следующее

-f interface/stlink.cfg -f target/stm8s103.cfg -c "init" -c "reset halt"

Следующим шагом отладчик в Code::Blocks меню Settings > Debugger… в открывшемся окне слева выбираем строку GDB/CDB debugger и жмем кнопку Create Config

Задаем имя настройки, например stm8gdb

Выбираем слева строку stm8gdb и справа указываем путь к файлу stm8-gdb.exe и жмем Ok.

В меню Debug выбираем основной дебаггер

Настройка дебаггера завершена. Описание работы будет чуть позже, в конце этой части серии статей.

2. Программирование.

Все готово к написанию первой программы. Нам понадобится некоторая литература, а собственно:

  • Datasheet для выбранного микроконтроллера;

  • Reference manual для микроконтроллеров STM8;

  • Книга Матюшов Н.В. «Начало работы с микроконтроллерами STM8» (в ней практически переведен Reference manual, хоть и с ошибками);

  • Кника по языку C – по вашему усмотрению. Я пользуюсь Брайан Керниган и Деннис Ритчи «Язык программирования C».

Семейство микроконтроллеров STM8 имеют высокую программную совместимость, и отличаются в основном характеристиками и наличием периферии. Дальнейшее описание будет на основе STM8S103F3P6

Из даташита нам понадобится назначение выводов микроконтроллера.

Атакже таблица адресов памяти (раздел Memory and register map) где расположены регистры периферии и портов ввода/вывода.

В референс мануале можно почитать о назначении регистров, это можно сделать и в книге «Начало работы с микроконтроллерами STM8».

Рассмотрим три варианта написания программ для STM8. В конце данной части статьи сравним разные подходы и подведем итоги. Ну а какой подход к программированию выбрать вам.

И уже по традиции, для начала, заставим микроконтроллер помигать светодиодом. На плате из Китая уже распаян светодиод на 11 выводе микроконтроллера. Его и используем.

Итак что мы имеем? Вывод 11 это 5-тый вывод порта B. Для управления нам понадобятся регистры DDR, ODR, CR1 и CLK_CKDIVR.

По datasheet усзнаем адреса регистров, а в reference manual почитаем о назначении данных регистров. Сведем все в таблицу

Адрес Регистр Описание Биты для PB5
0x005007 PB_DDR Регистр направления данных порта установить бит DDR5 в 1 (выход)
0x005005 PB_ODR Регистр выходных данных Установка 1 или 0 на выводе через бит ODR5
0x005008 PB_CR1 Режим работы выводов порта В режиме выхода бит С15 в 1 (режим push-pull)
0x0050C6 CLK_CKDIVR Регистр деления частоты тактирования Настройка делителя тактовой частоты микроконтроллера (рассмотрим в программе)

2.1. Приступим к программированию.

Вариан 1. Без SPL.

Подключим стандартную библиотеку C для целочисленных типов, у нас uint8_t

#include <stdint.h>

Подскажем нашей программе адреса регистров микроконтроллерам

#define PB_ODR	(*(volatile uint8_t *)0x5005)
#define PB_DDR	(*(volatile uint8_t *)0x5007)
#define PB_CR1	(*(volatile uint8_t *)0x5008)
#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

Добавим бестолковую функцию задержки на подобии delay в ардуино

static void delay(uint32_t t)
{
    while(t--) {}
}

Ну и собственно основная часть программы — функция main

void main(void)
{
   //основной код
}

Отключим делитель тактовой частоты микроконтроллера установив 00011000 в регистр CLK_CKDIVR

CLK_CKDIVR &= ~0x18;

И конечно настроим наш вывод PB5 на выход в режиме push-pull (0x20 это в двоичной 0010000 тоесть бит 5 начиная с 0)

PB_DDR |= 0x20;
PB_CR1 |= 0x20;

Создадим бесконечный цикл while(1) и будем чередовать 0 и 1 на выводе PB5 через регистр ODR вставляя задержки выполнения программы чтоб не очень быстро моргало.

while(1)
        {
        PB_ODR &= ~(1 << 5);
        delay(100000UL);
        PB_ODR |= (1 << 5);
        delay(100000UL);
    }

Полный текст программы в проекте по ссылке.

Как видно из написанного. Сложность работы баз SPL только в указании адресов регистров, но их можно вынести в отдельный заголовочный файл и подключать к своим программам. При этом можно программировать любой STM8 имея Datasheet и Reference manual

Вариан 2. Заголовочные файлы SPL.

Для начала заглянем в файл stm8s.h в библиотеке SPL

Тут закомментированы строки выбора микроконтроллера. Находим свой (если он там есть, если нет прийдется добавлять самим или использовать Вариант 1) и добавляем в свою программу, ну и заголовочный файл заодно добавим.

#define STM8S103
#include <stm8s.h>

Далее опять функция задержки

static void delay(uint32_t t)
{
    while(t--) {}
}

основная часть программы — функция main

void main(void)
{
   //основной код
}

Опять настраиваем вывод PB5 на выход в режиме push-pull, но уже просто берем порт ирегистр из SPL. И конечно делитель тактирования.

CLK->CKDIVR &= ~0x18;
GPIOB->DDR |= 0x20; 
GPIOB->CR1 |= 0x20;

И бесконечный цикл с включением/отключением вывода PB5 и задержкой.

while(1)
    {
        GPIOB->ODR &= ~(1 << 5);
        delay(100000UL);
        GPIOB->ODR |= (1 << 5);
        delay(100000UL);
    }

Полный текст найдете в проекте по ссылке.

В чем же отличие? Нам не пришлось искать адреса регистров, но при этом нужно указывать микроконтроллер. Из литературы только Reference manual. Код программы такой же простой как и в Варианте 1.

Вариант 3. С использованием SPL.

Библиотека SPL для STM8 просто скачанная с сайта STMicroelectronics не будет работать с компилятором SDCC, поэтому в п.1.4. первой части добавили пути где искать. Но в скачанной библиотеке не хватает некоторых файлов. Об этом описано в одном из блогов в сети интернет. Отсюда скачиваем stm8pack.zip. Распаковываем и добавляем в codeblocks аналогично п.1.4. первой части. Должно получится примерно так.

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

#define STM8S103
#include <stm8s.h>

Еще добавим из библиотеки несколько файлов функций.

#include <stm8s_clk.c>
#include <stm8s_gpio_Init.c>
#include <stm8s_gpio_WriteReverse.c>

Добавим функцию задержки, куда же без нее.

static void delay(uint32_t t)
{
    while(t--) {}
}

И в основной функции main

void main(void)
{
   //основной код
}

все как обычно настраиваем регистры переферии

CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);

Тут чуточку поподробнее. Выглядит как набор слов и понять от куда это взять не очень понятно. Чтобы в этом разобраться нужно погружаться в мануалы по библиотеке SPL.

И наконец бесконечный цикл для подмигивания.

 while(1)
     {
	GPIO_WriteReverse(GPIOB, (GPIO_Pin_TypeDef)GPIO_PIN_5);
        delay(100000UL);
        GPIO_WriteReverse(GPIOB, (GPIO_Pin_TypeDef)GPIO_PIN_5);
        delay(100000UL);
    }

Немного поподробнее. CLK_SYSCLKConfig это функция из SPL для конфигурации тактирования. GPIO_Init — функция инициализации выводов портов ввода/вывода. Ну а GPIO_WriteReverse функция управления пином заданного порта. Текст программы найдете в проекте по ссылке.

Возникает вопрос. Откуда это взялось. Информация с описанием работы с SPL приложена к этой библиотеке в виде справочной информации в файле справки в папке библиотеки.

Сравним все три варианта в виде таблицы.

№ варианта Источники описания Достоинства Недостатки

Объем файла

.hex

1.

Datasheet

Reference manual

Для программирования нужна только среда разработки с компилятором и описание регистров микроконтроллера (МК) Самостоятельное написание функций или поиск в дополнительных источниках. Описание адресов регистров МК 389 байт
2. Reference manual Нужна среда разработки с компилятором и описание регистров микроконтроллера. Не требуется описывать адреса регистров. Самостоятельное написание функций или поиск в дополнительных источниках. 389 байт
3.

Reference manual

Справка по SPL

Сокращение количества строк на C. Использование для инициализации периферии МК кода из SPL. Приходится разбираться в структуре SPL, синтаксису подключения функций из библиотеки.

3484 байт

(3,40 КБ)

 Кажется вот он ответ. Подключаешь SPL и программа «почти сама» инициализирует нужную периферию. Но на практике получается не все так гладко. Сама библиотека не очень очевидна в понимании, такая слабая попытка довести программирование до уровня ардуино. Код для небольшого объема памяти STM8 получается не совсем оптимален. Да и недостаток компилятора SDCC проявляется очень заметно. Компановщик sdcc не умеет удалять неиспользуемые функции. И за одной функцией из SPL в код прошивки тянется много лишнего.

Ну а выбор использовать SPL или нет за Вами. Мне приглянулся Вариант 2, нечто среднее между оптимальностью и удобством программирования.

Осталось создать проект, загрузить код, скомпилировать и прошить наш микроконтроллер.

2.2. Создание проекта и прошивка.

Приступим. Запускаем CodeBlocks.

Сразу во вкладке Start here выбираем Create a new project, или через меню File>New>project...

Выбираем шаблон проекта STM8 Project. Надеюсь внимательно читали текст и уже обновили мастер проектов?

На следующей странице мастера указываем имя проекта, у меня gpioPj, и задаем путь к папке где будет создан проект.

Далее оставляем обе конфигурации для компиляции.

На последней странице оставляем модель памяти medium.

Проект создан. В дереве проекта открываем файл main.c. И выбираем конфигурацию Release.

Меняем на текст нашей программы (у меня по варианту 2).

Жмем шестеренку(компилировать) сверху или стрелки (перекомпелировать), что почти одно и тоже. Смотрим результат.

Уменя получилось (синие нули), а у вас?

Смотрим в папке нашего проекта C:\STM8Project\gpioPj\bin\Release и видим файл gpioPj.hex это наша прошивка.

Прошиваем программой ST Visual Programmer (STVP), установка описана в первой части п.1.4. А вот как прошить описывать не буду, в интернете инструкций полно.

2.3. Запуск отладки (Debugging ).

Настройка для отладки описана в п.1.8. Для отладки нужно скомпилировать проект в ELF-файл с отладочной информацией. Для этого переключите конфигурацию компилятора в Debug.

Жмем шестеренку и видим снизу лог.

Получилось. Поставим две точки остановки щелкнув правее номера строки.

Все готово. Подключаем микроконтроллер через ST-LINK к компьютеру и запускаем openocd ранее добавленный в codeblocks.

Откроется окно терминала с информацией о подключении.

Этот терминал можно свернуть. Запускаем отладку кнопкой F8 или на панели отладки красным треугольником. Снизу смотрим логи отладки и в командной строке набираем load.

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

Можно далее набрать команду continue или нажать F8 и запустится отладка.

Курсор (желтая стрелка) станет на первой точке остановки, на выбранном выводе будет 0 (светодиод загорится если он подключен катодом к выводу). Жмем F8 курсор станет на вторую точку остановки (диод погаснет).

И так до бесконечности при нажатии F8 курсор будет переходить между точками остановки, а светодиод загораться и гаснуть.

Остановить отладку можно нажав красную кнокпку на панели отладки или Shift+F8, а также командой quit. Клавиши можно посмотреть в меню Debug. Окно терминала openocd также можно просто закрыть. Контроллер начнет самостоятельно выполнять загруженную прошивку после рестарта. Подробнее о работе отладчика GDB и его командах можно найти информацию в интернет. В рамках данной статьи нет возможности подробно описать весь процесс отладки, знания накапливаются с опытом.

На этом вторая часть закончена. Архивы рассмотренных проектов, а также файлы шаблона проектов в приложенных файлах.

Пишем комментарии, оцениваем статью и обсуждаем на форуме.

Продолжение в следующей части.

Прикрепленные файлы:

Теги:

Опубликована: 0 4
Я собрал 0 2
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.9 Проголосовало: 2 чел.

Комментарии (21) | Я собрал (0) | Подписаться

0
Aleksey1408 #
Очень круто.
Пожалуйста покажи как настроить с нуля Eclipce CDT для работы с китайскими чипа CH32 или GD32. или для raspberri pi PICO. Это очень актуально и интересно.
Ответить
0

[Автор]
vavaav #
С этой серией закончу, и может попробую. Хотя Eclipce мне не очень нравится. Да и raspberri pi PICO у меня нет, только обычная третья версия, а это уже другая весовая категория.
Ответить
0
Aleksey1408 #
Можно тогда на примере Eclipce CDT и STM8 показать. Если что я готов вам сделать донат на raspberri pi PICO.
Отредактирован 14.09.2022 10:33
Ответить
0

[Автор]
vavaav #
По моему стоит смотреть в сторону программирования ARM и в частности Cortex-M, это у меня вызывает интерес. Но пока времени нехватает. Haspberri pi PICO всего лиш один из представителей с микроконтроллером на ядре Cortex-M. Но с IDE под них я пока не определился, проприетарные не рассматриваю из спортивного интереса.
Ответить
0
Alexey_N #
Вроде все настроил, но отладка не работает, пишет, что нет отладочных символов, хотя в elf файле они есть. Какие версии программ вы использовали?
Ответить
0

[Автор]
vavaav #
openocd нормально подключился? Codeblock и SDCC использовал последнюю версию. Opencd и stm8gdb из архива по https://github.com/github0null/stm8-debug/tree/master/bin.
Отредактирован 14.10.2022 09:21
Ответить
0
Alexey_N #
OpenOCD подключился. Тоже все из архива брал. Но вот, что пишет отладчик
Прикрепленный файл: debug.png
Прикрепленный файл: openocd.png
Прикрепленный файл: openocd2.png
Ответить
0

[Автор]
vavaav #
Была такая проблема. Нестабильно подключался stlink. Переподключал провода. Можно попробовать укоротить провода.
Ответить
0
Alexey_N #
Провода 15см. Прошивается без сбоев.
Ответить
0

[Автор]
vavaav #
А по команде load прошивка грузится?
Ответить
0
Alexey_N #
Да, грузится. Но символы отладочные не находит, судя по сообщению. Я находил на зарубежных форумах такую проблему. Там писали, что виноват вроде как компилятор SDCC...
Отредактирован 20.10.2022 18:35
Ответить
0

[Автор]
vavaav #
Перепроверил. Провода влияют. Но еще перед запуском по F8 нужно точки останова проставить, иначе перестает реагировать. И еще можно файл конфигурации проекта сравнить blink.cbp из приложенного файла архива с генерируемыми в ваших проектах. При длинных проводах прошиваться будет, но отладка глючит.
Отредактирован 20.10.2022 20:07
Прикрепленный файл: blink.zip
Ответить
0
Alexey_N #
Конфигурацию сверил, ничего подозрительного не нашел. Точку ставил перед запуском - не меняет ничего. Так а что провода (15см от контроллера до ST-Link), когда ругается на отсутствие отладочных символов. Может дело в версиях...? Какая применялась версия SDCC? Я использую 4.2.0 x64.
Ответить
0

[Автор]
vavaav #
SDCC 4.2.0 x64, codeblocks-20.03mingw
Ответить
0
Alexey_N #
Те же использую. Пока что удалось выяснить, что SDCC не виноват. Команда readelf -wi binary выдает все символы в elf. Выходит их не видит gdb...
Ответить
0

[Автор]
vavaav #
Да оно как то не с первого раза срабатывает.
Ответить
0
Alexey_N #
В общем, я все еще пытаюсь все это заставить работать. Я не правильно определил виновника, все же это SDCC. Он генерирует некорректную отладочную информацию. GDB при чтении debug-секции из elf-файла выдает подобные сообщения Dwarf Error: Could not find abbrev number 24 in CU at offset 0x5d0. Оказывается этот баг известен, см. https://sourceforge.net/p/sdcc/bugs/3200/. Похоже, что он появляется не всегда, раз ваш пример gpio3 GDB загружает без ошибок, а мой проект с ошибкой. Куда дальше копать - непонятно...
Ответить
0

[Автор]
vavaav #
Да уж надо подумать и почитать. Плохо что ошибка плавающая. Проявляется не постоянно.
Ответить
0
SV #
Как запустить симуляцию. То есть отладку без МК.
Ответить
0

[Автор]
vavaav #
Никак. Отладка происходит на работающем микроконтроллере.
Ответить
0
idkaz #
Picsimlab ->ucboard-> stm8s103 эмулятор.
Прикрепленный файл: Снимок экрана от 2024-02-16 11-32-31.png
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Конструктор для сборки: предусилитель на лампе 6N3 Сатфайндер
вверх