Всем привет,
Давненько я ничего не спрашивал 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