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

MementoMori

Свой
  • Постов

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

  • Посещение

Весь контент MementoMori


  1. Да, полностью решил, все работает. На самом деле термин "висло", как оказалось, не совсем правильный. В двух словах ответить вам не получится. Не знаю, насколько глубоко Вы разобрались в написании алгоритма, но попробую разжевать. IDE (то есть KEIL) в первую очередь вызывает функцию Init. Поставьте в конце этой функции какой-нибудь маячок - зажигание светодиода или, что я настоятельно рекомендую не полениться и сделать, настройте UART на отправку отладочных сообщений. Уверен, что маячок этот, будучи выставлен в конце init сработает даже при включенном тактировании QSPI, которое, как вам кажется, вешает контроллер. Следующий шаг, которые делает IDE - пытается стереть сектор. Перед стиранием она вызывает функцию BlankCheck, которая сверяет содержимое памяти с образцом (как правило затирание осуществляется не нулями, а 0xFF) и за зря не стирает ячейку, не расходует ее ресурс. Если функция BlankCheck в тексте алгоритма есть, то IDE ею пользуется. Если нет, то общается с памятью как с единым адресным пространством. А чтобы это было возможно, QSPI нужно не только проинициализировать, но и включить Memory Mapped Mode. Резюме - посмотрите, есть ли у вас функция BlankCheck. Если нет, то создайте ее, но пустую, чтобы всегда возвращала 0. То же самое и с EraseSector. И поставьте в функциях маячки. А потом расскажите, все ли они сработали. Потом будем разбираться с вашей проблемой дальше.
  2. Я вот недавно тоже был в таких же метаниях. Был у меня и кабель OTG, и разъемы с проводами без экрана, не знал, что лучше сделать - сколхозить, или смастерить кабель из готового. Выбрал второе. Перекусил OTG кабель - а он без экрана) И D+/D- в пару не свиты)
  3. Без touchgfx я картинки не выводил, так, прямоугольниками баловался - без глюков. А какой кеш отключить - I или D? Там лежит цвет 0x00, который используется как маска прозрачности. При этом, если в первой полосе есть участок самой картинки, любого цвета, это не влияет на результат - полоса везде либо розовая, либо зеленая. Но это в qspi flash. А вот с видеобуфером я не сверял. У меня их два, это нужно еще вычислить адрес. Я ж не ручками картинку вывожу, а библиотекой, в которой пока не сильно ориентируюсь. Попробую проверить
  4. Я выше приводил код настройки mpu. И писал, что как раз таки добавление в mpu настроек для адресов sdram избавило от одной из описанных проблем - от полос на круге. I-cache и d-cache включены по умолчанию. Я их отключал по очереди, ни на что не повлияло. Посмотрите код на предыдущей странице, может я вас не так понял?
  5. Вопрос о памяти (по крайней мере о трассировке) и помехах закрыт. Отключил в TouchGFX акселератор ChromART (DMA2D) - все глюки исчезли. Тогда вопрос к людям, конкретно, работавшим с ChromART. Что с ним может быть не так? Вот на всякий случай мои настройки DMA2D
  6. Делал даже так, чтобы каждый при каждом чтении приходилось обращаться в две соседние ячейки, а потом клеить ответ result_byte=*(__IO uint32_t*)(0xD0000000 + 4*uwIndex+1); - адрес увеличивал на единичку, то есть читались биты 8-31, затем в следующей ячейке 0-7 ошибок нет.
  7. Вот таким тестом долго гонял вчера память Ошибок нет. Может есть какой-нибудь более агрессивный тест?
  8. Наполовину проблему решил!!! Дело было в MPU_Config() Оказывается куб сгенерировал автоматом настройки только для QSPI, то есть для адреса 0x90000000. Я настроил согласно AN4861, поменяв только адреса и размеры буферов - изображения всех виджетов пришли в норму - проблемы были со многими, на картинке я привел лишь сектор, он теперь без полосок. Но полосы в начале и в конце некоторых виджетов и в текстовых элементах все равно остались. Посмотрите как я настроил - может у меня все еще что-то не так? Для справки - у меня SDRAM по адресу 0xD0000000, буферизация двойная, второй буфер по адресу 0x90200000 (размер буфера 0x1C2000). void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0xD0000000; MPU_InitStruct.Size = MPU_REGION_SIZE_16MB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER1; MPU_InitStruct.BaseAddress = 0xD0000000; MPU_InitStruct.Size = MPU_REGION_SIZE_2MB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER2; MPU_InitStruct.BaseAddress = 0xD0200000; MPU_InitStruct.Size = MPU_REGION_SIZE_2MB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER3; MPU_InitStruct.BaseAddress = 0x90000000; MPU_InitStruct.Size = MPU_REGION_SIZE_256MB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER4; MPU_InitStruct.BaseAddress = 0x90000000; MPU_InitStruct.Size = MPU_REGION_SIZE_16MB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RO; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); }
  9. Вы, батенька, садист))) Но я последовал Вашему совету - не помогло.
  10. Оно конечно малопонятно, но так, для информации - подсвечены те линии, которые в 16 битном режиме не задействованы, то есть те, которые в 32 битном режиме могут создавать проблемы. Клок - это идущая отдельно от остальных линия, в левых отделах схемы. По картинке неясно, но клок идет в отдельном слое, окружен землей.
  11. Попутный вопрос - а каков пиксельклок у вас? У разработчика touchgfx написано, что более 30 мгц - проблема. У меня как раз на 30 мгц дисплей перестает заводиться. Если с клоком самого дисплея проблема, тогда точно к картинке привязки не будет. Но попробую проверить.
  12. А нельзя ли поподробнее насчет транзакций? Это нечто конкретное и специфичское или вы под этим понимаете обычную операцию чтения записи? Я к чему спрашиваю - тестирование у меня ошибок не выявило. Но вы говорите, при непрерывном чтении ошибеа может и не проявиться. У меня есть мысль -написать свою собственную функцию вывода картинки на экран, чтобы она создавала условия для возникновения ошибки, о которой вы говорите, те условия, которые, предположительно, создает код touchgfx. Если это получится, то значит с touchgfx обвинения снимаются. Так вот как это сделать?
  13. Хорошо, вечером приведу длины проводников. Вообще, я все тестировал в гиперлинксе, глазковая диаграмма более чем хороша, перекрестные помехи имели место лишь где-то на линиях дисплея, но не превышали 200 мВ.
  14. Работает sdram как таковая? Или в связке с touchgfx? Если второе, то какая у вас глубина цвета? Попробовал на дискавери - там конечно же только 16 битный режим памяти, но артефактов нет даже при rgb888. А на моей плате, если включаешь 16 бит, то исчезают только те полосы, что сбоку картинок, полосатость же круга остается, чтоб ее убрать, нужно включать rgb565. Проц и память те же, только в bga. Но с другой стороны, экран меньше. Вот и ищи, блин, отличия... Может, dma2d чудит?
  15. Тестировал заполнением псевдослучайной последовательностью. Мне кажется, если бы проблемы были в том, о чем вы говорите, то есть косяки на конкретных линиях данных, то артефакты были бы привязаны не к месту, а к цвету. И не были бы постоянны. А тут есть элементы интерфейса, которые не подвержены этой проблеме. То есть по проблема возникает при каком-то определенном "спецэффекте" графического движка. Но непонятно, как на это влияет разрядность, если графический движок про память вообще ничего не знает. Кстати, еще одна проблема - на круге полосы видите? Так вот эта проблема решается двумя действиями - переключением цвета в формат rgb565 и пресловутым включением памяти в 16 битный режим.
  16. TouchGFX и 32 битная SDRAM

    Господа, продолжаю бороться со связкой STM32F746+SDRAM MT48LC4M32B2P-6A +TouchGFX. C созданием и компиляцией проекта проблем нет. Но при работе есть артефакты. Вот такие вертикальные полосы сбоку от элементов Избавиться от них удалось лишь тогда, когда я инициализировал память не в 32, а в 16-битном режиме. И это, если честно, вызвало удивление. С одной стороны, SDRAM проецируется в единое адресное пространство и TouchGFX работает с ней, даже не зная, что это SDRAM. Для системы - что 16 бит, что 32 - без разницы. То есть проблема должна быть с аппаратной частью SDRAM. но с другой стороны - я неоднократно тестировал SDRAM - ошибок нет. А вот в работе с TouchGFX появляются артефакты. Что интересно, похожие вертикальные белые полосы, но не с краю, а внутри картинок появились когда я случайно в одном месте, где инициализируется SDRAM, указал CAS Latency=2, а в другом - 3. То есть в принципе аппаратная проблема может иметь место. Смех в том, что когда я еще прорабатывал архитектуру и думал, стоит ли заморачиваться с 32 бит, один товарищ здесь на форуме написал, что у него с 16 бит были артефакты, которые исчезли, когда он поставил 32 бит. Может есть какие тонкости в работе с 32 битной SDRAM? Кто-нибудь сталкивался с подобной проблемой? Вот так я ее инициализирую
  17. Да!!!!!!!!!!!!! Надеюсь, уважаемый Forger не переел попкорна?)) Отдельное спасибо Владиславу.
  18. Как бы там ни было, но первую проблему я решил без вас. Отправляйтесь в игнор.
  19. Мне таки скинули добрые люди тот же самый проект-шаблон из той же самой папки. В списке появились необходимые контроллеры. Все! Значит в моей 5.23 версии был какой-то косяк в этом проекте. Forger, я ради интереса попереключал версии компилятора - ни к чему плохому это не привело. Так что ваш FacePalm - скорее в ваш адрес. Только, как я и предполагал - проблемы это не решило. Скачал я тот проект. В списке появились контроллеры F7 и ядро M7. Проблема выбора контроллера решена. Этот пустой проект при записи кейлом во внешнюю флеш не выводит ошибок, перебирает адреса, думая что все ОК, так как функция стирания сектора возвращает 0. Ура! Идем дальше! Читаем мануал: Делаем так же int Init (unsigned long adr, unsigned long clk, unsigned long fnc) { /* Enable the QSPI interface clock */ RCC->AHB3ENR |= 0x00000002; /* Reset QSPI peripheral */ RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST); /* Reset */ RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST); /* Release reset */ /* Enable Quad-SPI peripheral */ QUADSPI->CR = 0x00000001; /* Add your Code */ return (0); // Finished without Errors } Компилируем, запускаем основной проект, пытаемся прошивать - процесс останавливается на адресе 0x90000000 и выдает ошибку Добавлено after 1 minute 43 seconds: Забыл сказать - вычисляя, на каком же этапе происходит затык, я пришел к тому, что уже на этапе включения тактирования int Init (unsigned long adr, unsigned long clk, unsigned long fnc) { /* Enable the QSPI interface clock */ RCC->AHB3ENR |= 0x00000002; /* Add your Code */ return (0); // Finished without Errors } Этого достаточно, чтобы фунция EraseSector перестала вызываться. Вот проект - работоспособный шаблон, который перестает работать как только включаешь тактирование QUADSPI https://cloud.mail.ru/public/2zaK/2JA9N5d9L
  20. Мануалы... наставники.... CMSIS... стартап... Мне таки скинули добрые люди тот же самый проект-шаблон из той же самой папки. В списке появились необходимые контроллеры. Все! Значит в моей 5.23 версии был какой-то косяк в этом проекте.
  21. 5.23. "use default compiler version" Да, говорит legacy pack, но не ругается, а предупреждает и предлагает скачать.
  22. Меня в этот шаблон долго тыкали носом. Первое, что я сделал - попытался поменять - не вышло. Но компилятор схавал подключенные библиотеки для F7, код запустился в памяти, правильно дергал ножками. Я решил что это несущественно и подзабыл про этот факт, теперь к нему вернулся. БИНГО!!!! А теперь попробуйте поменять! Об этом другая тема - здесь и на радиокоте. Не меняется. Паки под F7 установлены, в обычных проектах F7 видится. При загрузке же шаблона сообщает об ошибке, об отсутствии необходимых паков. Предлагает скачать, дает ссылку. Скачиваю, устанавливаю - без ошибок. Но выбрать F7 все равно не могу его нет. У меня в software pack есть F7, а в deviceDatabase нет. Если я открываю проект с шаблоном их папки Keil - у меня кнопка SOftwarePack НЕАКТИВНА Да, мне уже сказали в соседней теме, что нужно пересоздавать проект, но я не пойму, КАК ПОЛУЧИЛОСЬ У ВАС с кейловским проектом выбрать F7: Маааленькая просьба. Можете выложить этот Template из вашей папки Keil? у Вас версия keil какая?
  23. Ну не надо делать из меня лентяя. Я лишь хочу запрограмммировать qspi флеш. Уважаемые господа в одной из тем, говорят, что это 15 минутное дело, стоит только взять шаблон и прочесть мануал. Я все делаю как сказано, но не выходит.
  24. В мануале Keil, в который меня тычут носом уже полторы недели, не написано, как создавать и настраивать проект под алгоритм, чтобы он компилировался в FLM. Мануал на эту тему начинается словами "возьмите наш шаблон". Я-то могу попробовать. Создам - не заработает - и буду дальше гадать - то ли я настроил неправильно (а как правильно, нигде не написано), то ли.... Кто знает, может быть и не в этом причина. ВОт скажите - указание в настройках target конкретного чипа - на что влияет? Или это для галочки? У меня чип не указан, ядро указано M0. Но библиотиеки от F7 подключены, проект компилируется, запускается... Может быть неверное указание чипа причиной того, что включение тактирования QSPI вешает программу?
  25. Первый мой пост Скриншот сделать? Как я понял, в разделе "Target" можно указать либо конкретный контроллер либо абстрактно ядро. И то и другое заканчивается на M4
×
×
  • Создать...