Перейти к содержанию
    

Booger

Участник
  • Постов

    10
  • Зарегистрирован

  • Посещение

Репутация

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. Генерация HEX в Keil

    Вот скриншоты обоих вариантов.
  5. Генерация HEX в Keil

    Добрый день! Пока оставил эту проблему до лучших времен. Попробую реализовать совет SyncLair позже. Нужно считать только CRC, никаких больше защит не нужно. Еще раз говорю, в дизассемблере функция выглядит одинаково. Или не функцию нужно смотреть?
  6. Генерация HEX в Keil

    В дизасемблере все одинаково да, метрология Попробовал создал отдельный проект-либу. Подключил либу к своему проекту и та же фигня. На ум приходит только лепить из разных hex-ов разных проектов один hex, но это чудовище Франкинштейна не очень мне нравится. Есть мнение, что, если организовать не функцию, а класс, то всё может получится. Попробую, отпишусь. Попробовал. Создал класс с одним единственным методом, объявил объект класса, разместил этот объект по нужному адресу. Прикол в том, что объект занимает 1 байт и смысл считать его CRC нет.
  7. Генерация HEX в Keil

    Добрый день! Возникла необходимость кусок кода, а точнее функцию, выделить в отдельную, не занятую область. С этим разобрался. Функция в отдельном файле 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. Оптимизация в Keil

    Спасибо всем за помощь! Действительно, если использовать memcpy, то работает и на 0-м уровне оптимизации.
  9. Оптимизация в Keil

    В том то и дело, товарищи! Работает на всех уровнях оптимизации, кроме Leavel - 0 (O0). Я бы даже не сувался на форум, если было бы наоборот. При Leavel - 3 (O3) неудобно пользоваться "дебагером". Остальными уровнями (Leavel - 1 (O1) и Leavel - 2 (O2)) еще ни разу не пользовался. С одной стороны, конечно же хорошо, что всё отлично работает на 3-м уровне оптимизации, как все мы и добиваемся в конечном итоге, но хотелось бы докопаться до истины. Пока в голову ничего не пришло, как начать переписывать USB-шный пример, а может быть придется и всю библиотеку. ViKo, RabidRabbit, спасибо, буду смотреть.
  10. Оптимизация в Keil

    Добрый день! Не стал создавать новую тему. Вопрос по уровням оптимизации в 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?
×
×
  • Создать...