Серийный USB и загрузчик на общих платах

Rogerclark
Пн, 04 мая 2015 г. 12:56 утра
Ребята,

Просто подумал, что опубликую о некоторых экспериментах, которые я проводил с встроенными серийными USB на общих платах и ​​загрузчике на общих платах


Многие люди не понимают, что серийный USB Maple не является частью загрузчика.

Серийный USB, скомпилируется в эскиз.
Итак, предполагая, что у вас установлены драйверы Windows - см. Файл BAT в папке Drivers....

Это означает, что вы компилируете для Maple Mini, но загрузите на общую плату, удалите usb -заглушку и снова положите ее обратно, плата появится в виде кленового сериала
(Предполагая, что у вас есть LOW, так что код работает непосредственно после его включения)

И вы наброски запускаются, и все, что вы выводите через серийный.println () появится, хотя виртуальный последовательный порт


Кроме того, можно загрузить загрузчик Maple на универсальную плату, и он появится в виде устройства Maple DFU, и вы можете загрузить, используя загрузку Maple (DFU UTIL)

Однако есть несколько проблем с обоими этими методами

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

Если вы используете Stlink, вам не нужно будет изменять настройку Boot0, но вам нужно снова отключить/ подключиться :-(

На Linux @Hull написал простую утилиту, которая сбрасывает USB -устройство, так что после загрузки Stlink он может сбросить USB -устройство, что означает, что ему не нужно удалять и воссоединяться.

Теперь я обнаружил, что есть способ сделать это в Windows, хотя в данный момент я делаю это вручную.
Есть утилита Microsoft под названием DevCon.exe, у которого есть команды для сброса USB -устройства

Итак, я могу загрузить, используя Stlink, затем сразу после завершения я запускаю вручную
#include void setup() { SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!) SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); unsigned char c; while (1) { Serial.println(SPI.transfer(c++)); delay(100); } SPI.end(); } void loop() { // put your main code here, to run repeatedly: }

victor_pv
Пн, 04 мая 2015 г., 3:41
Можем ли мы сделать загрузчик, чтобы отключить или сбросить периферийное устройство STM32 USB, прежде чем вызовать эскиз?
Если это так, это может привести к исчезновению USB -устройства, вызывая реконструкцию, когда эскиз снова позволяет USB.

Rogerclark
Пн, 4 мая 2015 г., 4:05
Я думаю, что эскиз может сбросить USB, он, безусловно, должен определить вывод диска в коде

Я не думаю, что это определено в загрузчике, но было бы легко добавить

Mrburnette
Пн, 04 мая 2015 г., 15:49
Оценка Windows, перечисление USB:

Датированное, но все еще актуальное обсуждение разработчика MS по перечислению.
http: // блоги.MSDN.com/b/usbcoreblog/arc ... эмин.aspx


Луча

victor_pv
Пн, 04 мая 2015 г., 18:41
Роджер, я не имел в виду сброс через штифт обнаружения, а скорее сбросить периферийное устройство STM32 USB. От прочтения руководства STM32, я понимаю, что есть способы отключения периферийных устройств, которые полностью выключат дифференциальные сигналы, поэтому Windows подумает, что устройство было отключено.
Теперь я не знаю, содержит ли они наброски весь код для повторного использования периферийного устройства USB, но я предполагаю, что, поскольку сериал USB можно использовать на плате без загрузки, поэтому код в эскизе должен содержать все Инициализация необходима.

Rogerclark
Пн, 04 мая 2015 г., 22:19
Виктор,

Технически это звучит, но я не уверен, почему Leaflabs добавили бы все эти дополнительные схемы E.глин. 2 транзистора и около 6 резисторов, если бы это было сделано в коде

Рик заметил, что на небольших общих платах STM32F103C8, которые я думаю, один из контактов USB (PA12) подтягивается до 3.3 В через 1.5K.
Это означает, что изначально штифт подтягивается резистором, поэтому USB удерживается в сбросе, пока код не работает в эскизе или загрузчике HWICH инициализирует USB -контакты.

Так что лучшая доска, на которой можно попробовать, это, возможно, эта доска.

Мы, конечно, могли бы переключить штифт с USB на GPIO и либо включить внутренний подтягивание, либо привести к нему высоко,

Но я до сих пор не знаю, почему Leaflabs не сделал бы этого, если бы это было возможно

Rogerclark
Пн, 04 мая 2015 г., 22:33
Ребята

Я добился некоторого прогресса с этим в Windows.

Во -первых, это будет работать только в случае загрузки адаптера Stlink для загрузки.
Вам также необходимо запустить IDE в качестве администратора, и вам нужен дополнительный файл, DevCon.Exe (32 или 64 -битная версия)


Я добавил несколько строк в конце моей локальной копии stlink_upload.летучая мышь, чтобы подождать 1 секунду, а затем позвоните DevConx64.Exe для сброса USB -устройства для платы.
Serial.begin(9600); delay(100);

mrbwa1
Вт 5 мая 2015 г. 14:25
Роджер,

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

Во всяком случае, если вы дойдете до точки в мире Windows, где вам нужно позвонить в некоторые утилиты командных условий или вещи, которые должны быть запускаются как администратор, я знаю, как написать некоторые небольшие программы, которые могут справиться со всем этим (включая обнаружение и выполнение соответствующая 32 или 64 -битная версия чего -либо).

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

Rogerclark
Вторник 5 мая 2015 г., 21:07
Это хороший момент в результате помощника

Я помню, как написал службу Windows (много лет назад), потому что мне нужно было немного ASP на сервере IIS, чтобы позвонить в функции аутентификации Active Director -пользователя, и мне нужно было надежно запустить это в повышенных привилегиях

Так что эта вещь можно было бы написано как сервис Windows, я не искал исходный код, но я думаю, что источник DevCon.EXE публично доступен, и я видел другие фрагменты C# кода, которые выполняют необходимые отдельные задачи


Я не думаю, что это будет идеальное или надежное решение, но некоторые люди, вероятно, будут в порядке, используя его. Эн.G Я знаю, что @ahull уже делает что -то подобное на Linux, где он загружает от Stlink, но использует USB Serial для серийного.Печать и т. Д

Это также может быть еще одним вариантом

victor_pv
Вторник 5 мая 2015 г., 21:12
Роджер, разве мы не можем установить загрузчик для отключения или сброса USB -устройства, пока эскиз не пойдет и запустите его снова?

Согласно RM00008, у нас есть два бита в регистре управления USB для игры:
Бит 1 pdwn: Power Down
Этот бит используется для полного выключения всех аналоговых деталей, связанных с USB, если он требуется
Полностью отключите периферийное устройство USB по любой причине. Когда этот бит установлен, USB
Периферийное устройство отключено от приемопередатчиков, и оно не может быть использовано.
0: выход питания вниз.
1: Введите режим питания вниз.

Bit 0 FRES: PIRCE USB RESET
0: Clear USB -сброс.
1: Заставьте сброс периферийного устройства USB, точно так же, как сигнализация сброса на USB. А
USB Peripheral проводится в состоянии сброса, пока программное обеспечение не очистит этот бит. А “USB-Ресете”
сгенерируется прерывание, если включено.

Я бы подумал, что если загрузчик установит PDWN на 1, это сделает плату электрически отключенной от USB.
Согласно RM00008, программное приложение должно установить этот бит на 0 как часть инициализации устройства, поэтому состояние сброса по умолчанию должно быть 1. Учитывая, что эскизы успешно используют серийный USB, код уже должен быть там, чтобы включить USB, нам нужно только сделать любой из этих двух:
1-DISABLE Устройство в DFU перед вызовом эскиза
или 2.- В серийном коде эскизов заставьте их установить USB на Powerdow.

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

Rogerclark
Вторник 5 мая 2015 г. 22:00
@ahull

Мы могли бы попробовать

Код загрузчика действительно относительно прост.

Чтобы построить его, вам просто нужно поместить местоположение компилятора Arm в свой путь

Тогда сделайте Maple-Mini

Вам нужно будет вытащить булавку кнопки (я забываю, какой он), а также прикрепить светодиод к светодиодной штифте (я думаю, что это PB1)

Я попытался перекомпилировать загрузчик для общей платы STM32F103C8.

Чтобы перенести светодиодный PIN -код в PC13, но я не могу заставить его работать в данный момент, поэтому самая легкая вещь, чтобы проверить этот USB

Но не стесняйтесь попытаться изменить код, его настройка в конфигурации.H, есть порт, булавка, маска, а также немного для часов RCC для порта GPIO, который необходимо изменить (что не сработало для меня ;-()

На этом универсальном STM32F103C8 Рик заметил, что PA12 вытягивается высоко через 1.Резистор 5K, который расположен под доской, мы думаем, что его R3

Если вы сможете получить код, чтобы отключить USB, этот резистор поднимет D-линию высоко и сообщит системе хоста, что USB сброшен


КСТАТИ. Я попробовал загрузчик на другой общей плате STM32F103C8, но он не сработал. Это может быть связано с тем, что у платы есть дефектный USB -соединитель, или, возможно, ему нужен этот резистор

Я знаю, что люди не любят пайки и т. Д.

Но простым решением может быть не программное обеспечение, а просто крошечная доска с 4 проводами, которые люди прикрепляют к доске

Кажется, это просто нужен 1 транзистор NPN и 2 резистора (см. Схема Nucleo)

Мы могли бы легко получить несколько печатных плат

Или, может быть, какая -то дочь / мать, в которую общая плата подключается (хотя это звучит немного излишне)

В любом случае, дайте мне знать, если вам нужна помощь в изменении загрузчика

КСТАТИ. Вы, вероятно, можете проверить одно и то же с помощью эскиза, если вы просто хотите проверить моделирование USB -сброса

я.e Напишите эскиз, который мигает светодиод в течение 5 секунд, затем сбрасывает USB -шину и посмотрите, уведомляют ли ваша хост -машина ;-)

victor_pv
Ср 6 мая 2015 г., 4:08
Роджер, я на самом деле уже попробовал это сегодня, отключив порт в программном обеспечении.
Он убивает последовательное соединение, но Windows не заметила никакого отключения USB, и не было никакой революции.
Я попробовал как сброс, так и паутину, ни один из них не вызвал повторную деятельность.

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

Но на самом деле, самым простым может быть просто использование ST-Link или USB для сериала для программирования, учитывая супер низкую цену любого, и что вам нужен только один или пара, не нужно добавлять дополнительное оборудование к плате.

Rogerclark
Ср 6 мая 2015 г., 4:21
Виктор

Я согласен, это не самое простое решение.

Devcon.Метод EXE действительно работает, но только при загрузке через STLINK, потому что я не могу получить время довольно правильно, заявляя DevCon вручную сразу после загрузки, и может быть, что он никогда не будет работать, чтобы переключаться между DFU и последовательным

Я создал версию «серийного» загрузчика загрузчика Maple, и он скомпилировал и перечислил в Windows в качестве последовательного устройства Maple.

https: // github.com/jonatanolofsson/mapl ... Эриал-Бут

Однако Leaflabs реализовал протокол AVR для загрузок (STK500), но я не уверен, какой загрузчик поддерживает этот протокол, он может быть стандартным загрузчиком AVR, но я не уверен

Я посмотрел на прошивку Esperino и загрузил ее на свой STM32F103ZET и появляется на USB как виртуальный последовательный порт STM Virtual Port. (К счастью, у меня уже были установлены драйверы STM для другой платы).
Esperino имеет код, который принимает те же команды, что и встроенный в аппаратное обеспечение чипа, я.E, который можно загрузить через STM32Flash

Код не выглядит таким сложным, поэтому я думаю, что лучший подход для общего загрузчика - это просто заставить плату постоянно появляться в качестве последовательного устройства Maple и иметь метод для переключения в режим загрузки. Я думаю, что то, что происходит в данный момент на Maple Mini, это то, что Maple_Loader.JAR File делает что -то вроде SET DTR, а затем отправляет специальную последовательность символов E.глин. 1aad1ab5 или что -то в этом роде

Когда код в эскизе видит эту последовательность, она перезагружается

Но нам нужно сделать что -то гораздо более сложное

Что нам нужно сделать, так это перенести весь USB-сериал в загрузчик и иметь возможность, чтобы эскиз перезвонил в загрузчик, чтобы выполнить загрузку, потому что перезагрузка чипа, приведет к повторному обновлению USB-материала загрузчик, и мы не хотим делать это, так как соединение будет облажаться к ПК

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

Я думаю, что смотреть на PIN_MAP в __flash__, вероятно, более важно на данный момент

Маленькие звуковые сигналы/зуммеры, которые на самом деле являются крошечными динамиками - Игрок RTTTL перенесен на STM32DUINO