Модуль STM8L для Pinboard II


 

Автор статьи и разработчик модуля dcoder
 
Контроллеры от STM плодятся с ядерной скоростью и почти заполонили всю планету. Для STM32 у нас модуль уже есть, а теперь пришла пора STM8. Контроллер линейки L я взял потому, что они выглядят более вкусными по сравнению с S серией — более продвинутая периферия более низкое потребление. Правда у них нету CAN, вот. И хоть сверхнизкое потребление для нашей платы погоду не делает, серию S я использовать не захотел. Кроме того, устройство периферии у S и L практически одинаковое, так что изучив L можно смело садиться и писать код под S.
 

Описание
На модуле установлен МК STM8L152K6T6.
 

Не самый продвинутый МК из линейки STM8, но точно выше среднего. Практически весь набор периферии, которой есть у топовых МК есть и у него. Разница лишь в объеме памяти, количестве выводов и некоторых фичах вроде второго канала DAC. Характеристики у нашего МК такие:
 

  • 32 Кб flash памяти, 2 Кб RAM, 1 Кб EEPROM
  • 28 линий GPIO
  • АЦП ПП 12 бит, 21 канал (!), до 1MSPS на быстром канале и до 760 кГц на всех остальных. А еще у него встроенный градусник.
  • ЦАП 12 бит, 1 канал
  • Интерфейсы: USART (IrDA, синхронный режим), SPI, I2C, SWIM
  • Контроллер ЖК дисплея: 4 разряда по 17 сегментов
  • Максимальная частота: 16 Мгц
  • Диапазон напряжений питания 1.8 – 3.6 Вольт
  • Часы реального времени (RTC). Кварц 32.768кГц установлен на плате.

 

Для подключения высокочастотного кварца на модуле есть цанговый разъем. Причем сделан он так, что можно воткнуть кварц в привычном корпусе (HC-49) или в мелком (вроде часового, но на высокую частоту).
 

Схема:

Поглядеть крупным планом
 

Фичи модуля
Во время разработки модуля, я игрался с китайскими радиопередатчиками и приемниками, и подумал, что было бы удобно если бы модуль можно было запитать от внешнего БП, прицепить к нему передатчик и закинуть в соседнюю комнату для тестов. Словом, дать ему больше самостоятельности. Эта идея вылилась в установку на модуль пары светодиодов, кнопок, и своего low-drop стабилизатора. Светики и кнопки подключаются при помощи джамперов.
 

Отладка
В нижней части модуля (которая ближе к FTDI) расположен разъем для подключения к программатору/отладчику. Но отладчика STM8L на базе FTDI пока не видно, поэтому отладка средствами платы не поддерживается и для отладки нужен будет внешний дебаггер STM8*-Discovery, например.
 

Прошивка
Шить можно через встроенный бутлоадер по UART. Причем тов. Vga (термоядерное ему спасибо, ибо я сам так и не разобрался бы) замутил небольшой хак для программы-прошивальщика, который делает работу с бутом более удобной: не приходится жать ресет, программа сама дергает ножкой FT2232, которая подключается к RST на МК (как это сделано в arduino).
 

Быстрый старт
Модуль поставляется с прошитой демо-программой, а в мануале есть описание того как прошить МК через бут. Казалось-бы, что еще нужно для счастья? Но я все таки решил описать процесс создания мигалки с нуля. Просто потому, что сам знаю, как иногда напрягает процесс создания первого проекта для незнакомого МК.
 

Два самых популярных компилятора под STM8: COSMIC и IAR. Оба имеют бессрочную пробную версию, но с ограничением 8кБ на размер выходного файла. Я пишу в IAR, поэтому и «быстрый старт» у нас будет в ней. Потом может быть дополню примером на COSMIC.
 

Итак, качаем, ставим. Я думаю тут ничего сложного нету, и можно не описывать.
 

Для начала можно прицепить шаблон проекта со стандартной библиотекой от ST. Шаблоны живут в папке
 

1
C:\Program Files\IAR Systems\Embedded Workbench 6.0 Kickstart\stm8\config\template\project.

 

Закидываем туда содержимое архива template.zip. Теперь среди других шаблонов есть папка ST_Lib_C, а в ней заготовка для будущих проектов со стандартной библиотекой.
В подпапки inc и src можно кидать свои файлы, которые часто используются в проектах. Так они будут сразу включаться в новый проект при создании. Я туда бросил файлики с реализацией задержек из демо прошивки STM8L-Discovery (delay.h и delay.c). В шаблоне есть заготовка для main.c. Если у вас какой-то код присутствует в каждом проекте, то почему-бы не включить его в шаблон?
 

Добавив шаблон, попробуем создать простенький проект и помигать светодиодом. Пинаем IAR и идем создавать проект: Project -> Create new project… На выбор нам предлагают разные шаблоны:
 


 

Берем самый последний — тот, что мы только-что добавили (STM8L Standart Peripheral library). Нам предложат выбрать место для сохранения проекта и дать ему название. Сохраним куда-нибудь (желательно без русских букв в пути). Теперь все файлы из папки с шаблоном скопируются в папку с проектом. Можно начинать кодить.
 

Слева на вкладке workplace можно лицезреть структуру проекта. Но мы ее и так знаем. Щелкнув правой мышью по названию проекта и выбрав из меню «options» попадаем в настройки проекта.
 


 

Тут в первую очередь нас интересует General options. На этой вкладке выбираем модель МК (STM8L152K6)
 


 

В качестве отладчика у нас по-умолчанию выбран ST-Link (так настроено в шаблоне, а при создании пустого проекта будет выбран симулятор). Если у вас есть демоплата discovery, то отлаживать можно через ST-Link прямо из IAR. А если нет, то придется прошивать через бутлоадер. Для бутлоадера нужно заставить IAR выдавать .hex файл. Идем на вкладку Output converter и выбираем там Intel Extended:
 

Теперь можно что-нибудь написать. Конечно, для тупого мигания светодиодом никакие библиотеки не нужны, но у нас же демонстрационный пример? :)
 

Для начала переключим частоту ядра. При старте МК тактируется от HSI (внутренний 16Мгц RC генератор) с делителем на 8. То есть работает на 2Мгц. Нам вроде хватает? Но есть один прикол со встроенным бутом — он не любит возращать исходный предделитель. После него мы внезапно работаем уже на 16Мгц. А раз так, то надо явно указать, с каким делителем мы хотим работать.
 

Открываем файл stm8l15x_conf.h — там у нас конфигурация библиотеки. Убираем комментарий со строк
 

1
2
3
#include "stm8l15x_clk.h"
 
#include "stm8l15x_gpio.h"

 

Чтобы подключить к проекту либы для управления тактированием и работы с пинами.
 

Теперь в main() пишем
 

1
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_2);

 

Опа! Вот сейчас работаем уже на 8Мгц (16MHz / 2)
 

Для мигания светиком, пусть это будет LED3 на пине D5, надо настроить ноги:
 

1
GPIO_Init(GPIOD, GPIO_Pin_5, GPIO_Mode_Out_PP_Low_Slow);

 

Вон та большая конструкция — это режим работы пина. Их чуть более чем дофига:
 

1
2
3
4
5
6
7
8
9
10
11
12
  GPIO_Mode_In_FL_No_IT      = (uint8_t)0x00,   	/*!< Input floating, no external interrupt */
  GPIO_Mode_In_PU_No_IT      = (uint8_t)0x40,   	/*!< Input pull-up, no external interrupt */
  GPIO_Mode_In_FL_IT         = (uint8_t)0x20,   		/*!< Input floating, external interrupt */
  GPIO_Mode_In_PU_IT         = (uint8_t)0x60,   	/*!< Input pull-up, external interrupt */
  GPIO_Mode_Out_OD_Low_Fast  = (uint8_t)0xA0,   	/*!< Output open-drain, low level, 10MHz */
  GPIO_Mode_Out_PP_Low_Fast  = (uint8_t)0xE0,   	/*!< Output push-pull, low level, 10MHz */
  GPIO_Mode_Out_OD_Low_Slow  = (uint8_t)0x80,   	/*!< Output open-drain, low level, 2MHz */
  GPIO_Mode_Out_PP_Low_Slow  = (uint8_t)0xC0,   	/*!< Output push-pull, low level, 2MHz */
  GPIO_Mode_Out_OD_HiZ_Fast  = (uint8_t)0xB0,   	/*!< Output open-drain, high-impedance level, 10MHz */
  GPIO_Mode_Out_PP_High_Fast = (uint8_t)0xF0,   	/*!< Output push-pull, high level, 10MHz */
  GPIO_Mode_Out_OD_HiZ_Slow  = (uint8_t)0x90,   	/*!< Output open-drain, high-impedance level, 2MHz */
  GPIO_Mode_Out_PP_High_Slow = (uint8_t)0xD0    	/*!< Output push-pull, high level, 2MHz */

 

Но описание всех параметров немного выходит за рамки происходящего (да вроде и по комментариям понятно). Потому продолжим. Подключаем к проекту (через #include) файл delay.h. В нем у нас живут задержки. Задержки реализованы на таймере и значения выбраны для частоты 8Мгц. Если будете использовать сей файл при другом тактировании — надо поправить числа, которые заносятся в регистры таймера (там в комментариях есть расчет).
 

Сделаем простую мигалку:
 

1
2
3
4
5
while (1)
{
  GPIO_ToggleBits(GPIOD, GPIO_Pin_5);
  delay_ms(250);
}

 

Теперь компилируем (F7, Project->Make или кнопка на панели). Ни ошибок, ни ворнингов быть не должно.
Те у кого есть discovery цепляют ее к модулю:
 


 


 

Для того чтобы отдадчик на дискавери мог прошивать внешние МК, надо

  • Для STM8L-Discovery: снять джамперы на противоположной от разъема SWIM стороне (они подписаны DISCOVERY и ST-LINK)
  • Для STM8S-Discovery (и SVL туда-же): отпаять перемычки SB1 и SB2 около разъема SWIM.

 

Для версии STM8L-Discovery подключать можно только линии RST и SWIM, если земли Pinboard и дискавери соединены.
 

А вот для версии STM8S-Discovery надо еще подать питание с процессора (CPU_POWER) на вход Vcc, чтобы отладчик мог замерить напряжение. Без этого он даже не почувствует контроллер.
 

Теперь жмем Project -> Download and debug (Ctrl+D) и наблюдаем за загрузкой проекта.
 

После загрузки можно запустить его на выполнение (F5) и наблюдать за миганием светодиода (джампер на D5 одеть не забудьте!). Или пошагать по коду, следя за выполнением.
 

Те у кого дискавери нету, цепляют проводок от пина RST на ADBUS4 (или BDBUS4 если используется другой канал FT2232). В архиве лежит пропатченая Flash Loader Demonstrator — программка которая заливает hex файлик через бут. Перед тем как стучаться к буту, она передергивает DBUS4, сбрасывая МК.
 

Чтобы бут мог общаться с внешним миром, надо подключить UART. Накидываем джамперы на нужный канал. Например, для канала B вот так:
 

Запускаем flash loader и видим настройки порта:
 


 

Выбираем тут нужный порт, а остальное не трогаем. Жмем next. Программа выругается, что не нашла описание для нашего типа МК.
 


 

Выбираем STM8L_32K.
 


 

А может выругаться на то, что нету вообще никакого МК.
 


 

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

  • Правильно ли подключен проводок от RST к DBUS4 (может перепутан канал?)
  • Правильный ли выбран COM-порт. Это можно легко установить, потупив в светодиодики TxA, RxA, TxB, RxB — передающие (TX) будут несильно вспыхивать, когда FlashLoader стучится в МК.

 

Если лыжи все-равно не едут, можно отключить нафиг проводок и самому сбросить МК. Временное окно после сброса 1 секунда, за это время надо успеть нажать Next в программе.
 

Еще раз жмем next и выбираем наш *.hex файл c прошивкой. Он должен лежать в папке с проектом в /debug/exe.
 


 

Последний раз тыкаем next и смотрим как прошивка утекает в МК.
 


 

После прошивки, бутлоадер передает управление на нашу прошивку и она начинает мигать светодиодом. Если не начала, то

  • Не подключен джампер на D5
  • Какой-то косяк в коде. Например забыта инициализация пина или работа ведется не с тем пином (не спрашивайте, как можно так ошибиться при копипастинге :)
  • Не подключен светодиод на PINBOARD2 (джампер должен стоять вот так)
  • Неправильная фаза луны. Попробуйте завтра.

 

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

Консольная утилита лежит в той-же папке, что и все остальное. Называется «STMFlashLoader.exe» (а графическая — STMicroelectronics flash loader.exe). Рядом, в папке Doc есть файлик UM0462.pdf в котором можно найти описание всех команд, которые понимает прошивалка. Поэтому распинаться я тут не буду.
 

Для того, чтобы прикрутить прошивалку к IAR, идем в меню Tools -> Configure Tools. Там жмем «New» и заполняем поля:
 


 

Menu Text это просто название, которое будет отображаться в менюшке и оно ни на что не влияет.
 

В поле Command прописываем полный путь до нашего консольного прошивальщика. У меня он лежит в «C:\Program Files\FlashLoader\STMFlashLoader.exe»
 

В поле Argument пишем
 

1
-c --pn 13 -i _STM8L_32K -d --fn "$EXE_DIR$\$PROJ_FNAME$.hex" -r --a 8000 -v
  • Цифры после —pn это номер COM порта, через который идет общение с бутлоадером, он у вас тоже скорее всего будет другим.
  • То, что после —fn это путь к hex файлу. Вместо $EXE_DIR$ IAR подставит папку с исполняемыми файлами проекта, а вместо $PROJ_FNAME$ — имя проекта. Да, если вы зачем-то при настройке генерации hex файла дали ему другое имя, то тут надо будет поправить. А иначе — оставить как есть.
  • -r —a 8000 означает запуск прошивки с адреса 0x8000 (это начало памяти программ). Если убрать этот ключ, то прошивка запустится только после сброса МК. В некоторых случаях это может быть удобно.

 

С консольной прошивалкой есть одна беда — после выполнения прошивки и запуска ее, программа не завершается, а висит и настойчиво просит «press any key». А у нас запуск из IAR! И консольного окошка нет, поэтому эни кей никак не нажать. Как быть? Можно поправить исходники (лежат там в папке Src), но у меня visual studio не было, поэтому пришлось искать особо хитрый метод. И он нашелся. В программе предусмотрена обработка параметра -v, но обработчик пустой, и если параметр в самом конце, то программа завершается безо всяких вопросов. Вот такая вот история последнего ключа в строке :)
 

Теперь тыкаем OK и лезем в менюшку tools: там появился пункт bootload. Если его нажать, то запустится консольная прошивалка и зальет прошивку в МК.
 

Чтобы было совсем удобно, можно закрепить за командой прошивки какое-либо сочетание клавиш. Для этого идем в tools -> options -> Key bindings. Там из списка menu выбираем Tools и прописываем хоткей для нашей команды:
 


 

С такой консольной примочкой и хаком от Vga прошивка камня просходит вообще без лишних телодвижений, одним нажатием кнопки. И это круто!
 

Пожалуй, на этом быстрый старт можно закончить. Светодиод мигает, модуль работает, все довольны. Теперь можно открывать демо проект и начать копашиться там. Комментариев там целая куча (больше пожалуй только в демке для w5100) и разобраться можно без проблем.
 

Доступен к заказу в магазине
 

Напоследок, полезные ссылки:
 

23 thoughts on “Модуль STM8L для Pinboard II”

  1. Смущает то, что на субмодуле кнопки одинаковой высоты, причем RESET в середине. Очень легко случайно перезагрузиться. Логичнее сделать RESET меньшей высоты.

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

  2. Не подключен светодиод на PINBOARD2 (джампер должен стоять вот так)

    Как?)

    Толстый мануал с ответами на все (почти вопросы)

    Почти вопросы, угу)

    Для STM8S-Discovery (и SVL туда-же): отпаять перемычки SB1 и SB2 около разъема SWIM.

    Или просто разломить?

    Алсо для постоянной работы удобнее консольный прошивальщик. Стоило бы и его описать (и как его в тулзы IAR’а вкорячить).

  3. Когда мой утюг первый раз увидел STM-овские чипы, он испуганно замотал шнуром и начал пятиться назад. Хороши они, но упаковка слишком мелкая. Только в заказных платах и можно использовать такие манюни, а для любительских поделок не очень годятся

      1. Ну и STM8 они не мельче той же меги16 в tqfp

        У нее ж вроде 0.8 шаг, а у STM8 — 0.5.
        Впрочем, нормы 0.25/0.25 для ЛУТа не проблема. И для паяльника тоже. Я такие спокойно жалом 2.4D паяю.

  4. Di Halt, напиши пожалуйста статейку про конвертеры UART-RS485 и RS232-RS485 как у тебя про UART-RS232.

    Там тоже есть специальная микруха или же придется все таки делать схему?

    1. Есть специальная микруха. Работает также как MAX232 только с протоколом 485. Называется … max485 ВНЕЗАПНО, да? ;) Собственно в даташите на нее найдешь все ответы.

  5. Приобрел платку, для комплекта…
    Ёксель-моксель, как можно было так недоступно расположить резисторы «задающие» питание ?
    Разъем программирование какого черта не совпадает со стандартным ?
    Не соблюдение документации:
    1) линия сброса требует конденсатора 100 нф на землю, но не резистор к плюсу!
    2) по питанию конденсаторы, только один и тот не понятно где…

  6. Пришла идея, на плату STM32 надеть мезонин/переходник, а на него мезонином плату STM8L.
    STM32 прошить версией ST-Link, возможно модифицированной (обсуждение идет на форуме).
    Получится и загрузчик/отладчик, и на STM8L останется возможность цеплять периферию.
    Не бред?

  7. Наверное весь вопрос сводится к одному, можно ли научить ST-Link воспринимать команды не через USB, а через RS-232?

Добавить комментарий

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha