реклама на сайте
подробности

 
 
> Keil STM32F103 USB-CDC вешается
anpilog
сообщение Aug 13 2014, 12:17
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 145
Регистрация: 11-12-06
Пользователь №: 23 382



Всем привет,
Давненько я ничего не спрашивал 8)

Столкнулся тут со странным поведением примеров от Keil.
Если в двух словах, то USBstack на STM32F103RB/C8 виснет под нагрузкой.

Предистория длинная и не интересная, так что я постарался упростить все до минимума.
Итак. Берем пример от Keil c:\Keil\ARM\Boards\Keil\MCBSTM32\RL\USB\Device\CDC_ACM\
Берем Nucleo-R103 с STM32F103RB.
Подсоединяем внешний USB разъем:
D- <-> PA11
D+ <-> PA12
Pull-up D+ to VCC, 1.5k resistor.

Вырубаем инициализацию LCD. Иначе зависним в ней.
Код
//  lcd_init  ();
//  lcd_clear ();
//  lcd_print ("USB Device Demo ");
//  set_cursor(0, 1);
//  lcd_print ("  www.keil.com  ");


Закорачиваем RX и TX для лупбек теста:
Код
PA9-PA10


В качестве тестовой апликухи на компьютере написал простенький JS скрипт.
Он просто гонит кучу данный в порт и выводит на экран то что получил.
Проект для Keil и скрипт можно взять тут: https://www.dropbox.com/s/ocbk2c4fenl75eb/CDC_ACM_nucleo.zip

Все это работает какое-то время (десятки секунд - несколько минут) а потом затыкается.
Затык выглядит как забытая FIFO на прием или передачу USB.
То есть USBD_CDC_ACM_PutChar или USBD_CDC_ACM_GetChar возвращает -1.
Код
  while (1) {                           /* Loop forever                       */
    NotifyOnStatusChange();             /* Notification handling              */

                                        /* USB -> UART                        */
    if (usb_rx_ch == -1) {
      usb_rx_ch = USBD_CDC_ACM_GetChar ();
    }
    if (usb_rx_ch != -1) {
      if (UART_PutChar (usb_rx_ch) == usb_rx_ch) {
        usb_rx_ch = -1;
      }
    }

                                        /* UART -> USB                        */
    if (usb_tx_ch == -1) {
      usb_tx_ch = UART_GetChar ();
    }
    if (usb_tx_ch != -1) {
      if (USBD_CDC_ACM_PutChar (usb_tx_ch) == usb_tx_ch) {
        usb_tx_ch = -1;
      }
    }
  }

Чаще всего именно USBD_CDC_ACM_PutChar.
Проверил это безобразие на нескольких машинах, парочка Win и один Mac.
И на нескольких процесорах.

Кто-то с таким сталкивался?
Сложно в это поверить, так как Keil-овский USB стек популярный.
Что-то мне подсказывает, что наступаю на какие-то давно известные грабли.

Regards


--------------------
---
human traffic - всегда 8)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01347 секунд с 7
ELECTRONIX ©2004-2016