Jump to content

    

Chameleon

Участник
  • Content Count

    49
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Chameleon

  • Rank
    Участник
  1. Внутри MX_USB_DEVICE_Init() и есть настройка hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE; Я потому и поставил первую строку приветствия до MX_USB_DEVICE_Init(). Если поставить после нее, то будет происходить передача строки и одновременно обмен по USB (инициализация), тогда USB отваливается.
  2. Все, нашел. Куб в коде выставляет в USBD_LL_Init(): hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE; Даже если в настройках USB в кубе переключатель Activate_VBUS отключен. А VBUS_DETECT это пин PA9, он же и TX для USART1. И возникает конфликт между USATRT1 Tx и VBUS_SENSE. Поэтому отваливается USB, если что-то делать с пином PA9 (или передавать через USART1 или вручную им шевелить) Но если выбрать переключатель Activate_VBUS и USART1 одновременно, то тогда передачу USART1 он монтирует на PA15, на PA9 VBUS_DETECT и конфликта нет. Сделал вручную в коде hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE; Все работает.
  3. Пины проверил, одинаково не работает на ДВУХ разных платах. Под другой порт переделываю.
  4. cdc.rar Размеры стека и кучи я увеличил в два раза по сравнению с теми, что поставил куб. Мои добавления только в файле main.c между стоками со звездочками. Все остальное сгенерил куб. У меня работает так: Подключаю. Устройство определилось. Пауза. Когда начинается вывод через UART, устройство отваливается и переподключается. Вижу по USBLyser-у. И так по циклу.
  5. Процессор F411RE, ревизия A. Весь код генерит куб, я только компилирую его в кейле. Частоты не превышают ограничения в кубе (100Мгц и 50Мгц). Одна плата такая: XNucleoF411re. Схемы нет. Вторая плата такая: Схема есть. UART. На другой порт перебрасывать - не выход. Все пины проца заняты. И плата уже разведена. И нет гарантии что при манипуляции другими битами порта USB не будет отваливаться. Всю портянку, что куб нагенерил, выкладывать?
  6. Ревизия проца A. Две штуки. Взял вторую плату, китайский клон Nucleo. Результат тот же. Сделал передачу по уарт ногодрыгом вручную. Аппаратный отключен. То же самое. При передаче первого байта отваливается USB. Такое впечатление, что любая запись в порт PA валит USB. Он тоже на этот порт выведен.
  7. Вы вообще читаете, что я пишу? Какая от вас может быть помощь, если вы помните только то что было написано на первой странице поста?
  8. Спасибо, КЭП. Вы что, не понимаете, что это и есть ПУСТОЙ ПРОЕКТ. Только USB и UART. Что я и пытаюсь добиться стабильной работы в разных ситуациях? Да, да, передача строки по поллингу и есть СИТУАЦИЯ. И они должны работать вместе в любых комбинациях? Отличный совет - не получается? Как нибудь придумай обход. Прилепи костыль. Авось по другому прокатит.
  9. Падает на этой функции: void up(void) { volatile char *s = mem; for(;;) { while((USART1->SR & USART_SR_TXE) == 0); USART1->DR = *s++; if (*s == 0) break; } } mem - это массив с данными. Если в отладчике зайти в эту фунцию и вручную шагать, то все работает. Если же сделать Step Over - HardFault.
  10. static char mem[16384]; static volatile uint32_t p; void up(void) { HAL_UART_Transmit(&huart1,(uint8_t *)mem,strlen(mem),100); } void dbgInit(void) { memset(mem,0,16384); p = 0; } void UARTPrint(char *s) { volatile uint32_t x; if(p > 16000) return; for(;;) { mem[p++] = *s++; if(*s == 0) break; } } в main: dbgInit(); MX_USB_DEVICE_Init(); ... задержка up(); внутри перывания USB в самом начале UARTPrint("\r\m-----IRQ");
  11. Чем дальше в лес, тем толще партизаны. Сделал отладочный вывод в массив в озу и затем из него в UART. Устройство подключается и определяестя. Но когда начинается вывод через UART, устройство отваливается. Через отладчик выяснил, что процессор падает в HardFault. Падает на этой функции: void up(void) { volatile char *s = mem; for(;;) { while((USART1->SR & USART_SR_TXE) == 0); USART1->DR = *s++; if (*s == 0) break; } } mem - это массив с данными. Если в отладчике зайти в эту фунцию и вручную шагать, то все работает. Если же сделать Step Over - HardFault. Проект сгенерирован кубом. Он же правильно все тайминги выставляет? Задержка доступа к FLASH, частоты шин APB, AHB?
  12. В основном коде ВНЕ прерываний эта функция работает? В бесконечном цикле. Да. В любом случае подобные функции не должны работать таким образом, как у вас. Правильно так: кидать байты строки в некую программную очередь и разрешать передачу, заранее настроив прерывания от USART. Так и делаю сейчас. Можно даже извратиться на DMA, но это уже детали, не относящиеся к делу... Весьма сочувствую вашему "вероисповеданию" ... :crying: Тонны "магических цифр" по коду - это самый страшный кошмар любого программиста. Поэтому мне всегда грустно видеть, как некоторые "программисты" этот кошмар сознательно воплощают в своей реальности, отказываясь даже от безобидных #define .... #define - > #define -> #define .. еще раз десять вложенных #define и в конце a = 5; Это конечно лучше. Про малоуловимые глюки в макросах и смысла нет говорить. А уж условная компиляция так помогает понять логику работы...
  13. Я в первую очередь пробовал через HAL_UART_Transmit, нет разницы. Вызовы только в обработчике USB_OTG_Handler. Но я пробовал оставлять только единственный вызов в начале обработчика. Тоже не работает. Препроцессор зло, это аксиома. Не требует доказательств.