Найти в Дзене
Просто Радиолюбитель

Black pill (stm32f401ccu6) глазами дилетанта - пользователя arduino, проблемы с USB, не рабочие порты

Так случилось, что "эпоху PIC контроллеров " я пропустил, и в качестве управляющих микроконтроллеров в своих проектах начал использовать платы Arduino на atmega. Просто, удобно - подключил по USB, и программируй - нет перемычек, кнопок жать не требует для прошивки, программаторы или UART не нужен.

Опыты с "Голубой пилюлей" (stm32f1, хотя правильно эти платы имеют название WeAct, а цветом определяют версию - голубая stm32f1, черная stm32f4) прошли не очень удачно - попалась не оригинальная stm32, а CH32F103C8T6, что доставило достаточно проблем при использовании (то с STlink не хотела работать, по загрузчик терялся... короче - танец с бубном, но в конце концов была прошита и применена). И на некоторое время отбило желание использовать пилюли.

С оказией (Дед Мороз постарался) в руки попала "Черная пилюля" - уже на stm32f4. Обещалась технология USB DFU - можно "из коробки" (bootloader) прошивать через USB порт (сразу напишу - проблему USB DFU я так и не решил). Раз есть в "руках" - будем учиться её применять.

"Черная пилюля" stm32f401CCU6
"Черная пилюля" stm32f401CCU6

Цитата от производителя ST, дающая представление о "богатстве" предоставляемых возможностей:

Устройства STM32F401xB/STM32F401xC основаны на высокопроизводительном 32-разрядном RISC-ядре Arm® Cortex® -M4, работающем на частоте до 84 МГц. Ядро Cortex®-M4 оснащено модулем с плавающей запятой (FPU) одинарной точности, который поддерживает все инструкции и типы данных Arm по обработке данных с одинарной точностью. Он также реализует полный набор инструкций DSP и модуль защиты памяти (MPU), который повышает безопасность приложений. STM32F401xB/STM32F401xC включают в себя высокоскоростную встроенную память, а также широкий спектр усовершенствованных входов/выходов и периферийных устройств, подключенных к двум шинам APB, двум шинам AHB и 32-битной матрице шин multi-AHB.

Все устройства предлагают один 12-разрядный АЦП, маломощный RTC, шесть 16-разрядных таймеров общего назначения, включая один таймер PWM для управления двигателем, два 32-разрядных таймера общего назначения. Они также оснащены стандартными и расширенными коммуникационными интерфейсами.

STM32F401xB/STM32F401xC работают в диапазоне температур от –40 до +125 °C при напряжении питания от 1,7 (PDR OFF) до 3,6 В. Комплексный набор режимов энергосбережения позволяет разрабатывать приложения с низким энергопотреблением.

Эти особенности делают микроконтроллеры STM32F401xB/STM32F401xC подходящими для широкого круга приложений.

Микроконтроллер stm32f401ccu6, установленный на плате, судя по маркировке имеет 48 ног, 256 кбайт flash, 64 кбайт SRAM, тактовая частота 84 мГц.

Есть еще версия "черной пилюли" с микроконтроллером stm32f411 - по богаче будет и с памятью, и с тактовой частотой. Подробней информацию по платам WeAct можно посмотреть по этой ссылке (сайт https://www.mischianti.org/).

Маркировка выводов приведена на Рисунке 1.

Рисунок 1. Маркировка выводов платы. Для справки. https://www.mischianti.org/2022/06/06/weact-stm32f401ccu6-black-pill-high-resolution-pinout-and-specs/
Рисунок 1. Маркировка выводов платы. Для справки. https://www.mischianti.org/2022/06/06/weact-stm32f401ccu6-black-pill-high-resolution-pinout-and-specs/

Микроконтроллер потребляет ток при работе на частоте 84 мГц порядка 15 мА (без периферии). Рассеиваемая мощность - около 600 мВт в корпусе UFQFPN (именно такой и установлен на плате). Ожидается, что на борту микроконтроллера уже имеется загрузчик DFU.

Паяем разъёмы, готовим платку к работе. Вот тут появилась личная "засада" - в доме не оказалось кабеля USB типа C.... Пришлось идти, покупать.

Описание и технические характеристики микроконтроллера stm32f401ccu6 можно посмотреть здесь (файл pdf). Руководство по программированию здесь (Reference-manual-STM32F401x.pdf). Без документации далеко не уедешь... Так же стоит посмотреть заметки по применению продукта на сайте ST (ссылка).

Питание платы осуществляется через USB (+5В), или через пин +5 В, или через пин +3.3В. Необходимо отметить, что цепь питания +5В напрямую объединяет USB и пин питания +5В - это необходимо учитывать при работе с платой при использовании уже "штатного" питания проекта, разработки, макета. Для получения напряжения +3.3В на плате стоит интегральный стабилизатор типа AP7343 (крайне мелкая штучка в корпусе X2-DFN1010-4, если сгорит), +3.3В также на разъёме SWD напрямую подключен к цепи выхода стабилизатора, необходимо это учитывать при работе с SWD портом и USB портом, что бы не спалить стабилизатор или в программаторе, или на плате микроконтроллера. Так же на плате три кнопки - NRST (reset), BOOT0, и "пользовательская" кнопка, подключенная к PA0, светодиод питания и "пользовательский" светодиод, подключенный к PC13.

Теперь о программном обеспечении. По "правильному", конечно нужно использовать программное обеспечение STM32Cube от ST. Но мы же ардуинщики, никак не можем отвыкнуть от лаконичного ArduinoIDE. Тогда "неправильный" путь на скриншотах ниже. Ссылка на репозитарий: https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json

После этого появится возможность выбора плат stm32. На скриншотах приведены настройки ArduinoIDE для работы с stm32f401CCU6.

Но загрузить что-то в контроллер не получится - необходим программатор - STM32CubeProgrammer или любой другой, умеющий работать с stm контроллерами. Ссылка на весь последний софт от ST (с определенного момента st повернулось филейной частью, видимо ждет пинка). А здесь версия 1.4.0 stm32CubeProgrammer, к сожалению с новой версией не нормально работает мой ST-Link\V2 (нет коннекта с платой контроллера). Зачем еще какой-то "свисток", спросите Вы - отвечаю - в моем не совсем видимо родном контроллере тупо на логическом уровне не пашет USB (РА12 и PA11) - следовательно все радости загрузки через DFU, наличие последовательного порта "поверх" USB отсутствует. Потратил я практически два вечера, сменил пару кабелей, распаял на прямую, загадил stm ПО все компьютеры в доме и под виндой, и под ubuntu, смотрел осциллографом - в ответ на пакеты контроллер просто молчал.... Виндоувс выдавал - ошибка запроса дескриптора... Самое полезное из сего занятия - я разобрался а протоколе USB. И разобрался с алгоритмом загрузчика stm. Кому интересно - здесь документация по stm32 bootloader (в архиве два pdf документа - общая документация по алгоритмам загрузчика по сериям контроллеров и конкретно по USB DFU серии stm32f4хх). В моем конкретном случае видимо что-то не в порядке с "логической" частью - D+ в высоком уровне, D- в низком (высокая скорость), то есть можно предположить, что входные цепи "живы" (обычно наблюдается что-то среднее между 0 и 1 при неисправных пин контроллера). Пины не "шунтируют" сигнал от USB хоста. С точки зрения электроники все выглядит красиво.

Осциллограмма пакета протокола USB
Осциллограмма пакета протокола USB

Соответственно, "железным" способом подтягивался BOOT1 (PB2). И, конечно все подверглось "прозвонке" и "пропайке". В пользу неисправности порта USB говорят и опыты по загрузке тестовых примеров работы с USB и HID загрузчика....

Если уважаемый читатель знает рецепт исправления оказии с USB - напишите в комментариях.

Ладно, USB потерян - дареному коню в зубы не смотрят....

Берем ST-Link ( у меня V2), благо остался "набор" от работы с "голубой пилюлей", подключаем к плате. Тут все просто - запутаться невозможно.

Программатор ST-Link V2
Программатор ST-Link V2

Запускаем stm32CubeProgrammer - подключаем ST-Link, получаем сообщение о устаревшей прошивке программатора, жмем upgade - в открытом окне ловим новую ошибку....ST-Link is not in the DFU mode.

DFU просто преследует меня сегодня.....
DFU просто преследует меня сегодня.....

Причем обновление в программе STLink Utility имеет такую же ошибку.... одни и те же программисты писали.

Решение: все закрываем, программатор STLink отключаем от USB, запускаем stm32Cubeprogrammer, нажимаем кнопку firmwareuprade, подключаем ST-Link, далее Refresh device list, Open in update mode (два раза). Наблюдаем информацию о программаторе, обновляем прошивку. Может это где-то и описано в документации, и, точно stm-профессионалы это знают....

Подключаемся к плате - и видим - камень у нас D/E.... вместо B/C. И флеш 384 кБайта.... Интересно, а ОЗУ 64 кБайта или 96? А маркировка - CCU6.

А вот это интересно....
А вот это интересно....

Конечно, после таких "плюшек" смотрим кварцы - ну тут вроде как все как надо 25 мГц и 36 с копейками килогерц... А вот сомнения подкрались - перемаркировка? Выбраковка? И вообще, какой "зверь" под личиной данного камня? И USB уже не удивляет.... В первой банке был залит аккурат HID bootloader от WeActStudio.... (https://github.com/WeActStudio/WeAct_HID_Bootloader_F4x1). Зачем? Далее уже не очень интересно (да для кого-то и написанное наверно не новость), мигалка прошивается и так далее.

"Потеря" USB интерфейса вызывает неудобство и с отладкой программы: тут или "допиливать" ST-Link версии 2 (SWВ) до 2.1 (SW+VCP), что я делать не очень хочу - в программаторе клон stm, и какие чудные прелести могут открыться и чем с ними бороться - может быть отдельной историей, и не факт, что с счастливым концом, или использовать USB to TTL преобразователь интерфейса (фраза to TTL вроде как и не обещает заветного "обрезанного" RS232..., ну вот такие чудные рисовые поля).

USB преобразователь интерфейса
USB преобразователь интерфейса

Мой преобразователь определяется как USB SERIAL CH340 (COM). Собран на хорошо известной по дешевым платам ардуино CH340, и не должен вызвать проблемы с поиском драйвера. Джампер переключает питание 3.3В и 5В (если установлен между контактами Vcc и 5В, выход 5 вольт). Стоит отметить, что уровень сигнала в режиме 3.3В на ТХ и RX достигает 3.8 В, что несколько великовато для логики 3.3 В, но вполне приемлемо для работы с пилюлями. В режиме 5В на сигнальных выводах напряжение достигает 5В.

Обратная сторона преобразователя интерфейса
Обратная сторона преобразователя интерфейса

Подключение - все понятно - RX, TX, GND к пин UART1 интерфейса платы контроллера (PA9-RX, PA10-TX). Теперь можно в скетче указать вывод Serial.begin. Заливаю скетч с передачей по UART из примеров - в ответ тишина.... Меня терзают смутные сомнения... как говорил один персонаж из известной комедии. Пишу скетч, "мигающий" всеми доступными портами платы контроллера. Порты B15, A8-A11 мертвы.... Купила мама коника, а коник без ноги.... и UART1 там же, и USB. Я и до этого конечно жег порты контроллеров, но тогда четко прослеживалась моя рукопригодность, а тут - обидно, ничего ведь не делал. Предположение о плохой пайке тоже не оправдалось, к сожалению. Итого: на руках подгорелый контроллер, по моей вине или нет - неизвестно.

Ну а получить общение по UART в таком случае можно использовав HardwareSerial. Проверено, работает.

HardwareSerial Serial2(PB7, PB6);

void setup() {

Serial2.begin(115200);

Serial2.print(F("Serial OK!"));

............

Примерно так.

Выводы не однозначные - с одной стороны для быстрого решения проблемы управления "железякой" в проекте с минимальной затратой времени - Arduino, без сомнения. С другой стороны - даже небольшой "контакт" с stm32 заставляет "глубже" ковырять документацию, использовать другие инструменты разработки (пришлось с ArduinoIDE перейти на stm32Cube, иначе многое остается "за бортом"), более точно понимать какие алгоритмы и процессы стоят за той или иной строкой кода, да и возможности stm32 более привлекательны. Однозначно стоит отвлекаться на работу с этими микроконтроллерами - чем больше "ковыряешь", тем большие возможности получаешь.

Благодарен за потраченное на чтение время, сильно не ругайте, я еще тот "программист".

С уважением.