stm32f103c8t6 - ограничения на использование пинов
- Войдите на сайт для отправки комментариев
Известно, что на Arduino Uno/Nano настоятельно не рекомендуется использовать пины 0 и 1 (USB), хотя они и выведены на общую гребенку.
1. А мне вот очень хочется использовать PB2-BOOT1, которого на гребенке нет. Возможно ли это? Если "да" - с какими ограничениями? Если "нет" - почему? Сейчас пока заменил перемычку на нем на резистор 10к, вроде, проблем пока не появилось.
Ну и, заодно, как следует относиться к другим пинам:
2. PA13-SWDIO, PA14-SWCLK - выведены на ST-Link.
3. PA11-USB-, PA12-USB+.
4. PC14-PC15 - похоже, на них сидит часовой кварц (?).
5. PA9-TX1, PA10-RX1 - где-то попадалась информация, что Serial и Serial1 для stmduino - одно и то же, используется для совместимости, но у меня при работе Serial через USB на ноге PA9 ниченго нет (если бы система трактовала его как COM-порт, на нем, минимум, были бы 3.3В).
6. Возможно, забыл что-то еще.
1. На НАНО нет USB-пинов и пины 0.1 это UART0 (Rx, Tx), которые просто уже подключены к переходнику UART-USB. Соответственно, пользоваться ими можно, но не рекомендуется просто потому, что любое их использование будет с неизбежностью "отражаться" в переходник и в общем-то требуется понимать эту взаимосвязь, но и только.
2. Думаю аналогичная "проблема" существует и для ПЛАТ на базе STM .. где часть пинов УЖЕ куда-то разведена.
Так, к примеру, мне попадалась китайская Ардуино Мега, у которой 13-й пин (светодиод) висел с приличным гасящим сопротивлением (меньше килоома) и считать с этой ноги что-то полезное оказалось проблематичным.
Использовать его можно, но с оговорками. Если используется загрузчик, то этот пин во время старта МК должен быть прижат к земле. В остальное время -- пофиг.
Если отладка не нужна, можно использовать, как пины общего назначения.
Загрузчик использует юсб, в т.ч. для организации передачи данных на хост через serial. Если это не требуется, пины можно переконфигурировать под свои нужды.
Это так. А на пинах PD0 и PD1 сидит кварц HSE.
Не встречал такого, но спорить не стану.
Можно юзать все пины... если нужно... Надо только вычитывать даташит на возможные ограничения... типа... установки определённых режимов пинов по сбросу и во время сброса... включения подтяжек... ограничения по току пина и т.д. ...
5. PA9-TX1, PA10-RX1 - где-то попадалась информация, что Serial и Serial1 для stmduino - одно и то же, используется для совместимости, но у меня при работе Serial через USB на ноге PA9 ниченго нет (если бы система трактовала его как COM-порт, на нем, минимум, были бы 3.3В).
Одно и тоже -это "SerialUSB" и "Serial", CDC USB инитится в stmduino по умолчанию. А вот Serial c циферками 1,2,3 -это работа соответствующими "железными" портами. Кстати в документации есть полезная страничка-справка по всем командам, типа как на этом форуме в разделе "программирование". Почему то с заглавной страницы на неё нет прямой ссылки. Ну или я не увидел.
Одно и тоже -это "SerialUSB" и "Serial", CDC USB инитится в stmduino по умолчанию. А вот Serial c циферками 1,2,3 -это работа соответствующими "железными" портами.
Спасибо. Путем собственных экспериментов я пришел к таким же выводам, но в И-нете лично мне этого утверждения не попадалось. (так что будем считать, что теперь "попалось" :)
Кстати в документации есть полезная страничка-справка по всем командам, типа как на этом форуме в разделе "программирование". Почему то с заглавной страницы на неё нет прямой ссылки. Ну или я не увидел.
А вот с этим я пока не разбирался. Уже успел понять, что Maple и Blue Pill - достаточно близки, но точно знаю и то, что между ними существуют различия. Поэтому пока на данном уровне не знаю, в какой степени документацию от одного можно использовать для другого.
PS. Да, собственно, та проблема, с которой я долго пытался бороться программным путем, как оказалось, имеет аппаратную причину. После замены экземпляра контроллера все работает почти так, как я ожидаю. Пока, вроде, замечена одна маленькая странность, если вывод в Serial есть только в setup(), то в консоль он не попадает. Чтобы попал, хотя бы одна строчка должна выводиться и из loop().
А вот с этим я пока не разбирался. Уже успел понять, что Maple и Blue Pill - достаточно близки, но точно знаю и то, что между ними существуют различия. Поэтому пока на данном уровне не знаю, в какой степени документацию от одного можно использовать для другого.
Я сильно не углублялся в различия, можно например использовать нумерацию выводов от maple. Но смысла нет:)
. Пока, вроде, замечена одна маленькая странность, если вывод в Serial есть только в setup(), то в консоль он не попадает. Чтобы попал, хотя бы одна строчка должна выводиться и из loop().
Ага :( , либо паузу поставить в несколько секунд. Что б успеть открыть монитор порта после старта программы..
Добрый день. Тоже столкнулся с ограничением использования пинов. Мне необходимо использовать USB пины в своих целях (PA11 PA12). Но если в скетче написать простой блинк, то переключение пинов не происходит:
Похоже что где-то эти пины используются. Возможно тем же USB Serial. Можно ли как-то их использовать?
Если я в Setup напишу SerialUSB.end(); то получаю ошибку:
error: 'SerialUSB' was not declared in this scope
Если я в Setup напишу SerialUSB.end(); то получаю ошибку:
error: 'SerialUSB' was not declared in this scope
порт называется Serial - можете попробовать выключить его, но не факт что поможет, для этого в библиотеке должно быть не просто выключение порта, но и освобождение пинов
Не пробовал на ардуинском иде, но на других достаточно самому после всей инициализации - т.е. в конце setup- переопределить режим ноги http://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/0.0.12/lang/api/pinmode.html#lang-pinmode и нога в твоём распоряжении. Даже не отключая порт. Порт работает, но с ногой не связан.
Ядро использую stm32duino: https://www.stm32duino.com/index.php
Я использую STM32F103C8T6 (Blue Pill). Немного порылся, нашел в ядре библиотеку usb_serial:
Внимание! Большие спойлеры! Вот содержимое файлов:
usb_serial.ccp
usb_serial.H
Вроде бы есть команда (если я правильно понял как она пишется):
Но если ее прописать в Setup, то получаю ошибку:
Если заглянуть внутрь функции END(); то можно увидеть следующее:
Дальше, заглянем в board.h от моей платы, и там увидим:
Из всего этого:
1) не понятно как правильно вызывать отключение USBSerial
2) Похоже на то что даже не указано что именно нужно отключать. А это пины PA11 и PA12
можете помочь во всем этом разобраться?
nik182, только что попробовал повторно сделать инициализацию пинов в основном цикле. Не работает.
Ну так в мануале и сказано. As soon as the USB is enabled, these pins are connected to the USB internal transceiver automatically. Все остальные можно отключать, а USB нет. А USB->CNTR=2; для выключения Кларковский аддон не понимает. СТМовский аддон понимает, компилирует и работает. Но у него есть есть в настройках среды опция без usb-serial, которая и так отключает USB. C Кларковским аддоном я не разбирался. Как отключить УСБ не подскажу. Могу только предложить тупо записать 2 по физическому адресу USB->CNTR регистра смещение 0х40 от базового 0x40005C00, т.е. 0x40005C40.
Кларковский аддон съел это и весело мигает на ногах А11 А12
Спасибо большое! Работает! Только что проверил, и digitalRead тоже работает!
Спасибо огромное!
forfrends, вообще-то blink на stm32 "весит" более 10К. Т.е. код инициализации stm32 под режим Ардуино дофига всего настраивает. В том числе питание, тактовый генератор и его многочисленные делители, USB, все имеющиеся таймеры и пр.
Вы пробовали Serial.end(), как Вам подсказали в 8 сообщении?
Поможет ли это Вам, не знаю, но USB при этом отключается, и следующая прошивка контроллера через USB будет возможна только при помощи кнопки перезагрузки.
Сейчас попробовал Serial.end() - работает!
Проблема была в том что для меня было совершенно не понятно как правильно эту команду написать. Я вместо Serial писал USBSerial, из-за чего выдавало ошибки.
Проблема была в том что для меня было совершенно не понятно как правильно эту команду написать. Я вместо Serial писал USBSerial, из-за чего выдавало ошибки.
слушайте, порт называется Serial. Я уже спрашивал, откуда вы взяли USBSerial - вы не отвечаете
b707, видимо от названия класса (из #10). Видимо ещё не знает, что класс и назначенный экземпляр класса могут иметь разные имена :)
Да, все верно, из библиотеки.
Сразу скажу, мой уровень знакомства с STM32 - получил из Китая платку, залил загрузчик и помигал диодом. Пытаюсь прощупать почву для перевода проекта c AVR на STM. Одна из задач - в цикле проверять сработку двух датчиков (короткий орицательный импульс). Для Atmega328 делаю это по регистру EIFR:
Поглядев инфу по регистрам прерываний STM32 запутался. Как будет выглядеть подобный участок кода для STM? Или может подскажете аналоги EICRA и EIFR, есть они? Механизм прерываний на сколько я понял там схожий?
Все регистры относящиеся к прерываниям на ногах описаны в мануале на MK - RM0008 , глава 10.3. Только зачем проверять в цикле, если после активации регистров доступны прерывания отдельные для первых пяти ног и одно общее на остальные?
vlad072, по-хорошему нужно не делать аналог старого решения , а заново переосмыслить, и найти более эффективные способы, благо stm32 открывает для этого широкие просторы. В конкретном случае всё зависит от того, что вы хотите делать с результатом. Ноги можно опрашивать по всякому, и не обязательно средствами триггера GPIO-прерываний. Можно например входами таймера.
зачем проверять в цикле, если после активации регистров доступны прерывания отдельные для первых пяти ног и одно общее на остальные?
Не хотелось бы использовать векторы, поскольку за один цикл "loop()" этих импульсов может поступить крайне много. Никакой "срочности" в обработке их нет, просто нужно зафиксировать факт обнаружения таковых.
что вы хотите делать с результатом
При обнаружении что за период цикла "loop()" импульсы были (один или миллион - не важно) выставить соответственные биты в переменной, хранящей флаги аварий, т.е. alarm |= ...
зачем проверять в цикле, если после активации регистров доступны прерывания отдельные для первых пяти ног и одно общее на остальные?
Не хотелось бы использовать векторы, поскольку за один цикл "loop()" этих импульсов может поступить крайне много.
тогда на таймерах... на них и таймаут можно выставить... и система грузиться циклами не будет.....
Не хотелось бы использовать векторы, поскольку за один цикл "loop()" этих импульсов может поступить крайне много. Никакой "срочности" в обработке их нет, просто нужно зафиксировать факт обнаружения таковых.
Не хочешь вектор, не бери. Поднял всю цепочку EXTI , а прерывание не активируй. В цикле можно проверить флаг в пендинг регистре (EXTI_PR) отреагировать на него и очистить. Тут хоть десяток импульсов придёт, после первого будет стоять и ждать пока не очистишь сам. Зато точно покажет что импульс был, даже если его сейчас нет.