Jump to content

    

kostya-m

Участник
  • Content Count

    193
  • Joined

  • Last visited

Everything posted by kostya-m


  1. Супер! Спасибо, все заработало
  2. Регистры процессора - да. А мне нужно поработать с регистрами периферии. Суббота, вечер....
  3. Поскольку не удается разобраться с некоторыми тонкостями встроенной аппаратуры, хотелось бы просматривать регистры. Вопрос по решениею задачи. Может можно инсталлировать определение чипа из более новой версии, если да - поделитесь. Может более новая версия 8.4 согласиться работать с той же лицензией от 7.5?
  4. Реализаций USB Audio Class 1 с асинхронной передачей и точкой обратной связи достаточно в Интернете и оно работает, обычно на FS. Захотелось реализовать версию 2 и на HS. Поскольку хочется иметь поддержку высоких скоростей без значительных процессорных затрат, первично отлаженный протокол положенный на стандартный Cebu код стал перекладывать на DMA и отдельные EP1 прерывания. Так же код Cube был творчески переработан под решение конкретной задачи. Все бы хорошо и работает.... кроме одного. Не работает обратная связь. Прим данные идет через OUTEP1, а обратная связь на INEP1. С приемом никаких проблем нет. А вот с отправкой неожиданная проблема. Точка открывается нормально с обеих сторон. Хост шлет запросы каждые 8 SOF, как указано в дескрипторе. Это видно и по Device Monitoring Studio и по прерываниям на INEP1 - постоянное прерывание NAK, сигнализирующее о том, что был отправлен пустой пакет, вместо данных (In case of isochronous IN endpoints the interrupt gets generated when a zero length packet is transmitted due to unavailability of data in the Tx FIFO.) При этом DIEPCTL, DIEPSIZ и DIEPDMA запрограммированы корректно, но DMA не начинает заполнять Fifo данными. Бывают разовые случаи передачи одного первого пакета, но после все равно данные не забираются. Это видно не только по пустым отправкам, но и по тому, что DIEPSIZ не модифицируется, а должен был бы считать назад. Без DMA все работало, но, к сожалению, нельзя указать DMA по отдельным точкам, а так FeedBack - 4 байта и проще было бы засунуть в Fifo руками, но контроллер не дает и вызывает HarFault при такой попытке. Особенность всего в том, что и прием и передача делаются изохронными точками. Четность при посылке учитывается, но я даже пытался с ней играть - не помогало. Да и не могло, четность работает уже когда данные в Fifo, а я не могу их туда засунуть. Уже ходят мысли перенести FeedBack точку на INEP2 и вернуть обработку на основное прерывание. Может кто сталкивался с таким? Процессор конкретно 32F745VG, ULPI chip USB3320C. Хостом работает комп с Win10, поскольку в них есть встроенные драйвера USB Audio Class 2. Устройство распознается и работает, включая ASIO в Foobar2000. Но поскольку не работает FB, то буфер достаточно быстро опустошается, на 44/48 кГц где-то за пару минут, а на 352/384 кГц за секунды.
  5. Есть пара разработанных и работающих плат управления для аудио устройств. Платы управления на чипах серии STM32F7. USB c внешней физикой. Прошивки на основе FreeRTOS 9 базово собраны в Cube и доделаны. Они работают. Я начал сам писать USB Audio 2.0 и компьютер даже видит устройство, которое не работает. Но времени катастрофически не хватает. Надо написать протокол, что бы он нормально жил с Win10 (желательно и Win7) на хотя бы двух режимах 352/16 и 384/16. Это не USB Audio 1.0, реализация которого есть в Cube. Во втором протоколе надо реализовывать асинхронный режим. Описание протокола есть у меня и на сайте USB. Код должен быть на С без ++. Заплатить готов 25 тр. Работа не срочная, может время от времени встречаться в Москве на Авиамоторной в МТУСИ. Связь со мной по мылу Musatoff @ mail . ru Получится, есть темы для продолжения.
  6. Спасибо про ремапинг. Но вот и еще один вариант :)
  7. Условия: Плата с STM32F745VET (100 pin) Схема спроектирована с помощью CubeMX и им же сделан базовый код. Проблема: Не работает дисплей Анализ: Исследования с помощью многоканального осциллоскопа показало белиберду в управляющих сигналах. Безуспешные попытки: Пробовал изменять режимы работы FMC, тайминги, настройки. Ничего принципиально не помогает. Если код исполнять пошагово, то работает, если непрерывно - не работает. Промежуточным решением оказалось вставить после каждого обращения к LCD задержку на 400-500 нс. Но скорость записи сильно страдает. Решение: Похоже, в FMC, в отличие от FSMC есть логика кеширования. Запись в дисплей ведется по двум адресам ((__IO uint16_t*)0x60000000) и ((__IO uint16_t*)0x60020000). Данные потоком пишутся по второму адресу и FMC начинает пропускать циклы записи, оставляя последний. Отключение FIFO не помогает. Решением оказалось инкрементирование адреса в рамках до A16, которым проводится разделение команда-данные. void LCD_CMD( uint16_t cmd ) { static volatile uint16_t *Cmd = ((__IO uint16_t*)0x60000000); *(Cmd++) = cmd; if( Cmd >= ((__IO uint16_t*)0x6000FFF) ) Cmd = ((__IO uint16_t*)0x60000000); } void LCD_DATA( uint16_t data ) { static volatile uint16_t *Data = ((__IO uint16_t*)0x60020000); *(Data++) = data; if( Data >= ((__IO uint16_t*)0x6002FFFF)) Data = ((__IO uint16_t*)0x60020000); } Так все заработало
  8. Имя, с которым возникала неоднозначность сборки: .itcmram , а имена без точки дают однозначную сборку
  9. Искал. Кроме нескольких указанных функций никого не было. Но это уже неактуально, перешел на дефолтные название. Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает.
  10. Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит.
  11. Разобрался с вопросом. Нужная технология называется static overlay Описана тут и там есть хороший пример в архиве, по которому все становится понятно https://www.iar.com/support/tech-notes/link...-example-v5.50/
  12. Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?
  13. Буфер выровненный. Пробовал его делать более широкий, uint16_t - не помогло. 32 бита не стал делать - код в функциях THUMB - 16-и битный. Обратил внимание, что указатель на функцию, смотрит не на ее первый байт с четным номером, а на второй, с нечетным. Сделал копирование с адреса на 1 меньше - теперь буфер точно копирует данные в функции. Пробую запустить так же по нечетному адресу - пока не помогает.
  14. Есть толпа функций обработки данных, из которых работает только одна, в зависимости от настроек. При этом матобработка критична по скорости, потому им бы лежать в ОЗУ. Но их много и хчется сэкономить место в ОЗУ. У всех функций один и тот же программный интерфейс. typedef void (*DataTransfer_t)( uint32_t ); После компиляции всех функций я посмотрел в мэп файле наиболее длинную из них и сделал с небольшим запасом буфер char FuncBuffer[512] @ ".itcmram"; Потом копирую в буфер тело функции memcpy( FuncBuffer, (char*)DataTransfer1, 512 ); После чего пытаюсь запустить ((DataTransfer_t)FuncBuffer)( FirAskSlot ); Но не тут то было, вываливаюсь в Hard_fault. Что я сделал неправильно?
  15. Разрешил вопрос. Это все же глюк IAR-а Перестал использовать указание на секцию @ ".itcmram" А только префикс __ramfunc И добавил в ICF place in ITCMRAM_region {section .itcmram, section .textrw }; Теперь все функции залазят в ОЗУ
  16. В том то и дело, что многие функции и у меня нормально залазят туда. Но вот некоторые упираются ногами. И переформатирование Icf файла не помогает. Сообщение как в начале темы сохраняется. В рамках одного исходника на С, могут большинство функций заползать, но некоторые отказываются. Я не смог найти закономерность, что нужно что бы было как надо.
  17. Вполне допускаю, что у меня лес. До сих пор мне приходилось только вписывать секции внешней SRAM, а тут кучка внутренней памяти :) Однако, перенос строк в конец ни чего не дал. Ругань идет на конкретные данные, например. Error[Lc037]: ambiguous section match: "zi section .bss in ADC.o symbols: [ADCCurrentLimits, ADC_Flags]" matches more than one pattern Попытка указать явно place in ITCMRAM_region {readonly section .itcmram, readwrite section .itcmram }; Успеха не принесли, сохраняется ошибка из первого поста.
  18. Обругался, что нельзя rw сразу в два региона класть. Основной rw живет в SRAM1
  19. Попробовал такой префикс. Сообщение осталось, не помогло.
  20. Исходя из непонятных соображений, линкер считает что процедуру, отмеченную секцией ITCMRAM надо считать RO, а в другом случае RW. Причем это может проявляться даже в рамках одного исходного файла на С. например void Data_StartNextTransfer( void ) @ ".itcmram" {..................} При компиляции ошибок нет. Мало того, если посмотреть асемблерный листинг, то и там в заголовке указания на секции совпадают Однако линкер может выдать такое сообщение Warning[Lp005]: placement includes a mix of sections with content (example "ro code section .itcmram in USBH.o") and sections without content D:\WORK\C\ARM\PA-20 v4 new\EWARM\stm32f745xx_flash_sram.icf 54 (example "rw code section .itcmram in DataTask.o symbols: [Data_StartNextTransfer]") Warning[Lp006]: placement includes a mix of writable sections (example "rw code section .itcmram in DataTask.o symbols: [Data_StartNextTransfer]") D:\WORK\C\ARM\PA-20 v4 new\EWARM\stm32f745xx_flash_sram.icf 54 and non-writable sections (example "ro code section .itcmram in USBH.o") а в мэп файле хорошо видно, что те функции, которые он нормально кладет в ITCMRAM, помечены как RW. Те, что в том же исходнике, но оставленные в ПЗУ - CODE. Но те, что он отказывается класть в ITCMRAM помечает как RO. И хотя сообщение - предупреждение, реально прошивка не работает. По всяким атрибутам функций закономерности не заметил. Подскажите, что в функции может быть не так и как это исправить, если я ее хочу запускать из ITCMRAM? /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; define symbol __ICFEDIT_region_DTCMRAM_start__ = 0x20000000; define symbol __ICFEDIT_region_DTCMRAM_end__ = 0x2000FFFF; define symbol __ICFEDIT_region_SRAM1_start__ = 0x20010000; define symbol __ICFEDIT_region_SRAM1_end__ = 0x2004BFFF; define symbol __ICFEDIT_region_SRAM2_start__ = 0x2004C000; define symbol __ICFEDIT_region_SRAM2_end__ = 0x2004FFFF; define symbol __ICFEDIT_region_ITCMRAM_start__ = 0x00000000; define symbol __ICFEDIT_region_ITCMRAM_end__ = 0x00003FFF; define symbol __ICFEDIT_region_SRAM_start__ = 0x60000000; define symbol __ICFEDIT_region_SRAM_end__ = 0x601FFFFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x200; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region DTCMRAM_region = mem:[from __ICFEDIT_region_DTCMRAM_start__ to __ICFEDIT_region_DTCMRAM_end__]; define region SRAM1_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__]; define region SRAM2_region = mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__]; define region SRAM_region = mem:[from __ICFEDIT_region_SRAM_start__ to __ICFEDIT_region_SRAM_end__]; define region ITCMRAM_region = mem:[from __ICFEDIT_region_ITCMRAM_start__ to __ICFEDIT_region_ITCMRAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; define block SRAM with alignment = 8 { section .sram }; define block SRAM2 with alignment = 8 { section .sram2 }; define block DTCMRAM with alignment = 8 { section .dtcmram }; define block ITCMRAM with alignment = 8 { section .itcmram }; initialize by copy { readwrite, section .itcmram }; do not initialize { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region { readonly }; place in SRAM1_region { readwrite, block HEAP, block CSTACK}; place in SRAM_region { block SRAM }; place in ITCMRAM_region {block ITCMRAM }; place in DTCMRAM_region {block DTCMRAM }; place in SRAM2_region {block SRAM2 };
  21. Я не противопоставляю одно другому. Генерация билдов по чекиненному коду - привилегия командной работы. По проектам, которые ведешь сам, это не очень удобно. В документации точно так же ведется список фич и пофиксенных багов по билдам и информативность такая же
  22. По описанию да. У меня реально регистр DMA2D_BGCOLR просвечивает не только в режиме А4 и А8, как в документации, но и в АL44 на fore и back. Возможно это баг и надеяться на это не стоит. Мне это не надо было и я некоторое время потратил на поиски паразитных цветов, а оказалось, что регистр был не черный.
  23. Так там есть регистр - цвет бэкграунда. Если у нижнего слоя режим с альфой, то тот бэкграунд просвечивает. Сам пользуюсь блендированием из двух экранов с индексированными цветами в один RGB565. На двух экранах. Выяснил проблемы с FMC, на котором у меня висит 16 битная SRAM. При байтной записи часто ошибается. Приходится и блендирование и операции кодом выравнивать до 16 битных.
  24. Важно то, что когда собрал и она пошла в производство, она точно будет по билду выше прошлой. А на сколько - уже не важно
  25. Не понял задачи. Зачем подключать конденсатор вместо площадки? Хотите измерять конденсатор? У меня на 051 все работает. Я не брал готовые платы, а строил только по аппноутам и кубу. Ошибки были пока не настроил.