ARM-микроконтроллеры STM32F. Быстрый старт c STM32-Discovery / Хабр

Конструкторы

Небольшое вступление

Однажды, заехав в очередную съемную квартиру, я столкнулся с определенным неудобством, которое достаточно сильно напрягало: выключатель света в основной комнате оказался за шкафом-стенкой, который был прикручен к стене, и его перестановка была невозможна т.к. на это требовалось значительно много времени и сил.

Именно с идеи создания собственного пультика для управления светом в комнате и началось моё увлечение электроникой, микроконтроллерами и различными радиоустройствами.

Список статей:

  1. Начинаем изучать STM32 или Управляем светом по-умному
  2. Начинаем изучать STM32: битовые операции
  3. Начинаем изучать STM32: Что такое регистры? Как с ними работать?

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

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

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

Смотрите про коптеры:  Подводные дроны CHASING — Купить в официальном магазине — GlazamiDrona.ru

Всё это для меня на тот момент показалось непостижимо сложным, и я даже пришел в некоторое смятение, но от реализации поставленной задачи отказываться не собирался. Так я познакомился с семейством микроконтроллеров STM32 и платой STM32F0-Discovery, после изучения которых мне хотелось бы сваять свой девайс под нужные мне цели.

К моему большому удивлению, такого большого комьюнити, статей, примеров, различных материалов по STM не было в таком же изобилии как для Arduino. Конечно, если поискать найдется множество статей «для начинающих» где описано, как и с чего начать. Но на тот момент мне показалось, что все это очень сложно, не рассказывались многие детали, интересные для пытливого ума новичка, вещи.

Многие статьи хоть и характеризовались как «обучение для самых маленьких», но не всегда с их помощью получалось достичь требуемого результата, даже с готовыми примерами кода. Именно поэтому я решил написать небольшой цикл статей по программированию на STM32 в свете реализации конкретной задумки: пульт управления освещением в комнате.

Приступим к первоначальной настройке и подготовке ide к работе!

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

Pack Installer

. В данном установщике содержатся низкоуровневые библиотеки, Middleware, примеры программ, которые регулярно пополняются и обновляются.

Для начала работы с нашей платой нам необходимо установить ряд пакетов необходимых для работы и необходимо найти микроконтроллер, с которым мы будем работать. Так же можно воспользоваться поиском вверху окна. После того, как мы нашли наш МК кликаем на него и во второй половине окна и нам необходимо установить следующий перечень библиотек:

  1. Keil::STM32F0xx_DFP – полноценный пакет программного обеспечения для конкретного семейства микроконтроллеров, включающий в себя мануалы, даташиты, SVD-файлы, библиотеки от производителя.
  2. ARM::CMSIS – пакет Cortex Microcontroller Software Interface Standard, включающий в себя полный набор библиотек от ARM для поддержки ядра Cortex.
  3. Keil::ARM_Compiler – последняя версия компилятора для ARM.

После установки требуемых паков можно перейти к настройке IDE и нашего отладчика/программатора. Для этого нам необходимо открыть главное окно Keil и создать новый проект.

Для этого необходимо перейти в меню

Project -> New uVision Project

и выбрать папку, в которую сохраним наш проект.

После Keil спросит нас какой МК будет использоваться в проекте. Выбираем нужный нам МК и нажимаем ОК.

И вновь появится, уже знакомое нам, окно в котором мы можем подключить интересующие нас модули к проекту. Для нашего проекта понадобится два модуля:

  1. Ядро библиотеки CMSIS, в котором объявлены настройки, адреса регистров и многое другое из того что необходимо для работы нашего МК.
  2. Startup-файл, который отвечает за первоначальную инициализацию МК при старте, объявление векторов и обработчиков прерываний и многое другое.

Если все зависимости у подключаемых удовлетворены – менеджер будет нам сигнализировать об этом зеленым цветом:


После того как мы нажмем клавишу

ОК

мы можем приступать к созданию нашего проекта.

Для того, чтобы сконфигурировать параметры проекта и настроить наш программатор нужно правым кликом по Target 1 открыть соответствующее меню.

В главном меню проекта настраиваем параметр

Xtal

в значение

8.0 MHz

. Данный параметр отвечает за частоту работы кварцевого осциллятора нашего МК:


Далее переходим к настройке нашего программатора/дебагер. Кликаем в этом же окне на вкладку

Debug

и выбираем в поле

Use

параметр

ST-Link Debugger

и переходим в настройки:


В настройках мы должны увидеть модель нашего ST-Link установленного на плате, его серийный номер, версию HW и IDCODE МК который будем прошивать:

Для удобства можно настроить параметр, отвечающий за то, чтобы МК сбрасывался автоматически после перепрошивки. Для этого нужно поставить галочку в поле Reset and Run.

Начало работы с stm32 или не повторяйте моих ошибок

image

Небольшой рассказ о граблях, встреченных на пути познания ARM на примере stm32f103c8t6 и stm32l151rct6.

Мое знакомство с микроконтроллерами началось с AVR. Ими я занимался довольно долго, пройдя путь от плат с процарапанными дорожками и ассемблера в AtmelStudio4 до нормального лута и самописных makefile’ов для работы в блокноте (в моем случае — KWrite) и командной строке.

Но пришло время потыкать палочкой и в их старших братьев — ARM. Выбор конкретного семейства был долгим и пассивным (потому что прямой надобности нет, вот и не спешил), но в конце концов закончился на stm32f1, как самом, пожалуй, распиаренном. Покупать программатор, отладочную плату вроде Discovery или blue pill? Что вы, я же мастер по AVR-кам! Любую плату можно сделать ЛУТом, да еще так, как тебе нужно, без лишнего обвеса. Поэтому покупаю голый stm32f103c8t6 и начинаю шаманить с трассировкой платы. Что же мне понадобится? Хотя бы два порта вывести на гребенки… упс, выводить порты целиком неудобно. Да и ладно, выведу по 8 ножек — от порта A младшие (0-7), от B — старшие (8-15). Еще, конечно, светодиоды и кнопки, как же без индикации и управления. Вот что меня удивляет в готовых отладочных платах так это отсутствие хотя бы 2-3 светодиодов и 1-2 кнопок, которые бы ни с чем не конфликтовали. Как они вообще себе представляют отладку? Под кнопки сами просятся PA8, PA9, они удобно расположены. Еще пригодятся USB, джамперы BOOT0, BOOT1 и разъем батарейки для часов. И разъемы для кварцев, чтоб совсем красиво (впоследствии ни разу не воспользовался разъемами для кварцев). Для питания контроллеру нужно не более 3.6 В, а с USB идет 5 В. Надо ставить стабилизатор. Много читал, как народ выбирает стабилизаторы с низким падением напряжения… зачем? Разница полтора вольта, да тут дубового 78l33 хватит. А теперь разъем JTAG. У Atmel разъем программирования был стандартный ISP10 или ISP6. Наверное JTAG тоже штука стандартная. Оказывается, да… но только для отдельного производителя или даже устройства. Смотрим разъем на st-link: красивый, 10-контактный. Смотрим на каком-то программаторе для AVR: упс, уже 20-контактный. Смотрим еще где-то: больше несовместимых разъемов богу несовместимых стандартов. Ну, раз так, будем изобретать свой. Если что, переходник между ними будет не сложнее переходника ISP-6 на ISP-10. Вроде бы все готово, можно делать плату. Как оказалось, шаг 0,5 мм вполне достижим на любительском уровне, даже почти маркером подрисовывать не пришлось.

Теперь чем ее прошивать. Раз есть USB, наверное, через него и умеет. Читаю даташит — ага, через USB не умеет, зато через UART1 умеет. Упс, как раз его-то я и забыл вывести. Мало того, он еще и с кнопкой конфликтует, с той что на PA9 висит. Ну да ладно, выведу на проводочках, а кнопка все равно еще одна есть. Немного шаманства и плата готова и даже определяется в stm32flash.

image

image

С железом вроде бы разобрался, пора переходить к коду. Почитав несколько статей в интернете нашел готовый архив под gcc-arm-none-eabi. Разбираться, как именно задавать последовательность сборки, буду потом. Пока что занимаюсь hello-world’ами на кнопках и светодиодах. Поскольку это мое первое знакомство с данным семейством, никаких оберток вроде HAL — только ручная работа с регистрами. Впрочем, это вполне естественный подход, как мне кажется, можно было и не упоминать. Немного напрягает все время дергать питание и BOOT0 на плате, ну да ладно, когда-нибудь сделаю JTAG-программатор. Как ни странно, на грабли с отключенным тактированием периферии не наступил. Вспомнил молодость, когда на TurboPascal’е писал обработку трехмерной графики. Здесь у меня есть дисплей на ili9341 от raspberry pi и контроллер на целых 72 МГц. Вот что получилось — до 200 точек на модель и 11 fps. Конечно же, все матрицы трансформаций считаются в числах с фиксированной точкой.

В какой-то момент захотелось сделать носимое устройство, чтобы долго работало от батарейки. Посмотрел я в даташит и огорчился: знаменитые ARM по потреблению в разы хуже тех же AVR-ок! Если у вторых (ткнул в первый попавшийся контроллер, которым оказался ATmega88p) потребление составляет 0,8 мкА с учетом часов, то у первых даже в самом экономичном режиме сна* — 25 мкА ± 1.4 мкА на RTC. Это никуда не годится. Впрочем, stm32f103 и не позиционируется как экономичная серия. Смотрю на сайте STmicroelectronics другие серии контроллеров и выбираю серию stm32l1: помимо потребления порядка 1 мкА, там есть еще емкостный датчик и контроллер ЖКИ. Правда, максимальная частота поменьше, всего 36 МГц (или 24 МГц если используется USB), но это я как-нибудь переживу. Решено: беру пару stm32l151rct6 аж с 32 кБ оперативки (еще там 256 кБ флеша, но слабо представляю чем его можно забить. Разве что совсем диким говнокодом или массивами данных).

Параллельно делаю из запасной stm32f103 программатор st-link v2, просто потому что надоело возиться с BOOT0 и питанием, да и быстрее он. Впрочем, программирование по UART оставлю — мало ли что. Там тоже было немного шаманства, но ничего выдающегося. Разве что найти командную строку для openocd оказалось проблемой. Для будущих поколений оставлю ее:

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "init" -c "reset halt" -c "flash write_image erase "$(firmware).bin" 0x08000000" -c "reset run" -c "exit"

Для stm32l151 надо, само собой, поправить target на «target/stm32l1.cfg»

image

image

Чуть забегу вперед по хронологии, но чтоб не возвращаться. Господа, не экономьте на толщине текстолита! Или хотя бы добавляйте подпорки, или не используйте smd-компоненты. Так получилось, что на плате программатора я предусмотрел всего два крепежных отверстия в рандомных местах. А места оказались довольно далеко от разъема JTAG. И через какое-то время я заметил, что программатор работает нестабильно. То работает, то нет, то через UART приходится стереть «жертву», тогда подхватит. Оказалось, что резистор, идущий от вывода контроллера к разъему, сломался. У него просто отвалилась контактная площадка от корпуса. Резистор я перепаял. Потом перепаял остальные. Потом догадался, что даже той малой деформации платы, которая возникала при втыкании-выдирании шлейфа, хватало для несчастных компонентов. В результате воткнул подпорку прямо рядом с разъемом. Пока держит.

Как читатель уже догадался, программирование все также идет в текстовом редакторе, а компиляция и прошивка — в консоли. Естественно, покупная отладочная плата под l151 меня вдохновляла не больше, чем всякие IDE. Потирая следы от граблей, оставленных первой платой, развожу вторую (считая программатор — третью, но он все-таки не отладочная плата). Раз уж собрался отлаживать энергоэффективное устройство, надо заморочиться с питанием. Стабилизатор 78l33 менять не буду, но его выход я разорвал джампером, чтобы туда можно было ткнуться амперметром (надеюсь все-таки на микроамперметр, но там уж как пойдет). Гребенки пусть будут такие же, как на предыдущей плате — совместимость! Ну и пару светодиодов и кнопок, конечно. Грабли с UART1 призывно поблескивают, но я все же ставлю его разъем и не получаю по лбу. Конечно, JTAG у меня уже есть, но страховка не повредит. Так же, как и предыдущую (и плату программатора тоже) удалось развести по одной стороне, даже перемычек не слишком много.

А вот при запаивании контроллера возникла проблема. Я как-то наивно полагал, что на корпусе микросхем должен быть ключ, обозначающий первую ногу. Кто бы ожидал, что молодцы из ST сделают ДВА ключа, симметрично. Вот и какой стороной его запаивать теперь? Подумав, я решил, что это не ключи, а технологические углубления. Мало ли, для позиционирования чипа при изготовлении, например. Или прижать основание для заливки пластиком. Тогда надо ориентироваться по надписи. Логично же, что надпись должна быть читаема если расположить микросхему «стандартно», то есть когда первая нога в левом верхнем углу. Так и начал припаивать. То ли дефект ЛУТа, то ли кривые руки, но припаялась микросхема криво, благо вовремя заметил, прежде, чем запаял целиком. Не беда, есть же старый способ отпаивания многоножек с помощью лезвия бритвы: оно не смачивается припоем и достаточно тонкое чтобы не слишком погнуть. Оказалось, руки все-таки недостаточно прямые, поскольку ножки погнулись. Но не вверх, а вбок, хорошо хоть не сильно и их удалось кое-как выпрямить. Вторая попытка запаивания шла уже под микроскопом, но прежде я решил доправить ножки. И одна из них отломалась. Из чего их делают, что один раз согнуть-разогнуть нельзя? У выводных-то компонентов такой проблемы нет. Ну все, думаю, микросхему в брак, придется запаивать другую. Но вдруг это не критичная ножка? Ну там, вывод общего назначения, или одно из питаний. Пока что запаяю без нее, а там видно будет. На этот раз удалось запаять ровно, правда ножка попала на I2C, с которым я хотел поразвлекаться, но хоть не на жизненно важные разъемы вроде USB, JTAG, UART или BOOT. Подключаю — не работает, программаторы плату не видят. Какое-то время шаманю с пропаиванием ножек, но не помогает. Блуждающий по даташиту взгляд натыкается на картинку контроллера, расположенную где-то в подвале документа. Вот как можно было придумать нанести надпись БОКОМ?! То есть если повернуть контроллер так, чтобы надпись читалась, первая нога окажется в левом нижнем углу. Попутно выяснилось, что одно из «технологических углублений» таки является ключом. Правда, не поясняется, как его отличить от симметричного… Ну, хоть какая-то зацепка. Выпаиваю контроллер строительным феном, чтобы не доломать выводы, и запаиваю на этот раз боком. Отломанный вывод попадает аккурат на TX вывод UART1, то есть на разъем программирования и отладки. Это совсем нехорошо, но перед тем, как менять контроллер, надо хотя бы убедиться что с ориентацией угадал чтобы при перепаивании на живой не убить его неправильным подключением. Подключаю программатор — работает. Ура. Остались мелочи — впаять разъемы, диоды и прочую обвязку. В комментариях подсказали еще один способ — прозвонить земли: они обычно соединены внутри корпуса и расположены не полностью симметрично. Правда, учитывая шаг выводов, попасть по нужным выводам может быть непросто. Как бы то ни было, это самый надежный способ.

Работать с контроллером без UART1 не хочется, да и хуже чем сейчас уже не будет. А если и будет, так все равно менять, поэтому принимаю решение поиграть в хирурга и сделать контроллеру протез ноги из волосинки МГТФа. Как раз под рукой валяется хороший электропроводный клей, которым волосинка решительно приляпывается к площадке на корпусе микросхемы. Тот клей, который попал на соседние ножки, безжалостно удаляется скальпелем. А что вы хотите, попасть в полумиллиметровую площадку и не попасть по соседним торчащим ножкам? Проверяю — работает. Пока не отвалилось, а чтобы не отвалилось и потом, заливаю цианакрилатом.

Возможно, так бы я этой платой и пользовался, если бы ножка не отвалилась повторно. А она залита клеем. Впрочем, он довольно мягкий и режется скальпелем, поэтому успешно счищается. Но использовать тот же электропроводный клей второй раз почему-то не хочется. Попробую-ка я ножку припаять. Обычным жалом паяльника туда не подлезть, но в комплекте шло коническое (вообще-то, коническое изначально было единственным, но ввиду его очевидной неудобности, было заменено обычным, с клиновидной заточкой), которое туда вполне подлезает. Как ни странно, «операция трансплантация» прошла успешно и ножка заработала как ей положено (фотография ножки крупным планом на КДПВ).

image

image

Итак, железо готово, пора перейти к коду. Хорошо бы найти готовый пример под gcc и библиотеки CMSIS. Что для этого подойдет лучше, чем официальный сайт производителя? Как оказалось, STmicroelectronics не разделяют моего оптимизма. То, что навигация на сайте сделана через неприличное место — уже привычно, сейчас трудно найти сайт, сделанный людьми для людей. Но они не позволяют ничего с сайта скачать! Возможно, позволили бы после регистрации, но у меня и раньше не было желания регистрироваться где попало, а после такого отношения к разработчикам — и подавно. На кой ляд вам моя почта или что вы там требуете? Собирать персональные данные, спам слать? Идите лесом, а я в свободном доступе найду! Кстати, немного удивило что соответствующего пакета не оказалось в репозитории, но, возможно, ST придумали какой-то лицензионный геморрой. Посему шлю лучи поноса маркетологам, придумавшим такую политику, да и за неудобный сайт тоже.

Как бы то ни было, библиотека прекрасно нашлась на просторах интернета (ссылки давать не буду, мало ли что с сайтом случится). Альтернативный вариант — скачать среду разработки или CubeMX, где эти библиотеки вшиты. Правда, скачать их с официального сайта точно так же невозможно, так что ищем на сторонних и устанавливаем на виртуалку, просто на случай «если вдруг что».

С железом разобрались, с сорцами тоже. Пришло время разбираться наконец с контроллером. Первый сюрприз ждал при попытке воспользоваться сторонним кодом под Discovery. Там применен контроллер stm32l152, который на первый взгляд почти не отличается от stm32l151, установленного у меня. Помимо мелких отличий, оказалось, что в «мой» контроллер не установлен модуль ЖКИ. Немножко обидно, но я все равно не планировал им пользоваться. Хотя вот такое различие могли бы и более явно выделить, чем сносочкой в даташите. Кстати, в даташите рекомендуется в таком случае соединить вывод VLCD с питанием, у меня на фотографии соответствующий 0-омный резистор не запаян, но в реальности я его все же установил. Без него тоже работает, но не стоит перегружать внутренние соединения. Более интересным оказалось поведение часов реального времени. Они упорно не хотели работать, причем в интернете пишут просто «делай так, делай так, оно работает». А оно не работает. Кое-где, впрочем, упоминалось об «известных проблемах с RTC в данной серии». Как бы то ни было, часы все же завелись, правда, только на встроенном RC-генераторе. Попытки запстить часовой кварц приводили к бесконечному ожиданию бита готовности LSE. Я попытался проверить не отвалились ли ножки микросхемы от дорожек на плате и подергал ими в режиме обычных GPIO. Отвалился высокочастотный кварц. WTF?! В общем, вместе эти два кварца работать не желают, но хотя бы по отдельности худо-бедно функционируют.

И тут я догадался: суперклей, которым была залита половина контроллера (он ведь жидкий, его точечно не нанесешь, да и кто бы мог подумать…), дает утечку и кварцы своими наводками мешают друг другу. Ну, снаружи отскрести клей нетрудно, но ведь он затек даже под низ микросхемы. И если утечек по нему достаточно для кварцев, это ведь и на потреблении скажется. Ищу в гугле, чем люди удаляют цианакрилат. Предлагается теплая вода (что???) и диметилсульфоксид. В теплую воду я не верю, поэтому покупаю ДМСО. После более чем часового нахождения капли химиката на поверхности клея, разницы я не заметил. Зато заметили кварцы и стали работать более-менее нормально (интересно, почему? Димексид вытеснил влагу, впитанную клеем?). Впрочем, меня это не убедило, да и остатки клея все равно мозолят глаза… даром что находятся на нижней стороне платы и особо не видны. Кстати, теплая вода, которой я смывал димексид, на клей не повлияла (я не удивлен). Обнаружил, что существует такая штука, как удалитель клея, в таком же тюбике, как и сам клей, только фиолетовом. Ну хоть она-то должна сработать! Как оказалось, она может и работает, но по консистенции напоминает сметану и под микросхему просто не лезет. Ну и толку с тебя, удалитель?! Снаружи я и так почистить могу. Последний шанс: изредка упоминается ацетон. Немножко опасаюсь за пластиковые детали, но как раз их заменить несложно. Заливаю ацетон в стеклянную банку, кидаю туда плату и оставляю на ночь. Наутро выяснилось, что ацетон и правда работает, да еще как! От клея не осталось и следа. Мало того, растворился толкатель одной из кнопок. Что интересно, вторая уцелела, наверное, была сделана из более устойчивого пластика. Немного удивлен был, что и прочий пластик остался нетронутым, даже надписи уцелели. Ну и отлично, а кнопку можно и заменить.

Вот теперь удалось запустить и RTC от часового кварца, и режим сна потрогать, да и с другой периферией пообщаться. А еще, чтобы совсем фен-шуйно было, нанес подписи на плату. Но не маркером (вдруг снова купать в растворителях?) а процарапал скальпелем. На века!

Ну и для будущих поколений оставлю примеры кода для обоих контроллеров, вместе с библиотеками, makefile’ами и прочим. Останется только установить gcc-arm-none-eabi, openocd, stm32flash и прочую мелочь.
stm32f103
stm32l151

В комментариях несколько раз советовали не заниматься ЛУТом и заказать изготовление плат у профессионалов. Для прототипирования, как здесь — не вижу смысла. Другое дело, если нужны будут многослойный платы, или еще меньший шаг, или BGA-корпус, или еще что-то, что в домашних условиях сделать сложно. И, разумеется, при изготовлении финальной версии устройства и тиражировании. Нехорошо, если заказчик разберет корпус

, спаянный из текстолита,

и обнаружит криво отпиленню плату без маски и с перемычками из МГТФ.

Выводы:

  1. Делать отладочные платы под себя при желании можно, они не хуже покупных. А вот программатор-отладчик все же лучше купить, если он не слишком дорогой. Сделать его, конечно, можно, но схему-то вы менять не будете, а раз так — лучше покупного он не будет. Дешевле, скорее всего, тоже. Разве что если контроллер лишний остался или с доставкой проблемы.
  2. Не забывайте про резервный разъем программирования UART1, ну и заодно джамперы BOOT0, BOOT1. Помимо собственно программирования, по UART’у довольно удобно отлаживать программу.
  3. На корпусе LQFP64 два ключа, один из которых фальшивый. Ориентироваться придется на надпись чтобы смотрела ногами влево.
  4. Паять компоненты с малым шагом стоит только под микроскопом. Иначе сложно определить все ли пропаялось и нет ли «соплей». Ну либо на «профессиональном» оборудовании вроде специального фена, паяльной пасты и т.п. Тут уж не знаю, я пишу про любительскую технологию.
  5. Не экономьте на толщине текстолита. Он гнется и этого может хватить для повреждения smd резисторов и, наверное, конденсаторов. Выводным это не страшно, да и компоненты с гнутыми выводами (транзисторы, микросхемы), пожалуй, переживут.
  6. Делать разъемы для кварцев — пустая трата времени. Вы не будете их менять, поэтому просто запаяйте на плату.
  7. Выпаивать многоножку с помощью лезвия бритвы стоит только в самом крайнем случае, когда нет фена. Иначе слишком велик риск ее повредить
  8. Даже если у микросхемы отвалилась ножка, ее можно восстановить! Даже когда шаг 0,5 мм. Главное пользоваться пайкой, а не проводящим клеем.
  9. Никогда не заливайте микросхему цианакрилатным клеем (суперклеем)! Он не обладает должными электрическими, да и механическими, характеристиками.
  10. Для удаления суперклея из труднодоступных мест лучше всего подходит ацетон. Растворяет полностью. Главное убедиться что окружающие компоненты не пострадают. Из не-труднодоступных мест можно и механически удалить.

Description

The STM32WB55xx and STM32WB35xx multiprotocol wireless and ultra-low-power devices embed a powerful and ultra-low-power radio compliant with the Bluetooth
®
Low Energy SIG specification 5.2 and with IEEE 802.15.4-2023. They contain a dedicated Arm
®
Cortex
®
-M0 for performing all the real-time low layer operation. The devices are designed to be extremely low-power and are based on the high-performance Arm
®
Cortex
®
-M4 32-bit RISC core operating at a frequency of up to 64 MHz. This core features a Floating point unit (FPU) single precision that supports all Arm
®
single-precision data-processing instructions and data types. It also implements a full set of DSP instructions and a memory protection unit (MPU) that enhances application security.

Enhanced inter-processor communication is provided by the IPCC with six bidirectional channels. The HSEM provides hardware semaphores used to share common resources between the two processors.

The devices embed high-speed memories (up to 1 Mbyte of Flash memory for STM32WB55xx, up to 512 Kbytes for STM32WB35xx, up to 256 Kbytes of SRAM for STM32WB55xx, 96 Kbytes for STM32WB35xx), a Quad-SPI Flash memory interface (available on all packages) and an extensive range of enhanced I/Os and peripherals.

Direct data transfer between memory and peripherals and from memory to memory is supported by fourteen DMA channels with a full flexible channel mapping by the DMAMUX peripheral.

The devices feature several mechanisms for embedded Flash memory and SRAM: readout protection, write protection and proprietary code readout protection. Portions of the memory can be secured for Cortex
®
-M0 exclusive access.

The two AES encryption engines, PKA and RNG enable lower layer MAC and upper layer cryptography. A customer key storage feature may be used to keep the keys hidden.

The devices offer a fast 12-bit ADC and two ultra-low-power comparators associated with a high accuracy reference voltage generator.

These devices embed a low-power RTC, one advanced 16-bit timer, one general-purpose32-bit timer, two general-purpose 16-bit timers, and two 16-bit low-power timers.

In addition, up to 18 capacitive sensing channels are available for STM32WB55xx (not on UFQFPN48 package). The STM32WB55xx also embed an integrated LCD driver up to 8×40 or 4×44, with internal step-up converter.

The STM32WB55xx and STM32WB35xx also feature standard and advanced communication interfaces, namely one USART (ISO 7816, IrDA, Modbus and Smartcard mode), one low- power UART (LPUART), two I2Cs (SMBus/PMBus), two SPIs (one for STM32WB35xx) up to 32 MHz, one serial audio interface (SAI) with two channels and three PDMs, one USB 2.0 FS device with embedded crystal-less oscillator, supporting BCD and LPM and one Quad-SPI with execute-in-place (XIP) capability.

The STM32WB55xx and STM32WB35xx operate in the -40 to 105 °C ( 125 °C junction) and -40 to 85 °C ( 105 °C junction) temperature ranges from a 1.71 to 3.6 V power supply. A comprehensive set of power-saving modes enables the design of low-power applications.

The devices include independent power supplies for analog input for ADC.

The STM32WB55xx and STM32WB35xx integrate a high efficiency SMPS step-down converter with automatic bypass mode capability when the V
DD
falls below V
BORx
(x=1, 2, 3, 4) voltage level (default is 2.0 V). It includes independent power supplies for analog input for ADC and comparators, as well as a 3.3 V dedicated supply input for USB.

A V
BAT
dedicated supply allows the devices to back up the LSE 32.768 kHz oscillator, the RTC and the backup registers, thus enabling the STM32WB55xx and STM32WB35xx to supply these functions even if the main V
DD
is not present through a CR2032-like battery, a Supercap or a small rechargeable battery.

The STM32WB55xx offer four packages, from 48 to 129 pins. The STM32WB35xx offer one package, 48 pins.

Single wire interface module (swim), serial wire debugging (swd) и st-link

Фирма ST весьма крупная, на начало 2020 в ней работало более 40 тысяч человек. Это очень много и управлять такой махиной без бюрократического подхода просто невозможно. Поэтому в недрах ST периодически рождаются и формируются различные экосистемы. Экосистема STM32 не стала исключением.

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

SWO это Single wire output, т.е. технология позволяющая по одному проводу выдавать из чипа какую-то информацию. Как правило она используется для отладки, когда разработчики не желают использовать обычные UART для ее вывода, что весьма полезно, так как в любой момент можно подключиться к работающему устройству и начать получать отладочную информацию.

Получать и просматривать информацию можно посредством Serial Wire Viewer (SWV). По сути, обычным терминалом с дополнительными функциями. Выдача информации осуществляется только при использовании режима SWD и доступна на микропроцессорах начиная с Cortex-M3.

И подбираясь к самому интересному, хочется отметить, что под наименованием ST-LINK кроется не только комплекс технологий, объединяющих SWIM, SWD, SWO и тому подобное, но еще и программное обеспечение, которое реализует весь набор практик и интерфейсов.

Для подключения ST-LINK на STM32F103RB задействованы следующие выводы:

  • SWDIO (Serial Wire Data Input/Output) – PA13
  • SWCLK (Serial Wire Clock) – PA14
  • TRACESWO (Trace of Serial Wire Output, та самая SWO) – PB3

Для работы через SWIM/SWD нужно-то всего два проводка, не забываем про обязательное соединение земли по всем подключенным устройствам. TRACESWO можно не подключать, особенно если данной функцией вы не пользуетесь, да и для отладки она, а не для загрузки прошивки.

Когда кто-то упоминает устройство ST-Link, то скорее всего имеет ввиду китайский аналог под кодовым названием ST-Link V2 Mini. Небольшой USB-свисточек в цветастом корпусе с десятипиновым разъемом IDC. Именно такой и будем рассматривать далее.

На начало 2020 актуальны следующие аппаратные версии ST-Link:

  • ST-Link – первая версия устройства, сейчас уже не актуальна. Поддерживается подключение по USB.
  • ST-Link/V2 – вторая версия устройства. Работает с STM8 и STM32. Поддерживается улучшенное подключение по USB.
  • ST-Link/V2.1 – обновленная вторая версия устройства. Работает с STM32 (поддержки SWIM для STM8 нет). Изначально предполагалось использовать ее как встраиваемую часть системы. Поддерживает подключение по USB с технологией виртуального COM-порта, а заодно и как сменный накопитель. В таких системах нет необходимости отдельно подключать USART, достаточно только устройства ST-Link/V2.1. Именно ST-Link/V2.1 интегрирован в отладочную плату NUCLEO-F103RB, поэтому при подключении ее к ПК, подключается и COM-порт и протокол SWIM. А прошивки можно загружать, просто записывая их на чип как на флешку. Удобно, но такие программаторы в виде отдельных устройств в продаже отсутствуют.
  • ST-Link/V3 – третья версия устройства. Бывает в виде версии E (встраивается как часть системы) и S (Set или Standalone, включая SET, MINI и MODS). Работает только с STM32.

Производят ST-Link V2 Mini в массовом порядке все, кому не лень. А не лень в первую очередь нашим китайским друзьям. Вот и поставляют они универсальные отладчики-программаторы в невероятных количествах на мировой рынок. И это хорошо, ведь благодаря массовому выпуску и конкуренции есть возможность приобрести программатор за очень небольшие средства. Да, он не самой последней версии, но работать с ним можно. Нужно только разобраться как.

На свои устройства, заботливые производители из далекой и большой страны, предусмотрительно наносят распиновку выходов. И делают они это совершенно верно, так как никакой инструкции к устройству не прилагается. Однако, если покопаться в сети, то можно обнаружить, что существует несколько вариантов реализации вывода на китайских ST-Link V2 Mini, поэтому стоит обратить внимание на выводы, при подключении нового устройства.

При первом знакомстве с ST-Link V2 Mini у меня возникло затруднение в плане определение выводов на программаторе. Да, они подписаны и пронумерованы на корпусе, но на самом разъеме кроме ключа нет ничего. Поэтому пришлось повозиться с определением, где первый «шпынек», а где второй и все последующие.

Stm32cubeprog

Фирменный программатор от ST, скачивается с официального сайта (не забываем про обязательную регистрацию). STM32CubeProg позиционируется как универсальное средство, содержащее в себе всё необходимое, да еще и под несколько платформ (Windows, Linux, MacOS) сразу.

STM32CubeProg можно использовать как в виде графической оболочки, так и в виде консольной версии для любителей клавиатуры и черного экрана терминала. Такая неприхотливость и неразборчивость объяснятся просто — оболочка написана на Java, поэтому может портироваться куда угодно (необходимо только изменять небольшое платформозависимое ядро).

При первом подключении ST-Link V2 программатор может определить, что версия прошивки на ST-Link V2 устарела и предложит ее обновить. При желании можно обновить, на китайских устройствах проблем без или после обновления версии прошивки не обнаружено.

При подключении ST-Link к плате Nucleo с отломанным ST-Link V2.1 подключаем выходы с китайского ST-Link V2 к коннекторам ST morpho CN7 (гребенка с левой стороны) следующим образом:

  • 3.3 V -> Pin5
  • GND -> Pin19
  • SWCLK -> Pin15 (PA14)
  • SWDIO -> Pin13 (PA13)

После физического подключения на плате Nucleo включается светодиод питания (красный) и начинает выполняться прошивка (если туда зашит блинкер, то будет мигать зеленый светодиод). На ST-Link V2 загорается синий светодиод. После нажатия на кнопку Connect в STM32CubeProgrammer микроконтроллер переводится в режим остановки, считывается некоторый объем памяти и устройство готово к программированию или любым другим операциям. ST-Link V2 в этот момент сигнализирует о режиме остановки попеременным миганием синего и красного светодиодов.

Cube Programmer, помимо просто прошивки позволяет выполнять следующие операции:

  • Читать и сохранять Flash-память микроконтроллера, если она не защищена от чтения.
  • Очищать как Flash-память, так и внешнюю память микроконтроллера. Причем очищать можно как поблочно, так и все целиком. Под внешней памятью тут подразумевается память, подключенная посредством SPI, FMC, FSMC, QSPI, OCTOSPI и другими интерфейсами, но работать с ней можно только при помощи внешнего загрузчика (в комплекте уже идет набор из внешних загрузчиков под наиболее популярные платы).
  • Устанавливать или снимать флаги запрета чтения Flash иначе чем из программного кода, выполняемого микроконтроллером, снимать или устанавливать флаги запрета записи в конкретные сектора на Flash, и некоторые другие функции.

CubeProg помимо ST-Link может подключаться по UART, USB и OTA (обновление по воздуху). Для начала рассмотрим наиболее интересующий нас вариант подключения посредством ST-Link. При подключении ST-Link V2 к компьютеру и выборе варианта загрузки через ST-Link в окне ST-LINK Configuration отображаются некоторые настройки, которые могут повлиять на способность подключения. Дам пояснения всем им:

  • Serial number — серийный номер микроконтроллера установленного в ST-Link. У всех чипов STM32 есть свой собственный, уникальный серийный номер, а в ST-Link V2 установлен именно чип семейства STM32.
  • Port — подключение посредством SWD или JTAG. Поскольку мы используем ST-Link V2 от безымянного китайского производителя, то в нашем случае функциональным будет только SWD.
  • Frequency (kHz) — частота на которой работает интерфейс SWD или JTAG. Чем больше значение, тем быстрее все будет прошиваться и считываться, но при длинном кабеле могут возникать ошибки. Если все работает, то оставляем в значении по умолчанию.
  • Mode — режим подключения ST-Link к чипу, может принимать три значения. Normal — стандартный вариант подключения: производится сброс, затем перевод устройства в режим остановки. Вариант сброса выбирается в следующем пункте. Connect Under Reset — подключение и остановка выполнения программы в микроконтроллере при сбросе. Тот самый случай, когда выводы ответственные за SWD/JTAG на микроконтроллеры переназначены на другие функции. При этом варианте программатор старается отловить момент, когда происходит сброс (пользователь отпускает кнопку Reset). Hot Plug — подключение без сброса и остановки, применяется для «горячего» изменения регистров или памяти.
  • Reset Mode — выбор варианта сброса, может принимать несколько значений. Software reset — вариант по умолчанию, происходит полный сбор микроконтроллера программным способом за исключением подсистемы отладки. Hardware reset — сброс через вывод Reset микроконтроллера. Физический программатор при этом должен быть подключен к выводу Reset своим управляющим выводом Reset. На китайском варианте ST-Link V2 Mini данная функция неработоспособна. Core reset — сброс ядра микроконтроллера.
  • Access port — на большинстве устройств STM32 всего один порт доступа по SWD/JTAG, поэтому оставляем значение по умолчанию.
  • Shared — позволяет эксклюзивно (Disabled) захватывать подключение к микроконтроллеру, если же функция включена (Enabled) то можно запустить несколько STM32CubeProg или других программных оболочек к одному физическому устройству ST-Link.

Итак, если есть какие-то сложности при подключении программатора к микроконтроллеру, то начинаем играться с настройками. В большинстве случаев помогает переключение в режим Connect Under Reset. А если же проблем нет, то переходим непосредственно к программированию.

В качестве программы-примера для прошивки я буду использовать обычный Blink («мигатель») написанной на языке MBED (активно продвигается ST для своих плат). Код программы примитивен, но вполне рабочий (и компилируется всего в 50 Кб):

#include «mbed.h»DigitalOut myled(LED1);int main() {    while(1) {        myled = 1;        wait(1);        myled = 0;        wait(1);    }}

Итак, программа откомпилирована под мой чип (STM32F103RB), Flash-память контроллера предварительно стерта (дабы убедиться, что новая программа работает, а не старая). Мой компилятор подготовил для меня сразу два файла:

  • Файл с расширением elf — промежуточный формат, содержит откомпилированную микропрограмму, но она требует линковки в соответствии с конкретным чипом.
  • Файл с расширением bin — конечный формат для загрузки в конкретный микрочип.

На главной странице CubeProg нажимаем плюсик и выбираем файл с расширением bin для загрузки. Если с файлом все в порядке, то его содержимое (в одном из форматов разрядности) открывается в окне просмотра. Теперь можно подключится к чипу, если чип уже не подключен, и нажимаем Download (тут странно, ведь в нашей культуре загрузка прошивки в чип была бы выгрузкой, Upload).

Загрузить прошивку в микроконтроллер можно и на вкладке Erasing & Programming. В этом случае есть возможность настроить параметры загрузки. В данном примере я включил галочки проверки загруженного после прошивки, а так же запуск программы на исполнение после завершения загрузки. При этом ST-Link не выходит из режима подключения к плате, а все так же остается подключенным.

Как распознать подделки stm32

Микроконтроллеры STMicro STM32 очень популярны, и всем хорошо известно, что на рынке есть подделки. Чего мы не знали, так это того, что многие подделки можно распознать с первого взгляда на них.

Об этом нам стало известно из репозитория Greaseweazle Github, где Keirf объясняет, как распознать подделки STM32 и известные клоны STM32F103C8, обнаруженные в плате Bluepill.

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

Далее Keirf показывает две платы, которые продаются как платы STM32F103C8T6 Bluepill, и довольно легко заметить различия, просто посмотрев на чипы. 

У первого чипа, бросается в глаза номер детали, начинающийся с «STM32FEB», и он вообще не является частью STMicro, поскольку он не указан в программе ST MCU Finder.

Кроме того, «KC6» указывает на деталь с низкой плотностью и меньшим количеством функций.

Второй поддельный чип STM32 обнаружить немного сложнее, поскольку маркировка обозначена как STM32F103C8T6, но если сопоставить чип с оригиналом, мы увидим две круглые выемки на чипе и шрифт меньшего размера.

Keirf отмечает, что есть некоторые физические различия и на подлинных чипах. Поэтому единственный способ убедиться в подлинности чипа, это протестировать его функции, убедившись что его нельзя запрограммировать на 921600 бод, только на 115200 бод, невозможно запустить прошивку из System Bootloader среди других проблем, описанных в Github.

Наконец, есть несколько плат Bluepill с CS32-клонов STM32, о которых мы сообщали чуть более года назад.

Мы бы не стали называть это «Подделкой», поскольку производители сами идентифицируют плату как клон, и она, главным образом, работает как и ожидалось. В прошлом году люди сообщали, что отладка с помощью официальных инструментов STMicro не будет работать, и это один из способов обнаружения клонов.

[Обновление: есть еще больше подделок STM32: APM32F103, BLM32F103, MM32F103 и т. д.… Подробнее см. Комментарий André]

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

В процессе изысканий способов заливки прошивок разными способами в плату на основе чипа STM32 от платы донора Nucleo-64 была успешно отломана часть с программатором ST-Link версии 2.1 с портом USB. И сразу же возникает вопрос, а нельзя ли эту плату в дальнейшем использовать как удобный программатор? Ведь иметь одно устройство, сочетающее в себе сразу три (ST-Link, Virtual COM и USB Mass Storage) ой как удобно.

Давайте попробуем, в качестве бонуса, подключить программатор ST-Link от платы Nucleo обратно к плате Nucleo посредством проводков, словно мы используем произвольный чип STM32 с программатором ST-Link V2.1.

На «огрызке» имеется несколько разъемов и перемычек для подключения чего-либо, вот они:

  • CN2 – выбор режима работы ST-Link через коннектор SWD или же через дорожки на печатной плате.
  • CN3 – выход на UART (пины Tx, Rx).
  • CN4 – коннектор SWD.
  • CN12 и CN11 – на некоторых платах используется как выход для пинов вместо внешнего осцилятора. При поставке закрыты на землю с обратной стороны.
  • JP1 – применяется для ограничения потребления платой через порт USB. Если перемычка снята, то максимальное потребление платой и всей ее обвязкой должно быть не более 300 мА. Если перемычка установлена, то максимальное потребление не должно превышать 100 мА, при этом питание платы Nucleo должно осуществляться через E5V или VIN пины. Однако, если плата подключена по USB не к порту компьютера, а к USB-блоку питания или USB-хабу со своим питанием, то Nucleo-64 можно запитывать и через USB при большом потреблении, но тогда нужно установить перемычку. Ограничения внесены на тот случай, если плата перестает стабильно работать/определяться при перегрузке по питанию порта USB, по большей части относится к портам USB1/USB2.

Итак, для целей использования ST-Link от Nucleo как отдельного программатора ST-Link V2.1 следует:

  • Снять перемычки с CN2, таким образом мы активируем коннектор SWD.
  • Подключить выводы с коннектора CN4, первый пин верхний и обозначен точкой, подключаем сразу к «огрызку» Nucleo-64:
  1. VDD_Target – сенсор питания платы, через него нельзя запитать что-либо, он действует наоборот. При подключении к платам со стандартным питанием его можно не подключать.
  2. SWCLK – подключаем к PA14
  3. GND
  4. SWDIO – подключаем к PA13.
  5. NRST – сброс
  6. SWO – порт по отладочной информации.
  • Также подключаем пины Tx (сверху) и Rx (снизу) к PA10 и PA9 соответственно.
  • Берем питание еще откуда-либо, например, с левого пина JP1, там 3.3 вольта.

Соответственно, если все подключено верно, то появляется сразу три возможности:

  1. При подключении ST-Link V2.1 к ПК по USB подключается папка с несколькими файлами, включая инструкцию. Эта папка – внутренняя Flash-память ST-Link (он так же построен на чипе STM32, поэтому в нем все есть). Если в эту папку скопировать файлик с прошивкой, то он автоматически запишется в подключенную плату. Однако, следует учитывать, что объем «флешки» программатора всего 156 Кб, и очень объемную прошивку залить таким образом может не получиться.
  2. Подключаться по SWD (ST-Link) программаторами и осуществлять все предусмотренные операции. При этом корректно отрабатывает Reset.
  3. Подключаться к USART1 (или любому другому доступному к которому были подключены выводы) терминальной программой. При этом в операционной системе COM-порт определяется как STLink Virtual COM Port. А при наличии правильной конфигурации BOOT01/BOOT1 можно так же обращаться и к заводскому загрузчику.

Подключаемся через заводской загрузчик и с использованием stm32 cube programmer

Как правило, при подключении через ST-Link проблем не возникает. А вот с UART придется совершить больше действий. Для начала следует убедиться, что в системе есть драйвера под USB2COM адаптер. Под чип PL2303 в Win10 обыкновенно все уже имеется сразу, либо скачивается с серверов обновления Microsoft.

Вторым шагом необходимо провести соответствующую коммутация проводников. Подключить Tx на USB2TTL к выводу PA9, Rx к выводу PA10 (при чтении спецификации не лишним будет обратить внимание на то, что USART1 может быть альтернативно переназначен на другую пару выводов, в случае с F103RB это PB6 и PB7).

Затем необходимо подключить вывод PB2 (сюда заведен вывод BOOT1 микрочипа) к любому выводу земли. Подключаем вывод BOOT0 к любому выводу 3.3 V, а также не забываем про соединение GND USB-адаптера и платы. Если плата не питается от чего-то еще, то подключаем так же питание 3.

3 V с USB-адаптера на, например, Vdd пин Nucleo (кстати, на Nucleo присутствует перемычка, определяющая откуда на микропроцессор будет подавать питание, с Vdd или от USB встроенного ST-Link, при отломанном ST-Link питание в любом случае будет браться с Vdd).

Таким образом мы подключили USB2UART адаптер к USART1 (именно к USART1 подключается загрузчик) платы Nucleo, подали на нее с того же самого адаптера питание и активировали Схему 1 вызова заводского загрузчика (BOOT0 3,3V; BOOT1 GND). После нажатия на сброс, если все было подключено верно, вместо выполнения кода мигателя (он остался от предыдущих экспериментов с ST-Link) будет исполнен заводской загрузчик.

Небольшое замечание: несмотря на то, что по умолчанию BOOT1 (PB2 в случае Nucleo-F103RB) инициализируется на землю, его все равно рекомендуется жестко соединить с GND, в противном случае возможно срабатывание загрузчика «через раз» (при этом пользовательская прошивка так же не будет вызываться, так как BOOT0 не будет передавать ей управление).

Для подключения через USART в CubeProg необходимо выбрать тип подключения UART и выбрать соответствующий COM-порт. В отношении остальных параметров вопрос остается открытым. Дело в том, что заводской загрузчик от ST обладает возможностью автоподстройки под параметры подключения по UART, с другой стороны, на конкретных параметрах и из-за особенностей аппаратного обеспечения может не произойти подключение к загрузчику программатора.

После установления связи программатора с платой посредством UART можно пользоваться CubeProgrammer точно так же, как и при подключении через ST-Link. Более того, можно не отключать от платы и сам адаптер ST-Link, на работоспособность его присутствие не влияет.

А вот следует ли отключать 3.3 V от BOOT0? Высокий уровень на BOOT0 требуется для инициализации заводского загрузчика. После подключения программатора к чипу, можно отключить BOOT0 от напряжения, тогда при следующей перезагрузке платы управление будет передано пользовательской прошивке, загруженной в чип.

Оцените статью
Радиокоптер.ру
Добавить комментарий