Цитата(zheka @ Dec 4 2016, 08:49)

Я менял #define GUI_NUMBYTES (1024) * 512 на #define GUI_NUMBYTES (320) * 240*2 , если вы об этом.
Да, я об этом. Осмелюсь предположить, что вы используете дисплей 320x240

. Но размер буфера никак не связан с размером дисплея.
320*240*2 = 150 кил -- ну нет в F407 такого объёма памяти одним куском.
На Ф407 (дискавери) я использовал
#define GUI_NUMBYTES 64 *1024
64кила должно хватить для большинства задач.
Стек брал
Код
#define STACK_SIZE 0x00000300 /*!< The Stack size suggest using even number */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
Цитата(zheka @ Dec 4 2016, 08:49)

Уважаемый. Вот если бы я писал что-то с нуля, такое предположение было бы кстати.
Но я использую готовое. Значит разработчик задал.
Эти указатели нужно менять в связи с тем, что я перенастроил FSMC под другой банк памяти?
От адреса не зависит, т.к. ему пофиг на какие-то адреса. Там просто функции типа записать команду/данные и пр. А по каким адресам и как Вы это делаете - Ваше личное дело. Хоть через уарт
Вот как я делал:
CODE
void LCD_X_Config ( void )
{
GUI_DEVICE *pDevice;
CONFIG_FLEXCOLOR Config = {0};
GUI_PORT_API PortAPI = {0};
// Set display driver and color conversion
pDevice = GUI_DEVICE_CreateAndLink ( GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0 );
// Display driver configuration, required for Lin-driver
LCD_SetSizeEx ( 0, XSIZE_PHYS , YSIZE_PHYS );
LCD_SetVSizeEx ( 0, VXSIZE_PHYS, VYSIZE_PHYS );
// Orientation
Config.Orientation = 0; // (GUI_MIRROR_X | GUI_MIRROR_Y);
Config.FirstCOM = 0x01;
Config.FirstSEG = 0x02;
GUIDRV_FlexColor_Config ( pDevice, &Config );
/*
+ void (* pfWrite16_A0) (U16 Data); // Запись в регистр команд
+ void (* pfWrite16_A1) (U16 Data); // Запись в регистр данных
+ void (* pfWriteM16_A1)(U16 * pData, int NumItems); // Запись блока в регистр данных
+ void (* pfReadM16_A1) (U16 * pData, int NumItems); // Чтение блока из регистр данных
+ U16 (* pfRead16_A1) (void); // Чтение регистра данных
void (* pfWriteM16_A0)(U16 * pData, int NumItems);
U16 (* pfRead16_A0) (void);
void (* pfReadM16_A0) (U16 * pData, int NumItems);
*/
// Set controller and operation mode
PortAPI.pfWrite16_A0 = SSD1963_WriteCmd; // Функция посылки команды в SSD1963
PortAPI.pfWrite16_A1 = SSD1963_WriteData; // Функция посылки данных в SSD1963
PortAPI.pfWriteM16_A1 = SSD1963_WriteBlock; // Функция записи блока в SSD1963
PortAPI.pfReadM16_A1 = SSD1963_ReadBlock; // Функция чтения блока из SSD1963
PortAPI.pfRead16_A1 = SSD1963_ReadData; // Функция чтения данных из SSD1963
GUIDRV_FlexColor_SetFunc ( pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66720, GUIDRV_FLEXCOLOR_M16C0B16 );
GUIDRV_FlexColor_SetReadFunc66720_B16 ( pDevice, GUIDRV_FLEXCOLOR_IF_TYPE_II );
} // LCD_X_Config
.....................
////////////////////////////////////////////////////
// Функции для драйвера FlexColor
// Запись команды в SSD1963
void SSD1963_WriteCmd ( uint16_t cmd )
{
FSMC_LcdWriteCmd ( cmd );
} // SSD1963_WriteCmd
// Запись данных в SSD1963
void SSD1963_WriteData ( uint16_t data )
{
FSMC_LcdWriteData ( data );
} // SSD1963_WriteCmd
// Чтение данных из SSD1963
uint16_t SSD1963_ReadData ( void )
{
return FSMC_LcdReadData ( );
} // SSD1963_ReadData
// Запись блока в SSD1963
void SSD1963_WriteBlock ( uint16_t *pData, int NumItems )
{
// FSMC_TransferDataDMAToLCD ( pData, NumItems * 2, true );
for ( ; NumItems; NumItems -- )
FSMC_LcdWriteData ( *pData++ );
} // SSD1963_WriteCmd
// Чтение блока из SSD1963
void SSD1963_ReadBlock ( uint16_t *pData, int NumItems )
{
// FSMC_TransferDataDMAFromLCD ( pData, NumItems * 2 );
for ( ; NumItems; NumItems -- )
*pData++ = FSMC_LcdReadData ( );
} // SSD1963_ReadBlock
////////////////////////////////////////////////////
Ну и ещё ложка дёгтя про FlexColor. В нём есть какой-то древнющий баг - не работает чтение пикселей с дисплея.
Проявляется это в виде чёрного следа, тянущегося за любым спрайтом (курсор мыши тоже спрайт).
Я знаю 2 лекарства этой беды:
1. Не использовать Flexcolor. Использовать свои функции для работы с дисплеем.
2. Использовать большой буфер STemWin (GUI_NUMBYTES). Сколько именно надо - не знаю, на F439+SDRAM я использовал 3 метра. В этом случае, видимо, включается некое кэширование и чтение с дисплея не используется (проверял лично). В функции Read вообще никогда не попадает. Но этот вариант на дискаверине не реализуем вообще

.
На дискавери я использовал вариант 1. Проблем не было.