STM32f4xx + USB CDC + StdPerph

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

STM32f4xx + USB CDC + StdPerph

Сообщение GFX »

Привет всем, замучился я с юсб из примера от ST :facepalm: Нужен виртуальный ком порт, способный передавать данные непрерывно и от нагрузки не зависающий, не зависающий, если выдернули шнур и т.д. На просторах интернета не удается найти стабильную реализацию данного режима на StdPerph, на hall есть очень стабильные варианты под STM32f103, работающие под операционкой реального времени, но мне нужно без излишеств на StdPerph. У кого, что есть кидайте. Свой глюченый пример почищу, отдельно выложу, может его можно исправить.
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: STM32f4xx + USB CDC + StdPerph

Сообщение GFX »

Например, вот все стандартно на библиотеке от ST http://mikrocontroller.bplaced.net/word ... ge_id=1263 Таких примеров море. Что мы видим, полное отсутсвие проверки, что можно пихать новые данные в ЮСБ, как так вообще? Задаю огромный буфер, но если пихать в юсб больше, чем этот буфер, то оно загинается через несколько секунд. Все примеры рассчитаны на отправку пары слов в минуту :kill:

#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
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32f4xx + USB CDC + StdPerph

Сообщение oleg110592 »

[uquote="GFX",url="/forum/viewtopic.php?p=3153323#p3153323"]Все примеры рассчитаны на отправку пары слов в минуту[/uquote]
тут не пару: http://tomeko.net/miniscope_v2f/index.php?lang=en
Использована, насколько помню, стандартная ST библиотека, правда это STM32F0x2 USB Full Speed Device Library.
Применял тоже эту библиотеку (Virtual COM Port), работало стабильно.
Там же на сайте есть осциллограф на F1 и F3 - может пригодится.
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: STM32f4xx + USB CDC + StdPerph

Сообщение GFX »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3153351#p3153351"]правда это STM32F0x2[/uquote] Спасибо, но с F0 я его не портирую. У кого еще, что есть на примете?
Аватара пользователя
240265
Электрический кот
Сообщения: 1029
Зарегистрирован: Сб мар 09, 2013 11:29:22
Откуда: 40RUS, Жуков

Re: STM32f4xx + USB CDC + StdPerph

Сообщение 240265 »

По вышепреведенной ссылке есть вариант miniscope_v2d там на Ф303 , посмотрите.
IVL ex UA6PJ
Аватара пользователя
Juris
Грызет канифоль
Сообщения: 255
Зарегистрирован: Вс мар 04, 2012 12:05:24
Откуда: Riga

Re: STM32f4xx + USB CDC + StdPerph

Сообщение Juris »

Вот это:
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 ;-)
Последний раз редактировалось Juris Пн сен 04, 2017 12:22:21, всего редактировалось 1 раз.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32f4xx + USB CDC + StdPerph

Сообщение Reflector »

По-моему, проблема вообще надумана, кубом генерится проект под любой мк и потом убирается все лишнее, включая HAL, если он не нужен.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32f4xx + USB CDC + StdPerph

Сообщение dosikus »

[uquote="Reflector",url="/forum/viewtopic.php?p=3175927#p3175927"]По-моему, проблема вообще надумана, кубом[/uquote]

Не говори-ка, одно но - можно же сразу и без разгребания шлака калокуба/спл нормально делать...
http://mcu.goodboard.ru/viewtopic.php?id=40
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32f4xx + USB CDC + StdPerph

Сообщение Reflector »

[uquote="dosikus",url="/forum/viewtopic.php?p=3176056#p3176056"]Не говори-ка, одно но - можно же сразу и без разгребания шлака калокуба/спл нормально делать...
http://mcu.goodboard.ru/viewtopic.php?id=40[/uquote]
Это для F1/F3 и т.д., а нужно для F4.
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: STM32f4xx + USB CDC + StdPerph

Сообщение GFX »

[uquote="Reflector",url="/forum/viewtopic.php?p=3175927#p3175927"]По-моему, проблема вообще надумана, кубом генерится проект под любой мк и потом убирается все лишнее, включая HAL, если он не нужен.[/uquote]Что-то говорит мне, что хол этот не разгрести, к тому же он лепит систему реально времени, на сколько я помню, но могу ошибаться. Мне хол и система реального времени не нужны. Самый простой путь, казалось бы, починить то, что есть, но я тонкостей работы юсб не знаю и в его реализацию в стм тоже не вникал. Может когда дойдут руки, а пока хотелось бы проверенное решение без зависаний и отвалов юсб.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32f4xx + USB CDC + StdPerph

Сообщение Reflector »

[uquote="GFX",url="/forum/viewtopic.php?p=3176229#p3176229"]Что-то говорит мне что хол этот не разгрести, к тому же он лепит систему реально времени, на сколько я помню, но могу ошибаться. Мне хол и система реального времени не нужны. Самый простой путь казалось бы починить то, что есть, но я тонклстей работы юсб не знаю и в его реализацию в стм тоже не вникал. Может когда дойдут руки, а поеа хотелось бы проверенное решение без зависаний и отвалов юсб.[/uquote]
Нет там никакой системы реального времени, там в одном месте идет настройка портов и приоритетов прерываний, нужно заменить на свое, еще раз 5 встречается пауза завязанная на SysTick, ее тоже меняешь на что угодно, остается 3 *.c из HAL(stm32f4xx_ll_usb и пара stm32f4xx_hal_pcd/pcd_ex) и соответствующие хедеры, плюс еще парочка хедеров в которых всякие макросы/перечисления по мелочи... В принципе в таком виде уже все можно и оставить, единственная возможная проблема в том, что StdPerph и HAL писали одни и те же индусы, потому какие-то имена там могут пересекаться и тогда в той части где используется HAL их придется переименовать.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32f4xx + USB CDC + StdPerph

Сообщение dosikus »

Reflector, ты меня удивляешься. А чем юсб девайс отличается у линеек в старой периферии.
На тебя г. либы так действуют?
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32f4xx + USB CDC + StdPerph

Сообщение Reflector »

[uquote="dosikus",url="/forum/viewtopic.php?p=3176280#p3176280"]Reflector, ты меня удивляешься. А чем юсб девайс отличается у линеек в старой периферии.
На тебя г. либы так действуют?[/uquote]
Ты же про 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
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32f4xx + USB CDC + StdPerph

Сообщение dosikus »

[uquote="Reflector",url="/forum/viewtopic.php?p=3176313#p3176313"]Ты же про USB ничего не знаешь, взял готовую либу для F1 и пользуешься, ..[/uquote]

То есть , ты даже и ссылку не смотрел...
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32f4xx + USB CDC + StdPerph

Сообщение Reflector »

[uquote="dosikus",url="/forum/viewtopic.php?p=3176390#p3176390"]То есть , ты даже и ссылку не смотрел...[/uquote]
Что конкретно не нравится? Я за теми двумя темами следил с момента создания, если намекаешь, что тема вообще-то про L1/F3(насколько помню, сайт сейчас не открывается), то там тот же модуль USB, что и у F1. Для F0 я не переделывал, но судя по регистрам там есть небольшие дополнения, все остальное идентично... Так в чем проблема? Ты взял готовую либу для F0, а не для F1? :)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32f4xx + USB CDC + StdPerph

Сообщение dosikus »

Проблема , и проблема лишь твоя , что ты воспринимаешь окружающий мир только сквозь либы.
Расширь свой кругозор...
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: STM32f4xx + USB CDC + StdPerph

Сообщение GFX »

Добрый день. Вот либа, которую я использую в ослике. Проект под Кейл, все собирается заливается работает и виснет через некоторое время:))) Хотя некоторые говорят, что работает хорошо. Суть такова, что от либы я не смог найти оповещение о окончании передачи, пробовал и так и сяк, но непрерывно передавать не выходит. Я передаю по 32 кбайта и занимаюь в реальной программе чем-нибудь. Проект минимальный, ничего считай нет кроме самой либы. Кто шарит, что в ней не так, по свободе может посмотрите. Либа переделана каким-то американцем(хотя национальность его не знаю), либа эта официальный пример от STM. https://yadi.sk/d/w-8-vz8K3Ng3GT
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: STM32f4xx + USB CDC + StdPerph

Сообщение GFX »

Тема закрыта, взял рабочую библиотеку из CubeMX.
serg_fs
Родился
Сообщения: 4
Зарегистрирован: Ср июл 18, 2018 18:40:19

Re: STM32f4xx + USB CDC + StdPerph

Сообщение serg_fs »

Приветствую.

Решил не создавать отдельную тему. Эта подойдет, наверное.
Извиняюсь, если вопрос идиотский.

Имею "синюю таблетку" 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
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32f4xx + USB CDC + StdPerph

Сообщение VladislavS »

Всё понимаю, кроме "перегрузить МК". У вас на нём windows, что его перегружать надо?
Ответить

Вернуться в «ARM»