Например TDA7294

Форум РадиоКот :: Просмотр темы - STM32f4xx + USB CDC + StdPerph
Форум РадиоКот
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 :facepalm: Нужен виртуальный ком порт, способный передавать данные непрерывно и от нагрузки не зависающий, не зависающий, если выдернули шнур и т.д. На просторах интернета не удается найти стабильную реализацию данного режима на StdPerph, на hall есть очень стабильные варианты под STM32f103, работающие под операционкой реального времени, но мне нужно без излишеств на StdPerph. У кого, что есть кидайте. Свой глюченый пример почищу, отдельно выложу, может его можно исправить.

Автор:  GFX [ Сб июл 29, 2017 09:37:30 ]
Заголовок сообщения:  Re: STM32f4xx + USB CDC + StdPerph

Например, вот все стандартно на библиотеке от 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 [ Сб июл 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/