Jump to content

    

Не могу подружить SDRAM и LTDC

6 minutes ago, MementoMori said:

Господа, уж очень неадекватные скорости чтения SDRAM....

Процессором скорость чтения проверьте.

Share this post


Link to post
Share on other sites
Just now, aaarrr said:

Процессором скорость чтения проверьте.

Как? В цикле вызывать a=*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*(uwIndex) ?

Я в ассемблере полный ноль, боюсь, что такой код на С сформирует много ненужных тактов.

У меня память 32 бит* 1 Meg* 4 банка. Нижеследующий код 

 

for (uwIndex = 0; uwIndex < 4194304; uwIndex++)
		{

			ADDRESS=*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*(uwIndex));
		

		}	

Выполняется примерно за 3 секунды. Получается что около 5,5 мегабайт в секунду.

Попробую ка я его запустить на дискавери....

Share this post


Link to post
Share on other sites

Кошмар... на дискавери, где такая же микросхема, но в ней задействованы лишь 16 бит,  сканируется за 8 секунд...

Надо бы попробовать через DMA...

Share this post


Link to post
Share on other sites
34 minutes ago, MementoMori said:

Выполняется примерно за 3 секунды.

Запредельно медленно.

Share this post


Link to post
Share on other sites

Запредельно медленно - с точки зрения возможностей SDRAM - да.

Запредельно медленно исходя из хотелок - да.

ЗАпредельно ли медленно исходя из возможностей SDRAM+FMC конкретного контроллера? Можете ответить?

 

P.S. что-то не получилось у меня пока с DMA измерить. Заполнение работает, а вот прерывания transfer complete не ловятся, хотя установлены.

Share this post


Link to post
Share on other sites
2 minutes ago, MementoMori said:

ЗАпредельно ли медленно исходя из возможностей SDRAM+FMC конкретного контроллера? Можете ответить?

Никогда не использовал STM32 с SDRAM (и едва ли буду), но не должно быть настолько плохо.

Share this post


Link to post
Share on other sites

MPU_Config();

 SCB_EnableICache();

 SCB_EnableDCache();

Если отключаю это - то еще медленнее....
 

Господа....

Неловко просить, но вдруг у кого будет время - можете глянуть проект. Там только настройки периферии, никакого кода. Посмотрите, может кто увидит где у меня косяк и почему так медленно работает SDRAM.....

 

https://cloud.mail.ru/public/2XX8/4nDNie3iu

Share this post


Link to post
Share on other sites

 

1 hour ago, MementoMori said:

У меня 1 слой.

Слой, то один, но до этого времени Вы упорно пытались ARGB8888 выводить, что в общем-то очень плохая идея.

52 minutes ago, MementoMori said:

ЗАпредельно ли медленно исходя из возможностей SDRAM+FMC конкретного контроллера? Можете ответить?

Специально для Вас проверил (правда F7 у меня нет, проверял на STM32H743, память на 100МГц) заполнение 128МБ SDRAM у меня занимает 342.5мс, кэш данных практически не влияет (что логично для такой операции). Код далек от оптимального (может правда GCC в этот раз смог :)) - обычный цикл с записью словами по 32бита, тем не менее выходит 373.7МБ/с, что почти соответствует максимальной пропускной способности SDRAM в 400МБ/сек.

 

Т.е. где-то в 80раз быстрее, чем у Вас. Я бы смотрел инициализацию FMC и, возможно, настройки тактирования.

 

Вы еще учитывайте, что кроме чтения LTDC часть пропускной способности FMC заберет рисование. В зависимости от того что Вы будете выводить это может быть и больше, чем нужно LTDC :)

Edited by Шаманъ

Share this post


Link to post
Share on other sites
2 minutes ago, Шаманъ said:

обычный цикл с записью словами по 32бита

в асме писали код или на C?

Тот код, что у меня выше - может  там дофига лишних команд. Но ведь я и на железном уровне работал, c LTDC - та же петрушка. Около 3,3 мб/сек.  Чтение приведенным выше кодом - 5 мб/сек (измерения неточные). 

Share this post


Link to post
Share on other sites
Just now, MementoMori said:

в асме писали код или на C?

На С. 

2 minutes ago, MementoMori said:

измерения неточные

Так замеряйте встроенным в МК таймером

Share this post


Link to post
Share on other sites
1 minute ago, Шаманъ said:

Так замеряйте встроенным в МК таймером

Зачем, если и так понятно, что отличия в десятки раз... мне это ничего не даст. Вас не затруднит глянуть мой проект?

Share this post


Link to post
Share on other sites
41 minutes ago, Шаманъ said:

Вы еще учитывайте, что кроме чтения LTDC часть пропускной способности FMC заберет рисование. В зависимости от того что Вы будете выводить это может быть и больше, чем нужно LTDC :)

Я пока ничего не рисую. То есть я нарисовал один раз, а потом LTDC просто перерисовывает экран, я ему не мешаю

Share this post


Link to post
Share on other sites
1 hour ago, MementoMori said:

Вас не затруднит глянуть мой проект?

Только поверхностно, HALом не пользуюсь, поэтому даже при желании и наличии времени всех нюансов не увижу. Из того, что "бросилось в глаза":

1. Обычно на таких частотах память нормально работает с CAS LATENCY 2, у Вас стоит 3. Я бы посмотрел датащит на память на предмет правильного значения.

2. Зачем у Вас стоит флаг SDRAM_MODEREG_BURST_LENGTH_2, если FMC не поддерживает эту фичу (стоит посмотреть датащит на предмет правильного значения этого флага)?

Кстати, а Вы проверяли на какой частоте реально работает SDRAM, LTDC?

Edited by Шаманъ

Share this post


Link to post
Share on other sites
16 minutes ago, Шаманъ said:

CAS LATENCY 2, у Вас стоит 3

В даташите написано что поддерживает 1,2,3, во всех примерах в сети на эту микру и в примере для куба от ST - стоит 3

Я поставил 2 - не скорость не повлияло.

 

16 minutes ago, Шаманъ said:

SDRAM_MODEREG_BURST_LENGTH_2

Даташит говорит  "the Burst Length (BL) of 1 must be selected by configuring the M[2:0] bits to 000 in
the mode register. Refer to SDRAM device datasheet."  Больше о нем ни слова.

Я перебрал все значения - на скорость не влияет.

 

16 minutes ago, Шаманъ said:

стати, а Вы проверяли на какой частоте реально работает SDRAM, LTDC?

Нет пока такой реальной возможности. Осциллограф у меня слабенький. Сужу по факту низкого обмена данными. Я кстати, не писал что именно SDRAM так работает, она так работает в связке с LTDC.  Но без него, при простом обращении по адресу в памяти скорость чтения тоже невысока, повторюсь, я не знаю точной скорости, но мне очевидно, что она в десятки раз ниже.

Share this post


Link to post
Share on other sites
3 minutes ago, MementoMori said:

Нет пока такой реальной возможности.

Можно вывести на пин частоту после делителя. Ну и таймер какой-нибудь надо освоить - без внутреннего источника времени не измерить ничего толком.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this