реклама на сайте
подробности

 
 
> STM342F4 и FSMC, эксплуатация
__inline__
сообщение Jun 27 2018, 07:47
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Использую отладочную плату STM32F4Discovery (контроллер STM32F407) и LCD, подключенный по FSMC (дисплей от телефона Sony Ericsson K800i).

Обмен данными с дисплеем идёт нормально до частоты процессора 112 МГц.

Стоит поднять частоту до 168 МГц - при записи в видеопамять дисплея возникают сбои: неправильная запись данных или декодирует их как команды (при этом дисплею окончательно сносит крышу). Пробовал выставлять разные Address_Setup, Data_Setup - не помогло.

Обнаружил, если снизить частоту тактирования на линию порта GPIO D7 - это !CS LCD до 2 МГц, или подсоединить этот вывод через резистор 820 Ом (с меньшими значениями не игрался), то всё работает корректно. Причём, дисплей заводится на сверх-быстрых времянках!

В принципиальной схеме на телефон на каждой линии "дисплей-процессор" стоит конденсатор 33 пФ на землю.

Дисплей соединён с отладочной платой "макаронами" длиной 10 см. На шине больше ничего кроме дисплея нет.

Какие причины столь странного поведения? От чего без резистора на линии !CS дисплей глючит?

Код настройки GPIO и FSMC ниже(работает):

CODE
void GPIO(void)
{
GPIO_InitTypeDef gpio;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_
GPIOE,ENABLE);

//LCD
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); // D0
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); // D1
GPIO_PinAFConfig(GPIOD,GPIO_PinSource0 ,GPIO_AF_FSMC); // D2
GPIO_PinAFConfig(GPIOD,GPIO_PinSource1 ,GPIO_AF_FSMC); // D3
GPIO_PinAFConfig(GPIOE,GPIO_PinSource7 ,GPIO_AF_FSMC); // D4
GPIO_PinAFConfig(GPIOE,GPIO_PinSource8 ,GPIO_AF_FSMC); // D5
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9 ,GPIO_AF_FSMC); // D6
GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); // D7
GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); //A16 => RS
GPIO_PinAFConfig(GPIOD,GPIO_PinSource7 ,GPIO_AF_FSMC); //NE1 => CS !!! ВОСПРИИМЧИВ К ПОМЕХАМ !!! РЕЗИСТОР ИЛИ ПОНИЗИТЬ ЧАСТОТУ GPIO D7
GPIO_PinAFConfig(GPIOD,GPIO_PinSource4 ,GPIO_AF_FSMC); //NOE => RD
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5 ,GPIO_AF_FSMC); //NWE => WR

gpio.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_11
|GPIO_Pin_14|GPIO_Pin_15;
gpio.GPIO_Mode=GPIO_Mode_AF;
gpio.GPIO_Speed=GPIO_Speed_100MHz;
gpio.GPIO_OType=GPIO_OType_PP;
gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD,&gpio);

gpio.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
gpio.GPIO_Mode=GPIO_Mode_AF;
gpio.GPIO_Speed=GPIO_Speed_100MHz;
gpio.GPIO_OType=GPIO_OType_PP;
gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE,&gpio);

//LCD !RST B11
gpio.GPIO_Pin=GPIO_Pin_11;
gpio.GPIO_Mode=GPIO_Mode_OUT;
gpio.GPIO_Speed=GPIO_Speed_2MHz;
gpio.GPIO_OType=GPIO_OType_PP;
gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB,&gpio);

//LCD WSYNC B3
gpio.GPIO_Pin=GPIO_Pin_3;
gpio.GPIO_Mode=GPIO_Mode_IN;
gpio.GPIO_Speed=GPIO_Speed_2MHz;
gpio.GPIO_OType=GPIO_OType_PP;
gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB,&gpio);

//LED TEST D12
gpio.GPIO_Pin=GPIO_Pin_12;
gpio.GPIO_Mode=GPIO_Mode_OUT;
gpio.GPIO_Speed=GPIO_Speed_2MHz;
gpio.GPIO_OType=GPIO_OType_PP;
gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD,&gpio);
}

void FSMC(void) //!!! HCLK=168 MHz
{
FSMC_NORSRAMTimingInitTypeDef fsmcTimingRead,fsmcTimingWrite;
FSMC_NORSRAMInitTypeDef fsmc;

RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);

fsmcTimingRead.FSMC_AddressSetupTime=1; //!!!
fsmcTimingRead.FSMC_AddressHoldTime=0;

fsmcTimingRead.FSMC_DataSetupTime=13; //RD

fsmcTimingRead.FSMC_BusTurnAroundDuration=0;
fsmcTimingRead.FSMC_CLKDivision=0;
fsmcTimingRead.FSMC_DataLatency=0;
fsmcTimingRead.FSMC_AccessMode=FSMC_AccessMode_A;

memcpy(&fsmcTimingWrite,&fsmcTimingRead,sizeof(fsmcTimingRead));

fsmcTimingWrite.FSMC_DataSetupTime=2; //WR

fsmc.FSMC_Bank=FSMC_Bank1_NORSRAM1;
fsmc.FSMC_DataAddressMux=FSMC_DataAddressMux_Disable;
fsmc.FSMC_MemoryType=FSMC_MemoryType_SRAM;
fsmc.FSMC_MemoryDataWidth=FSMC_MemoryDataWidth_8b;
fsmc.FSMC_BurstAccessMode=FSMC_BurstAccessMode_Disable;
fsmc.FSMC_WaitSignalPolarity=FSMC_WaitSignalPolarity_Low;
fsmc.FSMC_WrapMode=FSMC_WrapMode_Disable;
fsmc.FSMC_WaitSignalActive=FSMC_WaitSignalActive_BeforeWaitState;
fsmc.FSMC_WriteOperation=FSMC_WriteOperation_Enable;
fsmc.FSMC_WaitSignal=FSMC_WaitSignal_Disable;
fsmc.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
fsmc.FSMC_ExtendedMode=FSMC_ExtendedMode_Enable; //For Different Read & Write Timings !!!
fsmc.FSMC_WriteBurst=FSMC_WriteBurst_Disable;

fsmc.FSMC_ReadWriteTimingStruct=&fsmcTimingRead;
fsmc.FSMC_WriteTimingStruct=&fsmcTimingWrite;

FSMC_NORSRAMInit(&fsmc);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1,ENABLE);
}


Сообщение отредактировал IgorKossak - Jun 29 2018, 11:34
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
__inline__
сообщение Jul 6 2018, 10:11
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Всё просто замечательно! rolleyes.gif

Подключил дисплей к FMC, настроил времянки. Задействовал кеширование. Вышло 41 FPS.

Потом сделал двойную буферизацию, задействовал ДМА память-память. В итоге пока процессор рендерит один кадр, ДМА отправляет на LCD готовый кадр.
Путём таких ухищрений удалось выжать 63 FPS.

Видео (по сравнению с видео выше с STM32F407, скорость намного выше 63 vs. 24 FPS): http://www.youtube.com/watch?v=4VpX5UfkmWA

Исходники для STM32H743 Ниже. Просьба не ругаться(за кало-Куб), нужно было оценить отладочную плату и процессор STM32H743.

Прикрепленный файл  Tunnel_STM32H743_DMA.rar ( 1.2 мегабайт ) Кол-во скачиваний: 34



Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 12:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Jul 6 2018, 13:11) *
Видео (по сравнению с видео выше с STM32F407, скорость намного выше 63 vs. 24 FPS): http://www.youtube.com/watch?v=4VpX5UfkmWA

При FPS=24 вообще нет смысла тратить столько ног на LCD - можно по SPI подключить и получить такую же скорость.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 6 2018, 12:24
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(jcxz @ Jul 6 2018, 13:18) *
При FPS=24 вообще нет смысла тратить столько ног на LCD - можно по SPI подключить и получить такую же скорость.

24 FPS - это общий FPS: рендеринг картинки в буфер + перекидывание буфера на дисплей, а не чисто-перекидывание на дисплей

Если перекидывание буфера на экран через SPI даст 24 FPS, то общий FPS программы упадёт до 10 и меньше.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 12:29
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Jul 6 2018, 15:24) *
24 FPS - это общий FPS: рендеринг картинки в буфер + перекидывание буфера на дисплей, а не чисто-перекидывание на дисплей

Я это понял. Я и говорю, что с такой скоростью отрисовки, не нужна параллельная шина, можно использовать SPI.

Цитата(__inline__ @ Jul 6 2018, 15:24) *
Если перекидывание буфера на экран через SPI даст 24 FPS, то общий FPS программы упадёт до 10 и меньше.

"Перекидывание" даёт FPS=~36 при 45МГц SCLK и 16 бит цвета. А рисование не должно ему мешать если идёт в это время в другой буфер. Таким образом если у вас только рисование даёт 24Гц, то передача по SPI не снизит эту скорость.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 6 2018, 13:26
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(jcxz @ Jul 6 2018, 13:29) *
Я это понял. Я и говорю, что с такой скоростью отрисовки, не нужна параллельная шина, можно использовать SPI.

"Перекидывание" даёт FPS=~36 при 45МГц SCLK и 16 бит цвета. А рисование не должно ему мешать если идёт в это время в другой буфер. Таким образом если у вас только рисование даёт 24Гц, то передача по SPI не снизит эту скорость.


Там где 24 Гц - это на STM32F407. У него 128+64 кБ памяти, хватает только на один буфер 320x240x2 и то, он реализован кусками!

Двойная буферизация в STM32H743. Но там 63 FPS.


Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 16:37
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Jul 6 2018, 16:26) *
Там где 24 Гц - это на STM32F407. У него 128+64 кБ памяти, хватает только на один буфер 320x240x2 и то, он реализован кусками!

320*240/4=19200 - должно хватать на бОльшее.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 7 2018, 04:10
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(jcxz @ Jul 6 2018, 17:37) *
320*240/4=19200 - должно хватать на бОльшее.


2 байта на пиксел. 16bpp.

320x240x2=150 кБ
два буфера - уже 300 кБ < 192 кБ в stm32f407 biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 7 2018, 06:35
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Jul 7 2018, 07:10) *
2 байта на пиксел. 16bpp.
320x240x2=150 кБ
два буфера - уже 300 кБ < 192 кБ в stm32f407 biggrin.gif

Я понимаю, что можно и 4 байта на пиксел положить, но зачем если памяти мало??
У меня 320x240x4 (4bpp конечно-же) в STM32F429 во внутренней памяти и буфер прекрасно влазит в CCM.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 7 2018, 06:47
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(jcxz @ Jul 7 2018, 07:35) *
Я понимаю, что можно и 4 байта на пиксел положить, но зачем если памяти мало??
У меня 320x240x4 (4bpp конечно-же) в STM32F429 во внутренней памяти и буфер прекрасно влазит в CCM.

Видите ли, в чём дело... Вы со своей колокольни смотрите на проблему. Я же со своей. Тот туннель, что я выкладывал - ну никак не смотрится в 16 цветах - слишком убого. И в 256 цветах тоже будет плохо смотреться. Поэтому было принято решение использовать 65536 цветов.

Цель была - перенести алгоритм построения трёхмерного туннеля из этой программы: http://www.sulaco.co.za/opengl_project_racing_tunnel.htm , не угробив при этом цветопередачу текстуры.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- __inline__   STM342F4 и FSMC   Jun 27 2018, 07:47
- - ViKo   Глючит от отражений в линии. Спасают резисторы пос...   Jun 27 2018, 08:03
|- - __inline__   Цитата(ViKo @ Jun 27 2018, 09:03) Глючит ...   Jun 27 2018, 12:12
- - k155la3   Надо посмотреть по док. на дисплей, выдерживаются ...   Jun 27 2018, 08:54
- - ViKo   Тогда нужно нарисовать на бумаге временную диаграм...   Jun 27 2018, 12:20
|- - __inline__   Цитата(ViKo @ Jun 27 2018, 13:20) Тогда н...   Jun 27 2018, 13:27
- - ViKo   По моему, шину нужно 8-битовой определить. А посыл...   Jun 27 2018, 14:10
|- - __inline__   Цитата(ViKo @ Jun 27 2018, 15:10) По моем...   Jun 28 2018, 00:41
|- - VladislavS   Цитата(__inline__ @ Jun 28 2018, 03:41) И...   Jun 28 2018, 04:15
- - ViKo   Дергается на каждый байт. Как для обычных 8 битовы...   Jun 28 2018, 05:38
|- - VladislavS   Цитата(ViKo @ Jun 28 2018, 08:38) Дергает...   Jun 28 2018, 06:54
|- - __inline__   Цитата(VladislavS @ Jun 28 2018, 06:54) Е...   Jun 28 2018, 11:27
|- - VladislavS   Цитата(__inline__ @ Jun 28 2018, 14:27) С...   Jun 28 2018, 12:02
|- - jcxz   Цитата(VladislavS @ Jun 28 2018, 15:02) п...   Jun 28 2018, 22:27
|- - VladislavS   Цитата(jcxz @ Jun 29 2018, 01:27) А зачем...   Jun 29 2018, 01:58
|- - jcxz   Цитата(VladislavS @ Jun 29 2018, 04:58) Н...   Jun 29 2018, 04:41
- - __inline__   Ещё проделал эксперимент. Устройство на шине одно...   Jun 28 2018, 06:13
- - ViKo   Адресом разделяйте.   Jun 28 2018, 06:20
- - __inline__   Разобрался с быстрым копированием по 128 байт за р...   Jul 1 2018, 14:07
- - __inline__   Дисплей активно работает по FSMC, сбоев не замечен...   Jul 2 2018, 09:59
- - __inline__   Подключил дисплей к Nucleo-144 STM32H743. Переста...   Jul 3 2018, 14:10
- - k155la3   Поосторожнее с "касанием пинцетом". Смен...   Jul 3 2018, 15:28
|- - __inline__   Цитата(k155la3 @ Jul 3 2018, 15:28) Поост...   Jul 4 2018, 07:30
- - k155la3   Я не полагался бы так стопроцентно на HAL куба. Ск...   Jul 5 2018, 04:05
|- - __inline__   Цитата(k155la3 @ Jul 5 2018, 04:05) Я не ...   Jul 5 2018, 07:12
- - __inline__   Обнаружил, что я не одинок, глюк присутствует ещё ...   Jul 5 2018, 11:04
|- - jcxz   Цитата(__inline__ @ Jul 5 2018, 14:04) Об...   Jul 5 2018, 11:18
|- - __inline__   Цитата(jcxz @ Jul 5 2018, 11:18) И что ха...   Jul 5 2018, 12:55
|- - jcxz   Цитата(__inline__ @ Jul 5 2018, 15:55) Ну...   Jul 5 2018, 14:50
- - __inline__   Вопрос по поводу кеша возник не случайно. Так как ...   Jul 5 2018, 16:50
|- - jcxz   Цитата(__inline__ @ Jul 7 2018, 09:47) То...   Jul 7 2018, 06:56
|- - __inline__   Цитата(jcxz @ Jul 7 2018, 07:56) Туннель ...   Jul 7 2018, 07:10
- - __inline__   Собственно, что мы затеваем: http://vrtp.ru/index....   Jul 9 2018, 09:37


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 14:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016