Микроконтроллер STM8L001J3 относится к самой простой модели 8 разрядной линейки фирмы STM. Требовать от нее каких-то супперспособностей некорректно, но по цене-качеству она значительно превосходит широко известный ATTiny13. В этой статье постараюсь подробно описать первые шаги и всевозможные подводные камни.
Итак, микросхема в корпусе SMD, имеет 8 ножек. Это самое главное, что нужно знать начинающему. Для дальнейшего познания Ваше обращение к даташиту неотвратимо. Есть еще одна особенность у этой модели, о которой нужно знать, иначе она превращается в однократно программируемую. Более подробно расскажу в главе. Что понадобится для первых шагов:
- Вот такой девайс — Модуль STM8L, он минималисти́чен, но все необходимое на борту имеется.
- Нужна IDE, приложение для написания кода и редактирования, после долгих проб остановился на IAR EW for STM8.
- Ну и ,конечно, программатор ST-Link V2. Любой клон, главное что бы был рабочий.
Глава 1. Установка IAR EW for STM8
На сегодняшний день есть масса возможных ограничений, которые можно обойти затратив некоторые усилия. Поэтому я буду освещать только общие моменты, возможно когда Вы будете читать эту статью , что-то изменится. Скачиваем IAR EW for STM8 с официального сайта (не обязательно) последнюю версию и ставим на компьютер. Дальше настраиваем среду для работы. Маленькое отступление для тех, кто любит видеоуроки : есть очень хорошие обзоры у Бородатого Инженера. Там, правда, простая ST8, но первые уроки вполне подходят. А здесь расскажу в картинках, как это все настроить:
Кликаем по иконке, приложение открывается заходим в File/New Work Space, тем самым создаем новое рабочее пространство
Затем Project/Create New Project, выбираем «C», Ок.
Сохраняем проект, называем , к примеру «HW-STM8L», ОК. Получаем вот такой экран
Добавляем файлы библиотек в проект. Для этого создадим две новых группы, пкм (правая кнопка мышки) по корню, Add/Add Group, даем им имена «inc» и «src»
Должно получиться так:
Далее внимательно, если Вы параллельно смотрите видео, то будут отличия. Файлы библиотек для 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, ОК, даем какое-то время для сборки. После сборки, ошибок быть не должно, если они есть, то удалите файл на который жалуется приложение из папки «srs». Примерно так : пкм на файле, Option и ставите галку
В моем случае жалоба была на файл 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 Debugg» (Cntr D). После прошивки, рестарт, ждем 5 сек, и видим наш мигающий светодиод. Можно поменять в программе паузу, правда, что бы увеличить ее, необходимо задать переменную «i» как uint32.
То что надо! IAR и без SPL.
Я правильно понял:
Задержка 5 сек создаётся асемблерным аналогом WHILE()?
Я брал эту вставку из даташита. Но, вероятно, ее можно организовать и в Си. Главное, что бы было 5 секунд до начала основной программы
Я прикинул поверхностно — там лупами 2 цикла типа for организовано, так что да, можно подогнать.
А есть умельцы, кто шим на нем запускал?
Уже какой день бьюсь с примерами, и курю Reference Manual c Datashitom, но толку чуть.
Есть у кого рабочий пример, мне бы отправную точку, что бы понять где каой бит я не туда становится..А то примеров с ШИМ на этот конторллер вообще нет в сети(
Я пользовался примером TIM2_PWMDutyCycleConfiguration из стандартной библиотеки ST. Переделав под TIM3_CH2. Если речь именно про эту плату, то на ней перепутана маркировка пинов. Причем зеркально. C1 — это B3, и тд.