Речь пойдет о маломощном микроконтроллере STM8L001J3. Постараюсь подробно рассказать о необходимых шагах для прошивки "hello world" и различных подводных камнях.
Основные характеристики микроконтроллера:
Максимальная частота ядра | 16 МГц |
Объем памяти программ | 8 кБайт |
Объем EEPROM | 256 Байт |
Объем оперативной памяти | 1.5 кБайт |
Количество входов/выходов | 6 |
Поддерживаемые интерфейсы | SPI, I2C, UART |
Напряжение питания | 1,8..3,6 V |
Корпус | SO8 |
Из этих данных видно, что STM8L001J3 вполне может заменить так горячо любимый всеми ATTiny13. Более подробно можно посмотреть на официальном сайте STM.
Для изучения нам понадобятся:
Вот такой девайс — Модуль STM8L, он минималистичен, но все необходимое на борту имеется;
IDE, приложение для написания и редактирования кода; после долгих проб остановился на IAR EW for STM8;
Ну и, конечно, программатор ST-Link V2. Любой клон, главное чтобы был рабочий.
Часть 1. Установка и настройка IAR EW for STM8
Помимо этого варианта есть и другие возможные комбинации работы с микроконтроллером, например, Code::Blocks/SDCC/ST Visual Programmer или STVD/Cosmic/STVP. Кстати, "Cosmic" на мои письма не ответила по неизвестной причине. Мы же будем использовать IAR EW for STM8.
На сегодняшний день есть масса возможных ограничений, которые можно обойти, затратив некоторые усилия. Поэтому я буду освещать только общие моменты. Возможно, когда Вы будете читать эту статью что-то изменится. Скачиваем IAR EW for STM8 с официального сайта (не обязательно) последнюю версию и ставим на компьютер. Дальше настраиваем среду для работы. Маленькое отступление для тех, кто любит видеоуроки: есть очень хорошие обзоры у Бородатого Инженера. Там, правда, простая STM8, но первые уроки вполне подходят. А здесь расскажу в картинках, как это все настроить.
Открываем приложение и заходим в File/New Workspace, тем самым создаем новое рабочее пространство. Сохраняем проект, называем, к примеру «HW-STM8L»; нажимаем "ОК". Получаем вот такой экран:
Добавляем файлы библиотек в проект. Для этого создадим две новых группы, ПКМ (правая кнопка мышки) по корню, Add/Add Group, даем им имена «Inc» и «src».
Далее внимательно: если Вы параллельно смотрите видео, то будут отличия. Файлы библиотек SPL для STM8 и STM8L различные. Поэтому идем на официальный сайт ST и скачиваем библиотеки для нашей 8L. Называется файл «en.stsw-stm8012». Сохраняем на диске и разархивируем. Теперь, чтобы добавить файлы библиотек в наши вновь созданные папки, кликаем ПКМ по этим папкам, Add/Add Files. Находим на диске разархивированный файл en.stsw-stm8012\STM8L10x_StdPeriph_Lib\Libraries\STM8L10x_StdPeriph_Driver выбираем всё и добавляем в папки соответственно их названиям.
Теперь добавляем основной файл и файлы конфигурации. Находим разархивированный файл библиотек. Выбираем из папки en.stsw-stm8012\STM8L10x_StdPeriph_Lib\Project\STM8L10x_StdPeriph_Templates четыре файла и переносим их в папку с проектом.
Соглашаемся с заменой, "ОК". Для удобства перенесем эти файлы в корень. Для этого опять ПКМ на корне и добавляем три файла (mane.c уже поменялся):
Продолжаем настраивать конфигурацию: ПКМ по корневому файлу, далее Options. Появляется вот такое окно, выбираем в нём наш микроконтроллер:
Следующая настройка С/С++ Comiler/Preprocessor, туда добавим наши папки «inc» и «src».
Также добавляем папку с четырьмя добавленными файлами.
Прописываем наш микроконтроллер в это окно Defined:
Далее в этом окне идем в Debugger меняем Simulator на ST-Link. Следом в Output Converter: ставим галку и выбираем Output format как "Intel Extended".
Нажимаем "ОК" и ждём, пока настройки применятся. Потом F7 или зеленый многогранник со стрелочкой, именуем Work Space, "ОК", даем какое-то время для сборки. После сборки ошибок быть не должно. Если они есть, то исключите файл, на который жалуется приложение из папки «src». Примерно так: ПКМ на файле, "Options" и ставите галку здесь:
В моем случае жалоба была на файл "stm8l10x_itc.c", после его исключения ошибка пропала. Вот он, наш замечательный бесконечный цикл. Настройка завершена.
Часть 2. Разбираем Модуль STM8L
На борту этого модуля микроконтроллер, светодиод и кнопка. Питается от внешнего напряжения 5-15 Вольт. Есть отдельные пины для подключения программатора. При необходимости можно удалить перемычки J1 и J2, тем самым освободив пины микроконтроллера под свои нужды. В комплекте, кстати, идет дополнительно еще один микроконтроллер и макетка.
По схеме у нас светодиод на выводе №6 — PB6, а кнопка на выводе №7 — PB7, это нам понадобится в третье главе, когда будем писать код для микроконтроллера.
Также обратите внимание: здесь всего три вывода для внутрисхемного программирования. Отсутствует привычный четвертый вывод «Reset». У этого микроконтроллера его нет. Эту особенность, нужно учитывать при программировании, и она накладывает некоторые ограничения при написании кода. Подробнее в следующей главе.
Часть 3. Пишем код и заливаем
Прежде всего необходимо рассказать о главной особенности микроконтроллера STM8L001J3. Я уже писал, что разработчики отказались от «Reset» ножки. Поэтому в даташите рекомендуется при написании кода в первых же строках дать 5-секундную задержку перед началом выполнения основной программы. Таким образом, при подаче питания у нас есть 5 секунд для начала заливки кода. Если заливки нет, программа благополучно начнет работу после небольшой паузы. Когда же код будет полностью отлажен, можно убрать задержку и прошить, осознавая, что внести изменения кода в микроконтроллер больше нельзя.
Итак, полагаясь на даташит и знания Си, пишем наш Hello World:
/**
******************************************************************************
* @file Project/STM8L10x_StdPeriph_Templates/main.c
* @author KHod
* @version V1
* @date 20-JNR-2023
* @brief This file contains the firmware main function.
******************************************************************************
*
* https://elmodule.sytes.net/?p=130
*
*
******************************************************************************
*/
/* MAIN.C file */
#include "stm8l10x.h"
#include "stm8l10x_gpio.h"
#include "stm8l10x_clk.h"
#define ASM asm
/* This delay should be added just after reset to have access to SWIM pin
and to be able to reprogram the device after power on (otherwise the
device will be locked) */
#define STARTUP_SWIM_DELAY_5S \
{ \
ASM(" PUSHW X \n" \
" PUSH A \n" \
" LDW X, #0xFFFF \n" \
"loop1: LD A, #50 \n" \
\
"loop2: DEC A \n" \
" JRNE loop2 \n" \
\
" DECW X \n" \
" JRNE loop1 \n" \
\
" POP A \n" \
" POPW X " );\
}
/* not connected pins as output low state (the best EMC immunity)
(PA1, PA3, PA5, PB0, PB1, PB2, PB4, PC5, PC6, PD1, PD2, PD3, PD4, PD5,
PD6, PD7)*/
#define CONFIG_UNUSED_PINS_STM8L001 \
{ \
GPIOA->DDR |= GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_5; \
GPIOB->DDR |= GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4; \
GPIOC->DDR |= GPIO_Pin_5 | GPIO_Pin_6; \
GPIOD->DDR |= GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | \
GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; \
}
/* pin for testing */
#define Led_PORT GPIOB
#define Led_PIN GPIO_Pin_6
main()
{
uint16_t i;
/* -------------STM8L001 startup-------------- */
/* configure unbonded pins */
CONFIG_UNUSED_PINS_STM8L001;
/* delay for SWIM connection: ~5seconds */
STARTUP_SWIM_DELAY_5S;
/* ------------------------------------------- */
/* configure all STM8L001 pins as input with pull up */
GPIO_Init(GPIOA, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT); // pin 1
GPIO_Init(GPIOA, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT); // pin 2
GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT); // pin 5
GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT); // pin 6
GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); // pin 7
GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT); // pin 8
/* initialize tested pin */
GPIO_Init(Led_PORT, Led_PIN, GPIO_Mode_Out_PP_Low_Fast);
while (1)
{
GPIO_ToggleBits(Led_PORT, Led_PIN);
/* delay */
for(i=0; i<64000; i++);
}
}
Можно скопировать весь текст на странице "main.c". Главный цикл находится в самом конце, это несколько строчек. Все остальное — инициализация и подготовка. Переносим текст, нажимаем зеленый квадратик со стрелкой (ALT+F7) и компилятор должен выдать «Ошибок 0».
Переходим к прошивке. Используем ST-LINK: скачиваем и устанавливаем под него свежие драйвера. Вставляем в USB. Подключаем три провода программатора ST-LINK: Gnd, Swim, +3.3 к соответствующим выводам Модуля STM8L. Здесь нужно заметить, что на Модуле STM8L уже загружена тестовая прошивка. Поэтому, на все про все есть ровно 5 секунд. За это время нужно соединить три контакта и нажать кнопку «Download and Debug» (Ctrl+D). После прошивки рестарт, ждем 5 секунд и видим наш мигающий светодиод. Можно поменять в программе паузу, правда, чтобы её увеличить, необходимо задать переменную «i» как uint32.
Это первые шаги. В даташите приводится код на Си. Можно самостоятельно дописать нашу программу, чтобы можно было использовать UART и таймеры.