Jump to content

    

Booger

Участник
  • Content Count

    10
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. STM32 USB FS OTG

    Хорошая штука, спасибо! Очень помогло! Выяснил, что моё устройство отвечает STALL и после этого хост "бросает вёсла". Как я понимаю, если устройство отвечает так, то это совсем всё плохо, поэтому хост и перестает слать данные. Осталось выяснить, что такое случилось, что моему устройству поплохело.
  2. STM32 USB FS OTG

    Добрый день! Помогите разобраться с такой вещью. Стэк STM32_USB_Device_Library V1.2.1, контроллер stm32F407. USB FS Device, CDC Class. На компе Windows 7, драйвер от ST. Хочу принимать большие объемы данных. И происходит такая странная вещь. При отправки маленьких объемов (до 64 байт), всё хорошо, назовем их команды. Отправляю комбинацию 266 байт одной посылкой в консоле, назовем её конфигурацией. При отправки одной конфигурации, получается отправить несколько раз (5-10 раз) одну и туже конфигурацию, далее всё глохнет. Ошибка в консоли WriteFile function failed (win error code:31) При отправки другой конфигурации (тоже 266 байт, только сами данные другие), сразу глохнет с той же ошибкой. После возникновения этой ошибки, прием устройством полностью прекращается, при этом отправка на хост продолжает работать. При возникновении этой ошибки принимаются не все данные, т.е. должны приехать 4 раза по 64 байта и один раз 10 байт, а приходит только 3 раза по 64 байта и всё стопается, иногда, очень редко, только 2 раза по 64 байта. Если попробовать отправить ещё хоть что-то, то консоль зависает, новых данных устройство не получает. Видимо, виндовый драйвер уже не собирается ничего отправлять. Вижу это в функции uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum). Не могу понять, как эта ошибка зависит от самих данных? С данными я, пока, ничего не делаю, просто складываю в FreeRTOS-ную очередь в функции VCP_DataRx, пробовал и вообще ничего с ними не делать. И не понимаю, что за "гонки" происходят? Моя догадка такая, прилетает очередная партия данных, а DCD_EP_PrepareRx при этом ещё не успел выполнился. В этом случае устройство, наверное, должно что-то отправить хосту, типа NAK или ещё что-то и хост переповторить отправку последнего блока или я неправильно понимаю? Пока не подтвердить, не опровергнуть свою догадку не получилось, медленно расковыриваю стэк. Буду очень признателен за любые подсказки. И ещё, есть какое-нибудь ПО для "прослушки" USB порта, чтобы понять что там ходит, включая все служебные USBные команды?
  3. Добрый день! Работаю в keil. Плата STM32F429 Discovery Есть огромное желание разобраться, как работать с внешней ОЗУ. Интересует обучение в написании Scatter файла. Накидайте, пожалуйста, годных статей по этому поводу или разжуйте тут. Для примера, не получается разместить кучу FreeRTOS во внешней ОЗУ. Вот пример моего Scatter: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00030000 { .ANY (+RW +ZI) } RW_RAM2 0xD0000000 0x00800000 { ; RW data heap_1.o(+ZI) } } настройки keil
  4. Вот скриншоты обоих вариантов.
  5. Добрый день! Пока оставил эту проблему до лучших времен. Попробую реализовать совет SyncLair позже. Нужно считать только CRC, никаких больше защит не нужно. Еще раз говорю, в дизассемблере функция выглядит одинаково. Или не функцию нужно смотреть?
  6. В дизасемблере все одинаково да, метрология Попробовал создал отдельный проект-либу. Подключил либу к своему проекту и та же фигня. На ум приходит только лепить из разных hex-ов разных проектов один hex, но это чудовище Франкинштейна не очень мне нравится. Есть мнение, что, если организовать не функцию, а класс, то всё может получится. Попробую, отпишусь. Попробовал. Создал класс с одним единственным методом, объявил объект класса, разместил этот объект по нужному адресу. Прикол в том, что объект занимает 1 байт и смысл считать его CRC нет.
  7. Добрый день! Возникла необходимость кусок кода, а точнее функцию, выделить в отдельную, не занятую область. С этим разобрался. Функция в отдельном файле test_file.c __attribute__((section(".ARM.__at_0x08012B00"))) float test(float t1, float t2, float t3) { return (t1 * t2 + t3); } всё хорошо, область не занятая вот выписки из map файла сама функция (кстати, не пойму почему адрес 0x08012b01, а не 0x08012b00?) test(float, float, float) 0x08012b01 Thumb Code 30 metrologicalcalculation.o(.ARM.__at_0x08012B00) секция .ARM.__at_0x08012B00 0x08012b00 Section 0 test_file.o(.ARM.__at_0x08012B00) генерируется hex, всё замечательно :102AE00000000000000000000000000000000000E6 :102AF00000000000000000000000000000000000D6 :102B00002DE9F04105460E46144631462846FDF7AC :102B10007DF907462146FDF7A3F8BDE8F0810000E6 :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 но при изменении кода, никак не касающегося этой функции! имею, что в этом куске hex происходят изменения во второй строке :102AE00000000000000000000000000000000000E6 :102AF00000000000000000000000000000000000D6 :102B00002DE9F04105460E46144631462846FDF7AC :102B100039F907462146FDF75FF8BDE8F08100006E :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 не могу понять почему? Задача, выделить эту функцию, посчитать ее CRC, и чтобы это CRC не менялось при изменении остальной части программы.
  8. Спасибо всем за помощь! Действительно, если использовать memcpy, то работает и на 0-м уровне оптимизации.
  9. В том то и дело, товарищи! Работает на всех уровнях оптимизации, кроме Leavel - 0 (O0). Я бы даже не сувался на форум, если было бы наоборот. При Leavel - 3 (O3) неудобно пользоваться "дебагером". Остальными уровнями (Leavel - 1 (O1) и Leavel - 2 (O2)) еще ни разу не пользовался. С одной стороны, конечно же хорошо, что всё отлично работает на 3-м уровне оптимизации, как все мы и добиваемся в конечном итоге, но хотелось бы докопаться до истины. Пока в голову ничего не пришло, как начать переписывать USB-шный пример, а может быть придется и всю библиотеку. ViKo, RabidRabbit, спасибо, буду смотреть.
  10. Добрый день! Не стал создавать новую тему. Вопрос по уровням оптимизации в Keil 5.14. Предыстория такая. Скачал библиотеку USB с сайта st.com (STSW-STM32092 STM32F0x2xx USB FS device library (UM1717)). Запустил проект виртуального ком порта. Убрал из кода файлы отладочной платы, поменял камень на STM32F042K6. Убрал USART. Сделал так, чтобы все что принимается с USB выплёвывалось туда же. Все работает отлично, определятся на компе, как вирт ком порт, шлю данные из терминала и получаю их же. В проекте стоит уровень оптимизации 3 (Level 3 (-O3)) по умолчанию. Если выставить уровень оптимизации 0 (Level 0 (-O0)), то при попытке отправить данные из консоли в контроллер, сваливается в hardfault на 8-й строчке. При всех других уровнях оптимизации все работает (Level 1 (-O1), Level 2 (-O2)). void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) { uint32_t n = (wNBytes + 1) >> 1; uint32_t i; uint16_t *pdwVal; pdwVal = (uint16_t *)(wPMABufAddr + PMAAddr); for (i = n; i != 0; i--) { *(uint16_t*)pbUsrBuf++ = *pdwVal++; // Тут падает pbUsrBuf++; } } Я бы всё понял, если бы было всё наоборот. Как мне кажется, все указатели и массивы нормально объявлены, в противном случае падало бы на всех уровнях оптимизации. Может есть нормальное описание уровней оптимизации keil'а? Или мысли по этому поводу? Или может быть, кто-нибудь сможет объяснить "на пальцах" как работает оптимизация в keil?