STM8L подробное руководство первых шагов

Речь пойдет о маломощном микроконтроллере STM8L001J3. Постараюсь подробно рассказать о необходимых шагах для прошивки «hello world» и различных подводных камнях.

Основные характеристики микроконтроллера:

Максимальная частота ядра

16 мГц

Объем памяти программ

8 кБайт

Объем EEPROM

256 Байт

Объем оперативной памяти

1.5 кБайт

Количество входов/выходов

6

Поддерживаемые интерфейсы

SPI, I2C, UART

Напряжение питания

1,8…3,6 V

Корпус

SO8

Из этих данных видно, что STM8L001J3 вполне может заменить так горячо любимый всеми ATTiny13. Более подробно можно посмотреть на официальном сайте STM.

Для изучения нам понадобятся:

  1. Вот такой девайс — Модуль STM8L, он минималистичен, но все необходимое на борту имеется;

  2. IDE, приложение для написания и редактирования кода; после долгих проб остановился на IAR EW for STM8;

  3. Ну и, конечно, программатор 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»; нажимаем «ОК». Получаем вот такой экран:

403517ab3347f76a21917276a9d3c5fe.jpeg

Добавляем файлы библиотек в проект. Для этого создадим две новых группы, ПКМ (правая кнопка мышки) по корню, 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 выбираем всё и добавляем в папки соответственно их названиям.

c1c68a606e1b4d03023db56015fb832b.jpeg

Теперь добавляем основной файл и файлы конфигурации. Находим разархивированный файл библиотек. Выбираем из папки en.stsw-stm8012\STM8L10x_StdPeriph_Lib\Project\STM8L10x_StdPeriph_Templates четыре файла и переносим их в папку с проектом.

4b6f2d27b9fe4b5c299c49ecafc26890.jpeg

Соглашаемся с заменой, «ОК». Для удобства перенесем эти файлы в корень. Для этого опять ПКМ на корне и добавляем три файла (mane.c уже поменялся):

5e375445c8b0bfe750e35ea752f6df03.jpeg

Продолжаем настраивать конфигурацию: ПКМ по корневому файлу, далее Options. Появляется вот такое окно, выбираем в нём наш микроконтроллер:

Выбираем наш микроконтроллерВыбираем наш микроконтроллер

Следующая настройка С/С++ Comiler/Preprocessor, туда добавим наши папки «inc» и «src».

74827aafaef98a728a67eb8d7241044a.jpeg

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

Прописываем наш микроконтроллер в это окно Defined:

Далее в этом окне идем в Debugger меняем Simulator на ST-Link. Следом в Output Converter: ставим галку и выбираем Output format как «Intel Extended».

bc409f4a444f18ef3292ab7348ebd4a9.jpeg

Нажимаем «ОК» и ждём, пока настройки применятся. Потом F7 или зеленый многогранник со стрелочкой, именуем Work Space, «ОК», даем какое-то время для сборки. После сборки ошибок быть не должно. Если они есть, то исключите файл, на который жалуется приложение из папки «src». Примерно так: ПКМ на файле, «Options» и ставите галку здесь:

2d23c3f8160f77ee9d487eb295f043d8.jpeg

В моем случае жалоба была на файл «stm8l10x_itc.c», после его исключения ошибка пропала. Вот он, наш замечательный бесконечный цикл. Настройка завершена.

246b362053d6f8c8b71fa4a5b4a54c3d.jpeg

Часть 2. Разбираем Модуль STM8L

На борту этого модуля микроконтроллер, светодиод и кнопка. Питается от внешнего напряжения 5–15 Вольт. Есть отдельные пины для подключения программатора. При необходимости можно удалить перемычки J1 и J2, тем самым освободив пины микроконтроллера под свои нужды. В комплекте, кстати, идет дополнительно еще один микроконтроллер и макетка.

Module STM8LModule STM8L

По схеме у нас светодиод на выводе №6 — PB6, а кнопка на выводе №7 — PB7, это нам понадобится в третье главе, когда будем писать код для микроконтроллера.

2335885de3693ad82f59c94021be5223.jpeg

Также обратите внимание: здесь всего три вывода для внутрисхемного программирования. Отсутствует привычный четвертый вывод «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».

abb30d39470e259e449b0101ee5902bc.jpeg

Переходим к прошивке. Используем ST-LINK: скачиваем и устанавливаем под него свежие драйвера. Вставляем в USB. Подключаем три провода программатора ST-LINK: Gnd, Swim, +3.3 к соответствующим выводам Модуля STM8L. Здесь нужно заметить, что на Модуле STM8L уже загружена тестовая прошивка. Поэтому, на все про все есть ровно 5 секунд. За это время нужно соединить три контакта и нажать кнопку «Download and Debug» (Ctrl+D). После прошивки рестарт, ждем 5 секунд и видим наш мигающий светодиод. Можно поменять в программе паузу, правда, чтобы её увеличить, необходимо задать переменную «i» как uint32.

СоединениеСоединение

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

© Habrahabr.ru