Автор статьи и разработчик модуля 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) и разобраться можно без проблем.
Напоследок, полезные ссылки:
- RM0031 — Толстый мануал с ответами на все (почти вопросы). За тем, как работает та или иная периферия — туда.
- Datasheet на STM8L152K6T6. Там распиновка, электрические параметры и т.д. Табличка прерываний тоже там.
- Проект с мигалкой светодиодом (из быстрого старта).
- Документация на модуль в виде одного большого pdf, архив с демо-проектом, архив с «хакнутым» FlashLoader’ом, схема в eagle и документация на стандартную библиотеку — все вместе.
Исправьте ссылку на RM0031.
Исправил
У STM8L152K6T6 в ЖК контроллере не 4 разряда по 17 сегментов, а LCD:up to 4×28 segments w/ step-up converter
Так у него корпус 32 ноги! 28 + 4 туда никак не влезет :)
Да посмотрел, гумно поставили:)
Ну а нахер там 48 ног? Все равно стекляшку на него вешать вряд-ли кто будет
Ноги лишними не бывают!
Смущает то, что на субмодуле кнопки одинаковой высоты, причем RESET в середине. Очень легко случайно перезагрузиться. Логичнее сделать RESET меньшей высоты.
Вообще было задумано именно так: резет низкий, а рядом высокие кнопки. И ди я об этом говорил. Но у меня лично для прототипа (зеленый который на фотках) не нашлось разных кнопок :)
Как?)
Почти вопросы, угу)
Или просто разломить?
Алсо для постоянной работы удобнее консольный прошивальщик. Стоило бы и его описать (и как его в тулзы IAR’а вкорячить).
>> Закидываем туда содержимое архива template.zip.
а где ссылка на файл?
да да, где взять файл?
Когда мой утюг первый раз увидел STM-овские чипы, он испуганно замотал шнуром и начал пятиться назад. Хороши они, но упаковка слишком мелкая. Только в заказных платах и можно использовать такие манюни, а для любительских поделок не очень годятся
Хреновый у тебя утюг значит. Мой прокатал и не поморщился. Ну и STM8 они не мельче той же меги16 в tqfp
У нее ж вроде 0.8 шаг, а у STM8 — 0.5.
Впрочем, нормы 0.25/0.25 для ЛУТа не проблема. И для паяльника тоже. Я такие спокойно жалом 2.4D паяю.
Есть и с шагом 0.8. Правда я их только в документации и прайсах видел.
Не подскажешь название того цангового разъемчика (под кварц?) на плате…=
SIP-40
Di Halt, напиши пожалуйста статейку про конвертеры UART-RS485 и RS232-RS485 как у тебя про UART-RS232.
Там тоже есть специальная микруха или же придется все таки делать схему?
Есть специальная микруха. Работает также как MAX232 только с протоколом 485. Называется … max485 ВНЕЗАПНО, да? ;) Собственно в даташите на нее найдешь все ответы.
Приобрел платку, для комплекта…
Ёксель-моксель, как можно было так недоступно расположить резисторы «задающие» питание ?
Разъем программирование какого черта не совпадает со стандартным ?
Не соблюдение документации:
1) линия сброса требует конденсатора 100 нф на землю, но не резистор к плюсу!
2) по питанию конденсаторы, только один и тот не понятно где…
Пришла идея, на плату STM32 надеть мезонин/переходник, а на него мезонином плату STM8L.
STM32 прошить версией ST-Link, возможно модифицированной (обсуждение идет на форуме).
Получится и загрузчик/отладчик, и на STM8L останется возможность цеплять периферию.
Не бред?
Наверное весь вопрос сводится к одному, можно ли научить ST-Link воспринимать команды не через USB, а через RS-232?