Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STMF207VG + HAL +CDC (STM32CubeMX)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Builder
Тестирую проект полученный от STM32CubeMX для STMF207VG.
Использую демоброду TE-STM32F207
Как-то странно работает.
Проблему с замиранием передачи нашел как решить - в ф-ии USBD_CDC_TransmitPacket переместить код hcdc->TxState = 1; до вызова USBD_LL_Transmit.
Вроде заработало, но споткнулся на том, что если за раз передаю меньше 4-х байт, то передается бред - каша из ранее переданных байт.
Под отладчиком нашел место где данные пишутся в регистры - всё пишется правильно (ф-я USB_WritePacket).
Такое впечатление что что-то с инициализацией, но с ходу ошибки не вижу.
Если передаю 4 и более байт за раз - проблем вроде пока не вижу.
Кто-то с таким сталкивался?
Still Enemy
Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.
Builder
Цитата(Still Enemy @ Sep 29 2015, 13:14) *
Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.

Вечером отпишу, тестовую платформу дома гоняю - не с собой код.
Builder
Цитата(Still Enemy @ Sep 29 2015, 13:14) *
Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.

Проект и файл. Проект перегенерил и убрал почти всё свое.
Оставил только тестовый код, передающий данные.
И моего: тестовый код в функции StartDefaultTask, отмечено в комментариях, какой вариант работает, а какой - нет.
Исправлена ошибка библиотеки в ф-и USBD_CDC_TransmitPacket
Stack_Size и Heap_Size увеличен до 0x400
usbd_cdc_if.c - оставил как был после генерации кода из STM32CubeMX.
smalcom
4 байта? подозрительно похоже на int, Это не может быть связано где-то с выравниванием данных?
Builder
Цитата(smalcom @ Sep 29 2015, 23:10) *
4 байта? подозрительно похоже на int, Это не может быть связано где-то с выравниванием данных?

не похоже - нашел место, где идет запись в регистр. На первый взгляд всё читается из буфера и пишется в регистр правильно.
Похоже или какая-то особенность реализации у STM32CubeMX, которую не учитываю или ошибка в инициализации железа.
Still Enemy
Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.
Builder
Цитата(Still Enemy @ Sep 30 2015, 09:48) *
Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.
Попробовать можно, но если прочитаете первое сообщение - я дошел до функции USB_WritePacket, в которой идет перезапись из буфера в регистры USB. Так там всё вычитывается правильно, я вижу младшим байтом то, что должна передаться. А реально приходит не тот байт. Уже думал на программу со стороны PC, но потестил древней простой MTTTY.exe из старых примеров VS, много используемой ранее.
Привожу куски, как отправляю:
Если так отправляю, работает
Код
void StartDefaultTask(void const * argument)
{
  /* init code for USB_DEVICE */
  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN 5 */
    uint8_t buf_add1[]="-";
    uint8_t buf_add2[]="123;";
    osDelay(10000);
    
  for(int i=0;1;i++)
  {
        // Этот код работает ---------------------------------------
            while(CDC_Transmit_FS(buf_add1, 1)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2+2, 2)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2+1, 3)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2, 4)!=USBD_OK) osDelay(1);
            osDelay(100);
        }  /* USER CODE END 5 */
}

А если так, не работает - кашу получаю
Код
void StartDefaultTask(void const * argument)
{
  /* init code for USB_DEVICE */
  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN 5 */
    uint8_t buf_add1[]="-";
    uint8_t buf_add2[]="123;";
    osDelay(10000);
    
  for(int i=0;1;i++)
  {
    // Этот код НЕ работает - передает "кашу"    
    while(CDC_Transmit_FS(buf_add2, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+1, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+2, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+3, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
}  /* USER CODE END 5 */
}

По буферам - буфера хоть и локальные, но статичны по сути, т.к. в функции бесконечный цикл задачи ОС.

Цитата(Still Enemy @ Sep 30 2015, 09:48) *
Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.

Если есть возможность - попробуйте у себя передавать данные по 1 байту с паузой, как в моем тестовом примере, будет ли работать и на каком процессоре?

Добавлю: проблемы наблюдаю, если посылки делаю по 1 или 2 байта, 3 байта вроде уходят нормально, возможно сразу не так что-то посмотрел. Я понимаю, что по USB отправлять пакеты по 1-2 байта не есть гуд, но при малых объемах так удобнее, чем собирать данные в пакет и отправлять пакетом...
Builder
В общем плюнул на код, который с генерировал CubeMX, взял для теста пример - с ходу заработал.
На первый взгляд библиотеки/функции используются те-же самые.
Как будет время - сравню, чем отличаются/где ошибка.

Добавлю, кажется нашел. Не нравились мои настройки частот в функции SystemClock_Config.
Перенес настройки из работающего примера в неработающий - вроде всё заработало.
А CubeMX на мои совсем и не ругался, хотят он проверяет корректность.
Вот такой вот забавный эффект от некорректной настройки частот, будьте внимательны...
esaulenka
Цитата(Builder @ Oct 4 2015, 01:57) *
Добавлю, кажется нашел. Не нравились мои настройки частот в функции SystemClock_Config.


Оно?
Цитата(Errata)
In order to guarantee correct operation of the USB OTG FS peripheral, the AHB frequency should be configured to be not less than 14.2 MHz.

http://www.st.com/web/en/resource/technica.../DM00027213.pdf

Или что-то ещё?
Builder
Цитата(esaulenka @ Oct 6 2015, 11:23) *
Вроде не оно, я это видел, в CubeMX пишет что 25MHz у меня шина, но я не перепроверил что оно там генерировало.
Нет времени разбираться, пока работает, это пока для тестов сделано, протестирую как будет себя вести.
Если интересно - в архиве почти "голый проект" от CubeMX, ничего лишнего, есть и от CubeMX файл.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.