Форум РадиоКот https://radiokot.ru/forum/ |
|
STM32f4xx + USB CDC + StdPerph https://radiokot.ru/forum/viewtopic.php?f=59&t=147151 |
Страница 1 из 2 |
Автор: | GFX [ Пт июл 28, 2017 23:32:56 ] |
Заголовок сообщения: | STM32f4xx + USB CDC + StdPerph |
Привет всем, замучился я с юсб из примера от ST ![]() |
Автор: | GFX [ Сб июл 29, 2017 09:37:30 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Например, вот все стандартно на библиотеке от ST http://mikrocontroller.bplaced.net/word ... ge_id=1263 Таких примеров море. Что мы видим, полное отсутсвие проверки, что можно пихать новые данные в ЮСБ, как так вообще? Задаю огромный буфер, но если пихать в юсб больше, чем этот буфер, то оно загинается через несколько секунд. Все примеры рассчитаны на отправку пары слов в минуту ![]() #define CDC_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ #define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ #define CDC_IN_FRAME_INTERVAL 0 /* Number of frames between IN transfers */ #define APP_RX_DATA_SIZE 1024*20 /* Total size of IN buffer: APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */ - это что типа и все на чем держится эта библиотека, задаем буфер побольше, скорость поменьше? это родная функция которая заполняет кольцевой буфер отправки, ничего не проверяя, отправились данные или нет, тупо по кругу в него гонит их и все //---------- // Ein Byte in den Sendepuffer eintragen //---------- void UB_VCP_DataTx (uint8_t wert) { APP_Rx_Buffer[APP_Rx_ptr_in] = wert; APP_Rx_ptr_in++; if(APP_Rx_ptr_in >= APP_RX_DATA_SIZE) { APP_Rx_ptr_in = 0; } } |
Автор: | oleg110592 [ Сб июл 29, 2017 10:24:22 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Все примеры рассчитаны на отправку пары слов в минуту тут не пару: http://tomeko.net/miniscope_v2f/index.php?lang=en Использована, насколько помню, стандартная ST библиотека, правда это STM32F0x2 USB Full Speed Device Library. Применял тоже эту библиотеку (Virtual COM Port), работало стабильно. Там же на сайте есть осциллограф на F1 и F3 - может пригодится. |
Автор: | GFX [ Пн июл 31, 2017 22:58:16 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
правда это STM32F0x2 Спасибо, но с F0 я его не портирую. У кого еще, что есть на примете?
|
Автор: | 240265 [ Сб авг 05, 2017 11:38:57 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
По вышепреведенной ссылке есть вариант miniscope_v2d там на Ф303 , посмотрите. |
Автор: | Juris [ Пн сен 04, 2017 12:15:10 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Вот это: http://forum.easyelectronics.ru/viewtop ... 17&t=27404 собран девайс на "BluePill" (F103), работает через BT или USB. Я пробовал, вещь рабочая. Цеплял и на Android, и на Windows PC. Мои фотки: http://bildites.lv/a/xfjbphbf#33yk2zed ---------- http://tomeko.net/miniscope_v2d/index.php?lang=en Я там тоже в конце статьи засветился - с переделанным "BluePill" , с чипом F303 ![]() |
Автор: | Reflector [ Пн сен 04, 2017 12:20:22 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
По-моему, проблема вообще надумана, кубом генерится проект под любой мк и потом убирается все лишнее, включая HAL, если он не нужен. |
Автор: | dosikus [ Пн сен 04, 2017 15:20:05 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
По-моему, проблема вообще надумана, кубом Не говори-ка, одно но - можно же сразу и без разгребания шлака калокуба/спл нормально делать... http://mcu.goodboard.ru/viewtopic.php?id=40 |
Автор: | Reflector [ Пн сен 04, 2017 15:47:46 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Не говори-ка, одно но - можно же сразу и без разгребания шлака калокуба/спл нормально делать... http://mcu.goodboard.ru/viewtopic.php?id=40 Это для F1/F3 и т.д., а нужно для F4. |
Автор: | GFX [ Пн сен 04, 2017 19:28:35 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
По-моему, проблема вообще надумана, кубом генерится проект под любой мк и потом убирается все лишнее, включая HAL, если он не нужен. Что-то говорит мне, что хол этот не разгрести, к тому же он лепит систему реально времени, на сколько я помню, но могу ошибаться. Мне хол и система реального времени не нужны. Самый простой путь, казалось бы, починить то, что есть, но я тонкостей работы юсб не знаю и в его реализацию в стм тоже не вникал. Может когда дойдут руки, а пока хотелось бы проверенное решение без зависаний и отвалов юсб.
|
Автор: | Reflector [ Пн сен 04, 2017 20:27:22 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Что-то говорит мне что хол этот не разгрести, к тому же он лепит систему реально времени, на сколько я помню, но могу ошибаться. Мне хол и система реального времени не нужны. Самый простой путь казалось бы починить то, что есть, но я тонклстей работы юсб не знаю и в его реализацию в стм тоже не вникал. Может когда дойдут руки, а поеа хотелось бы проверенное решение без зависаний и отвалов юсб. Нет там никакой системы реального времени, там в одном месте идет настройка портов и приоритетов прерываний, нужно заменить на свое, еще раз 5 встречается пауза завязанная на SysTick, ее тоже меняешь на что угодно, остается 3 *.c из HAL(stm32f4xx_ll_usb и пара stm32f4xx_hal_pcd/pcd_ex) и соответствующие хедеры, плюс еще парочка хедеров в которых всякие макросы/перечисления по мелочи... В принципе в таком виде уже все можно и оставить, единственная возможная проблема в том, что StdPerph и HAL писали одни и те же индусы, потому какие-то имена там могут пересекаться и тогда в той части где используется HAL их придется переименовать. |
Автор: | dosikus [ Пн сен 04, 2017 20:56:09 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Reflector, ты меня удивляешься. А чем юсб девайс отличается у линеек в старой периферии. На тебя г. либы так действуют? |
Автор: | Reflector [ Пн сен 04, 2017 22:06:35 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Reflector, ты меня удивляешься. А чем юсб девайс отличается у линеек в старой периферии. На тебя г. либы так действуют? Ты же про USB ничего не знаешь, взял готовую либу для F1 и пользуешься, а я брал кубовские проекты разных серий и максимально упрощал. У меня даже эндпоинты живут в отдельном классе и на одном из методов этого класса я могу продемонстрировать разницу между F1 и F4... Для примера возьмем метод Endpoint::activate() и ему сопутствующие, сначала для F4: СпойлерКод: void Endpoint::activate() { if (is_in) { USBxDev()->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (1 << num); if (!(in(num)->DIEPCTL & USB_OTG_DIEPCTL_USBAEP)) { in(num)->DIEPCTL |= (maxPacket & USB_OTG_DIEPCTL_MPSIZ) | (uint32_t(type) << 18) | (num << 22) | USB_OTG_DIEPCTL_SD0PID_SEVNFRM | USB_OTG_DIEPCTL_USBAEP; } } else { USBxDev()->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((1 << num) << 16); if (!(out(num)->DOEPCTL & USB_OTG_DOEPCTL_USBAEP)) { out(num)->DOEPCTL |= (maxPacket & USB_OTG_DOEPCTL_MPSIZ) | (uint32_t(type) << 18) | USB_OTG_DIEPCTL_SD0PID_SEVNFRM | USB_OTG_DOEPCTL_USBAEP; } } } auto USBxDev() { return (USB_OTG_DeviceTypeDef*)((uint32_t)hpcd.Instance + USB_OTG_DEVICE_BASE); } auto Endpoint::in(uint32_t i) { return (USB_OTG_INEndpointTypeDef*)((uint32_t)hpcd->Instance + USB_OTG_IN_ENDPOINT_BASE + i * USB_OTG_EP_REG_SIZE); } auto Endpoint::out(uint32_t i) { return (USB_OTG_OUTEndpointTypeDef*)((uint32_t)hpcd->Instance + USB_OTG_OUT_ENDPOINT_BASE + i * USB_OTG_EP_REG_SIZE); } Теперь F1/F3: СпойлерКод: void Endpoint::activate() { setType(type); setAddr(num); if (is_in) { btableGet(0) = (pmaadress >> 1) << 1; //setTxAddr(pmaadress); clearTxDTOG(); setStatus(EpTxStatus::Nak); } else { btableGet(4) = (pmaadress >> 1) << 1; //setRxAddr(pmaadress); setCntRxReg(rxCnt(), maxpacket); clearRxDTOG(); setStatus(EpRxStatus::Valid); } } volatile uint16_t& epref() { return *(&USB->EP0R + num * 2); } void Endpoint::setType(EpType type) { epref() = epref() & USB_EP_T_MASK | uint16_t(type); } void Endpoint::setAddr(uint16_t bAddr) { epref() = USB_EP_CTR_RX | USB_EP_CTR_TX | (epref() & USB_EPREG_MASK) | bAddr; } uint32_t& Endpoint::btableGet(uint32_t offset) { return *(uint32_t*)((USB->BTABLE + num * 8 + offset) * 2 + ((uint32_t)USB + 0x400)); } void Endpoint::clearTxDTOG() { if (epref() & USB_EP_DTOG_TX) { epref() = epref() & USB_EPREG_MASK | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_TX; } } void Endpoint::clearRxDTOG() { if (epref() & USB_EP_DTOG_RX) { epref() = epref() & USB_EPREG_MASK | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_RX; } } void Endpoint::setStatus(EpTxStatus state) { uint16_t regVal = epref() & USB_EPTX_DTOGMASK; if (USB_EPTX_DTOG1 & uint32_t(state)) regVal ^= USB_EPTX_DTOG1; if (USB_EPTX_DTOG2 & uint32_t(state)) regVal ^= USB_EPTX_DTOG2; epref() = regVal | USB_EP_CTR_RX | USB_EP_CTR_TX; } void Endpoint::setStatus(EpRxStatus state) { uint16_t regVal = epref() & USB_EPRX_DTOGMASK; if (USB_EPRX_DTOG1 & uint32_t(state)) regVal ^= USB_EPRX_DTOG1; if (USB_EPRX_DTOG2 & uint32_t(state)) regVal ^= USB_EPRX_DTOG2; epref() = regVal | USB_EP_CTR_RX | USB_EP_CTR_TX; } void Endpoint::setCntRxReg(uint32_t& reg, uint32_t wCount) { uint16_t wNBlocks; (wCount > 62) ? calcBLK32(reg, wCount, wNBlocks) : calcBLK2(reg, wCount, wNBlocks); } void Endpoint::calcBLK32(uint32_t& reg, uint32_t wCount, uint32_t wNBlocks) { wNBlocks = wCount >> 5; if (!(wCount & 0x1F)) wNBlocks--; reg = (uint16_t)((wNBlocks << 10) | 0x8000); } void Endpoint::calcBLK2(uint32_t& reg, uint32_t wCount, uint32_t wNBlocks) { wNBlocks = wCount >> 1; if (wCount & 1) wNBlocks++; reg = (uint16_t)(wNBlocks << 10); } Как видно общего между этими двумя методами выполняющими одно и то же крайне мало, причем если в данном случае проще иметь дело с F4, то в других может быть и наоборот. Нельзя взять либу для F1, чуть ее подправить и заставить работать с F4, а ты лезешь со своей либой для F1 уже не в первую тему, где требуется работа с F4. И CDC, а по твоему линку я вижу только намерение с этим CDC разобраться, но не похоже, что это было сделано... |
Автор: | dosikus [ Вт сен 05, 2017 06:12:33 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Ты же про USB ничего не знаешь, взял готовую либу для F1 и пользуешься, .. То есть , ты даже и ссылку не смотрел... |
Автор: | Reflector [ Вт сен 05, 2017 09:02:51 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
То есть , ты даже и ссылку не смотрел... Что конкретно не нравится? Я за теми двумя темами следил с момента создания, если намекаешь, что тема вообще-то про L1/F3(насколько помню, сайт сейчас не открывается), то там тот же модуль USB, что и у F1. Для F0 я не переделывал, но судя по регистрам там есть небольшие дополнения, все остальное идентично... Так в чем проблема? Ты взял готовую либу для F0, а не для F1? ![]() |
Автор: | dosikus [ Вт сен 05, 2017 17:33:43 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Проблема , и проблема лишь твоя , что ты воспринимаешь окружающий мир только сквозь либы. Расширь свой кругозор... |
Автор: | GFX [ Ср окт 11, 2017 21:41:11 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Добрый день. Вот либа, которую я использую в ослике. Проект под Кейл, все собирается заливается работает и виснет через некоторое время:))) Хотя некоторые говорят, что работает хорошо. Суть такова, что от либы я не смог найти оповещение о окончании передачи, пробовал и так и сяк, но непрерывно передавать не выходит. Я передаю по 32 кбайта и занимаюь в реальной программе чем-нибудь. Проект минимальный, ничего считай нет кроме самой либы. Кто шарит, что в ней не так, по свободе может посмотрите. Либа переделана каким-то американцем(хотя национальность его не знаю), либа эта официальный пример от STM. https://yadi.sk/d/w-8-vz8K3Ng3GT |
Автор: | GFX [ Вс янв 14, 2018 11:56:03 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Тема закрыта, взял рабочую библиотеку из CubeMX. |
Автор: | serg_fs [ Ср июл 18, 2018 19:37:30 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Приветствую. Решил не создавать отдельную тему. Эта подойдет, наверное. Извиняюсь, если вопрос идиотский. Имею "синюю таблетку" c STM32F103C8T6. Прорабатываю на ней (учусь работать с STM32) инерциальный трекер (протокол Hatire +прога OpenTrack). Задача - реализовать виртуальный COM через USB. Воспользовался STM-овской библиотечкой STM_USB_fs_lib. В процессе пришлось выпаять пришпандоренный добрым китаезой резистор на 10кОм, перманентно подтягивающий Data+ USB к плюсу 3.3В, сделать подтяжку через резистор к ноге PB15 (USB_DISCONNECT_PIN). Виртуальный ком, в принципе, работает хорошо, в терминале все видно, OpenTrack данные получает и выводит, как надо, ничего не отваливается. Однако, есть момент, который мне не нравится: Если перезагрузить МК, не отключая соединение в терминале (или в OpenTrack), вывод данных прекращается намертво. Вот для железяки CH340G на ардуине было не так - через некоторое время после сброса, обмен стартовал вновь. Что, конечно, удобно. Если в описанной ситуации (остановка вывода данных после перезагрузки МК) в терминале нажать "отключение" и пересканировать наличные порты - виртуальный ком для терминала пропадает. Однако, в диспетчере устройств висит. Если контроллер сбрасывать при отключенном соединении, то после его включения все работает нормально. Что происходит? За своевольное прекращение обмена, МК попадает в игнор у хоста? Но при перезагрузке подтяжка Data+ к 3.3В автоматом пропадает, USB-устройство отключается и подключается вновь. Как избежать этой неприятности? Что-то послать хосту перед ресетом для остановки обмена? Потыкайте носом хотя бы, куда смотреть. |
Автор: | VladislavS [ Чт июл 19, 2018 12:33:53 ] |
Заголовок сообщения: | Re: STM32f4xx + USB CDC + StdPerph |
Всё понимаю, кроме "перегрузить МК". У вас на нём windows, что его перегружать надо? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |