Плата с 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);
}
{
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);
}
Так все заработало