Stm32f103 после заливки программы не работает usb
Перепробовал все, от примеров до уроков. Проблема вот в чем. Подсоединяю плату в юсб, она включается, но юсб не работает, нужно нажать и немного подержать ресет на плате, тогда все ок, юсб поднимается и работает, данные шлю туда сюда без проблем. Но стоит опять опять сделать ресет, юсб пропадает и не поднимется пока не отключишь питание и не повторишь все снова. Работать невозможно, отлаживать тоже, постоянно перетыкать приходиться((
Что пропустил, или не то что то, помогите пожалуйста? __________________Помощь в написании контрольных, курсовых и дипломных работ здесь
HID-USB на STM32F103C8 вынос мозга
Пытаюсь сотворить HID-USB на STM32F103C8. Использую CoolCox, вот такую платку и отладчик J-Link от.
USB CDC на STM32F103C8 в минимальном размере
Подскажите либы для организации CDC как виртуальный ком порт (с STшным драйвером) чтоб был.
STM32f103c8, USB - ограничение длины изохронной передачи
Добрый день! Пытаюсь сделать USB audyo устройство. Устройство работает, но я наткнулся на.
Проблема с USB концентратором: "Нехватка электропитания порта концентратота usb".
проблемы с материнской платой.суть проблемы такова-случайно задел системник рукой и в трее сразу.
Новую тему создавать не буду, название абсолютно подходит и моей проблеме.
Камень STM32F103C8, среда Keil 4, завожу USB (виртуальный som-порт от ST).
Завелось, c жёсткой подтяжкой проводом, код Set_System (без всякого хлама) выглядел в таком виде. Структура инициализации прерываний заменена прямыми установками, потому что со структурой USB не определялся (сбой запроса дескриптора устройства), но скорей всего проблемы где-то в другом (см далее).
Фрагмент из "hw_config.h":
Set_System (hw_config.c) изменился, добавилось:
<ul><li>пустой цикл "for" о котором будет сказано позже</li><li>тактирование GPIO</li><li>структура для GPIO и её инициализация</li><li>прямая инициализация GPIO через регистры</li></ul> В файл hw_config.c ещё добавлена одна функция Delay_ms, которая никогда ниоткуда не вызывается.
А теперь, что я имею на выходе.
Уровень оптимизации -O3
Функция Delay_ms полностью закомментирована
Прямая инициализация GPIO через регистры
Пустой цикл "for" при b < 257 (и более)
USB устройство обнаруживается
Уровень оптимизации -O3
Функция Delay_ms полностью закомментирована
Прямая инициализация GPIO через регистры
Пустой цикл "for" при b < 256 (и менее) или цикл закомментирован
Сбой запроса дескриптора устройства
Уровень оптимизации -O3
Функция Delay_ms раскомментирована
Прямая инициализация GPIO через регистры
Пустой цикл "for" (значение не важно; раскомментирована или закомментирована)
USB устройство обнаруживается
Уровень оптимизации -O3
Функция Delay_ms раскомментирована
Инициализация GPIO через структуру
Пустой цикл "for" при b < 256 (и менее) или цикл закомментирован
Сбой запроса дескриптора устройства
Уровень оптимизации -O3
Функция Delay_ms раскомментирована
Инициализация GPIO через структуру
Пустой цикл "for" при b < 257 (и более)
USB устройство обнаруживается
Уровень оптимизации -O0
Функция Delay_ms полностью закомментирована
Прямая инициализация GPIO через регистры
Пустой цикл "for" закомментирован
USB устройство обнаруживается
Уровень оптимизации -O0
Функция Delay_ms полностью закомментирована
Прямая инициализация GPIO через регистры
Пустой цикл "for" при любом значении
Сбой запроса дескриптора устройства
Уровень оптимизации -O0
Функция Delay_ms раскомментированна
Прямая инициализация GPIO через регистры
Пустой цикл "for" при любом значении или закомментирован
Сбой запроса дескриптора устройства
Уровень оптимизации -O0
Функция Delay_ms раскомментированна
Инициализация GPIO через структуру
Пустой цикл "for" закомментирован
USB устройство обнаруживается
Уровень оптимизации -O0
Функция Delay_ms раскомментированна
Инициализация GPIO через структуру
Пустой цикл "for" при любом значении
Сбой запроса дескриптора устройства
Уровень оптимизации -O0
Функция Delay_ms полностью закомментирована
Инициализация GPIO через структуру
Пустой цикл "for" закомментирован
Сбой запроса дескриптора устройства
Уровень оптимизации -O0
Функция Delay_ms полностью закомментирована
Инициализация GPIO через структуру
Пустой цикл "for" при b < 1426 (и более)
Сбой запроса дескриптора устройства
Уровень оптимизации -O0
Функция Delay_ms полностью закомментирована
Инициализация GPIO через структуру
Пустой цикл "for" при b < 1425 (и менее)
USB устройство обнаруживается
Может что-то упустил. Но совершенно не понимаю от чего это зависит, и почему именно так.
Прям нигия программирования.
Весь код hw_config.c
/* Exported functions ------------------------------------------------------- */
void Set_System(void);
void Set_USBClock(void);
void Enter_LowPowerMode(void);
void Leave_LowPowerMode(void);
void USB_Ymtirrupts_Config(void);
void USB_Cable_Config (FunctionalState NewState);
void Homdle_USBAsynchXfer (void);
void Get_SerialNum(void);
/************************ (C) COPYRIGHT STMicroitistronics *****END OF FILE****/
Просто завести подтяжку на любой свободный пин и дёргать им вручную?
При инициализации сначала конфигурируешь ножку PA12 на выход, переключаешь в ноль и ждёшь чуть-чуть. Потом возвращаешь в аналоговый вход и инициализируешь периферию USB. Тогда всё отлично энумерируется заново при сбросе.
Видел такое, но это ж прямой путь к КЗ, если хост что-то передавать надумает. Согласующих резисторов для ограничения тока явно недостаточно.
Там есть резисторы в линии (по 22 ома). Так что не коротнёт.
Я этот способ подсмотрел, если мне не изменяет память, в их родном загрузчике.
Вот схемка на всякий случай.
USB хостам такое норм. Согласующих резисторов достаточно для того, чтобы не случилось токового пробоя ключей (если бы не было других защит, а они у хоста есть, плюс само внутреннее сопротивление слаботочных ключей достаточно высокое), а нескольких миллисекунд не достаточно для перегрева никакого ключа при таких маленьких токах. К тому же по стандарту хосты должны переживать замыкание любых линий кабеля в течении не менее 24 часов (защита от плохих кабелей).
Ну, про трэшняк в STшном коде только ленивый не слышал)
Ну, про трэшняк в STшном коде только ленивый не слышал)
Речь не про ST, а про авторов blue pill (mapple mini).
Да, смотрел.
Почему у них 10К подтяжка стоит алсо? По интернетам куча тем с глючащим USB, фиксящимся перепайкой на стандартный..
Последнее исправление: izzholtik 17.06.21 11:46:55 (всего исправлений: 1)
вопрос даже не в том, «как», а в том, «как правильно
Если уж совсем правильно, то надо делать как у олимекса вот в STM32-H103. Но я бы стал такое делать только в серийном изделии, и то подумал бы.
Тебе не нужно полагаться на защиту хоста. Всё очень просто - слаботочные ключи не способы выдать большой ток из-за высокого внутреннего сопротивления.
Аналогичная ситуация и для AVR, и для STM32, и для примёмопередатчика хоста (может быть вариация в 2-3 раза). Даже самое настоящее короткое замыкание не позволит току превысить несколько десятков миллиампер. Тебе будет очень сложно найти МК с такими мощным ключом на рядовом GPIO (по банальной причине - мощный ключ, да на 480 МГЦ (USB High Speed) значительно удорожит чип, но дорогой чип уж точно будет оснащён защитами, требуемыми стандартом USB). А тут оно даже не короткое, а через гарантированные 22 ома.
Токовый пробой таким образом получить невозможно чисто технически. В самом плохом сценарии - перегрев. Но на токах в десятки ма перегрев займёт многие секунды, если не минуты.
А тебе надо притянуть к земле на субсекундный срок.
KivApple ★★★★★ ( 17.06.21 11:55:56 )Последнее исправление: KivApple 17.06.21 12:00:07 (всего исправлений: 2)
maple mini и blue pill таки отличаются. у maple mini подтяжка заведена не напрямую на плюс, а управляется и PB9 и USB питанием.
maple mini и blue pill таки отличаются. у maple mini подтяжка заведена не напрямую на плюс, а управляется и PB9 и USB питанием.
Это подтяжка «вверх». А мы сейчас обсуждаем как притянуть D+ «вниз» при инициализации USB. Для этого в maple mini (в загрузчике) делают как я написал - переключают ножку D+ в режим GPIO, и кратковременно подают на неё ноль. И это отлично работает.
Её разве хост вниз не тянет?
Для своих поделок ты можешь пуллап прицепить к любой свободной ноге. Без мосфета! Проверено, это работает.
Правильней на ногу, которой ты управляешь подтяжкой 1.5к, при инициализации кратковременно подать 0. В этом случае и ток небольшой будет (через 1.5кОм-то!), и хост поймет, что устройство отключилось.
О, пасиб. Мне как раз очень лень стало искать, куда можно припаять на плате.
Хост тянет вниз через резистор 15К. Устройство тянет вверх через 1.5К. (на blue pill запаян резистор 10К, это неправильно, но работает). 1.5К побеждает, хост видит на D+ единичку, и понимает, что есть устройство.
Нам нужно, чтобы при сбросе (при старте/рестарте программы) подтяжка 1.5К кратковременно отключалась. Но она у нас не отключается, поэтому мы вместо отключения замыкаем D+ на землю. Хост видит, что устройство отключилось. Потом мы отключаем D+ от земли, подтяжка снова тянет D+ вверх, хост находит наше устройство, происходит энумерация.
Можно спокойно отлаживать прошивку без передёргивания. (И без перепайки).
Beewek ★ ( 17.06.21 15:38:57 )Последнее исправление: Beewek 17.06.21 15:40:05 (всего исправлений: 1)
ЕМНИП так было в первых версиях и потом они всё исправили. Но китайцы начали клонить первую версию. Сейчас уже выпускаются с нормальным резистором и у некоторых китайцев уже можно нормальную версию найти (у меня уже норм).
Но лучше все же выкинуть этот неправильный R10 на 10кОм и впаять вместо него 1.5кОм между ногами А12 и А15
У меня этих blue pill штук шесть в наличии. Часть собраны в различные макеты, часть вставлена в бредборды для проверки небольших кусков. Все перепаивать - лень, да и смысла не вижу. И так работает.
зачем заниматься техноонанизмом с неизвестным результатом, если можно сделать нормально подтяжку вверх?
максимальный ток пина - 25 мА. сопротивление канала нижнего плеча выхода - менее 65 Ом (при 20 мА токе напряжение на пине не более 1.3В). итого при подаче на D+ 3.3В от мертвого хаба через пин потечет ток 38 мА, что более чем в полтора раза превышает максимально допустимый.
не, может МК и выживет. а может и поджарится…
итого при подаче на D+ 3.3В от мертвого хаба через пин потечет ток 38 мА
Подавай уж сразу 220В, если начал фантазировать. Чего мелочиться.
Но даже если будет 38мА (хотя откуда им взяться, если макс. ток, который может выдать пин, 20ма?), то за пару микросекунд не сгорит.
хотя откуда им взяться, если макс. ток, который может выдать пин, 20ма?
а вы не пробовали внимательно прочитать даташит, а не брать первую показавшуюся знакомой цифру из него? :)
20 мА - это максимальный ток, который может протекать длительно через пин при нормальной работе. и при этом напряжение на пине будет ниже 1.3В, да. если напряжение на пине сделать выше - то и ток, внезапно, будет больше. вот только чипу это сильно не понравится (пушо в absolute maximal ratings - 25 мА на пин).
Данное руководство по прошивке микроконтроллеров STM32. В частности и на примере blue pill, на которой установлен контроллер STM32F103C8T6. Если вы знакомы с ардуино, то понимаете, что контроллер можно прошить программатором, либо через встроенный загрузчик. Но в отличии от AVR, и arduino в семействе STM32 загрузчик уже зашит в микроконтроллер. Да, не нужно прошивать загрузчик в пустой кристалл! Он уже зашит с завода, и зашит так, что он не может слететь. Что бы вы не вытворяли с STM32 загрузчик не слетит.
И при этом его в отличии от AVR не окирпичить неправильно зашитыми фьюзами! Неграмотными действиями при прошивке вы не убьете STM32, не переживайте! Да AVR можно восстановить высоковольтным программатором, но у всех ли он есть? Я собирал AVR FUSE BIT DOCTOR для этого. Был грешок, косячил с тактированием.
Теперь о 2х самых распространенных. Это через этот самый загрузчик и через отладочный разьем. В первом случае потребуется USB то UART переходник. Кто пользуется ардуино у них эти переходники или есть, или распаяны на плате с ардуино.
Если нету, то лучше купить внешний, например такой
CH340G RS232
Прошивка STM32 (STM32F103C8T6 )через UART, через выстроенный загрузчик.
Для прошивки через встроенный загрузчик потребуется программа Flash Loader Demonstrator.
Во первых переходник нужно переключить на напряжение 3,3 вольта.
Перемычка на 3,3 вольта
Установка перемычек
Запустить программу Flash Loader Demonstrator и выбрать в ней COM порт, к которому подключена плата (если в компьютере у вас нет ком порта, то в списке будет всего 1 порт, не ошибетесь).
Выбор порта в программе flash loader demonstrator
Дальше, если все верно подключено, то программа выведет вот такое вот окно.
Контроллер обнаружен flash loader demonstrator
Тут выбирать больше не чего, и нужно нажать кнопку NEXT. На следующей вкладке программы, на которой тоже ничего интересного, просто служебная информация, которая мало кому интересна, трогать тут ничего не нужно, и смело можно жать NEXT.
А вот на следующей вкладке нужно выбрать файл который нужно прошить.
Выбор файла для прошивки
Больше тут ничего трогать не надо, жмем порядком надоевший NEXT, и запускаем тем самым процесс прошивки.
Прогресс бар прошивки
Шкала пробежит 2 раза, один раз прошивка, второй раз сравнение того, что прошилось с оригинальным файлом, так программа проверяет, все ли правильно прошилось и не попал ли какой мусор. После этого программа гордо выведет на экран вот такое вот окно.
Окончание прошивки микроконтроллера
Поздравляю! Прошивка в плате, что бы она запустилось, нужно вернуть перемычку на плате на место.
Прошивка через отладчик.
Плата Stlink ST-Link V2
Китайский клон ST-LINK V2 для STM32
Соответственно это все китайские клоны, но они прекрасно работают и даже в них самих можно обновить прошивку через программу STM32 ST-LINK Utility.
Прошить контроллер так же просто как и с помощью загрузчика, даже еще проще. Для начала нужно подключить STLINK к bluepill. В голубой таблетке для этого выведены отдельные 4 линии, для питания и отладки. На платах есть вся необходимая маркировка, схема не нужна.
Дальше необходимо запустить программу STM32 ST-LINK Utility
STM32 ST-LINK Utility
Для открытия файла с прошивкой необходимо выбрать File->OpenFile и выбрать файл для прошивки
STM32 ST-LINK Utility с открытым файлом
Что бы подключиться к контроллеру необходимо нажать эту кнопку. Контроллер уже должен был быть подключен к программатору, а программатор (отладчик, STLINK, называйте как хотите), к USB порту. Драйвера на ST-Link искать не нужно, они автоматически ставятся с утилитой.
STM32 ST-LINK Utility подключение к микроконтроллеру
Для запуска процесса прошивки необходимо выбрать пункт Target->Program или Target->Program & Verufyty. Во втором случае помимо прошивки, произойдет еще чтение зашитой прошивки обратно и сравнение её с оригиналом, на предмет косяков и мусора. Так вы будете знать, зашилась прошивка верно, или что то пошло не так.
STM32 ST-LINK Utility заливка прошивки
STM32 ST-LINK Utility заливка прошивки -старт
Сама прошивка занимает немного времени.
STM32 ST-LINK Utility процесс заливка прошивки
После успешной прошивки увидите вот эту надпись.
STM32 ST-LINK Utility процесс заливка прошивки
Поздравляю! микроконтроллер прошит.
И ничего в этом сложного не было. В любом случае, если остались вопросы, то пишите в группу в VK
Итак. Не будем здесь описывать для чего нужна данная плата. Думаю те кто ей заинтересовался знают о ее возможностях.
Но распиновку устройства все-же покажу для наглядности:
Я лишь покажу здесь как подключить usb/ttl или st-link для прошивки устройства. И как подготовить программу arduino ide для прошивки stm32.
Чтоб начать работу данной платы с arduino ide. Нам необходимо подключить usb/ttl конвертер к плате следующим образом:
ВАЖНО! Микроконтроллер stm32 имеет 3.3 вольтовую логику. Следовательно и usb/ttl должен быть таковым. Я же прошивал на видео обычным, который имеет 5 вольтовую логику. Но это не правильно. Всегда есть риск спалить устройство.
Также нужно поставить джампер как показано на картинке.
Итак, после того как подключили конвертер к плате и поставили перемычку правильно. Нам нужно скачать несколько приложений:
После того как все скачали, разархивируем архивы. Устанавливаем программу STM32 Flash loader demonstrator. Она не устанавливается на рабочий стол. Ее можно найти по слову deminstrator gui. После того как установили приложение. Откроем его.
И откроется первое окно, в котором выбираем COM порт которым определился usb/ttl конвертер. И нажимаем кнопку далее.
Тут выбираем какая у нас плата. Возможно выбрать из двух вариантов. на 64К и на 128К. В моем случае это на 64К. Как определить? Если у Вас микроконтроллер STM32F103C8 то это 64К. А если STM32F103CB то это 128К.
Ну и тоже нажимаем далее. После этого начнется загрузка .bin файла.
После загрузки закрываем программу.
И открываем Arduino ide.
Если Вы ахив Arduino_stm32 положили корректно по пути Документы/arduino/hardware/ То при открытии программы Arduino ide в Инструменты в выборе платы должна появиться возможность выбора платы:
И все у Вас замечательно загрузится в микроконтроллер.
Но платы STM32F103C8T6 часто предлагают на aliexpress сразу с программатором st-link v2. С ним скетч в плату загружается гораздо быстрее. У него сразу 3.3 вольтовая логика, какраз которую хочет наш контроллер. По этому правильнее будет грузить программы в контроллер через st-link. Для этого подключим его к плате следующим образом:
На этом все. Спасибо за внимание. Надеюсь статья помогла Вам.
Читайте также: