В первой части описан порядок подготовки среды разработки для программирования микроконтроллеров серии 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 почитаем о назначении данных регистров. Сведем все в таблицу
АдресРегистрОписаниеБиты для PB50x005007PB_DDRРегистр направления данных портаустановить бит DDR5 в 1 (выход)0x005005PB_ODRРегистр выходных данныхУстановка 1 или 0 на выводе через бит ODR50x005008PB_CR1Режим работы выводов портаВ режиме выхода бит С15 в 1 (режим push-pull)0x0050C6CLK_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 и его командах можно найти информацию в интернет. В рамках данной статьи нет возможности подробно описать весь процесс отладки, знания накапливаются с опытом.
На этом вторая часть закончена. Архивы рассмотренных проектов, а также файлы шаблона проектов в приложенных файлах.
Пишем комментарии, оцениваем статью и обсуждаем на форуме.
Продолжение в следующей части.
Прикрепленные файлы:
- gpio1.zip (33 Кб)
- gpio2.zip (33 Кб)
- gpio3.zip (213 Кб)
- codeblocks-stm8-wizard.zip (51 Кб)
Автор: vavaav