zheka 1 3 декабря, 2016 Опубликовано 3 декабря, 2016 (изменено) · Жалоба Господа, скачал я с сайта ST библиотеку STemWIN. В архиве есть примеры под разные платы. STM32F4Discovery, которой я пользуюсь, там нет. Выбрал то что ближе всего - STM324XG_EBAL. Подключил дисплей по FSMC. Ожидал трудностей с адаптацией, ибо контроллеры разные, с разным количеством ног. Опасения не оправдались - заменил пины NE3 на NE1, А0 на A16 и адреса LCD_REG и LCD_DAT подправил - дисплей работает. Отключил инициализацию светодиодов и SRAM (в дискавери нет внешней SRAM). Написал маленькую демку из стандартных функций - дисплей, повторюсь, работает, то есть проблем, обусловленных различием в платах, предвидеться не должно, ибо весь дальнейший код GUI_Init(); GUI_Initialized = 1; /* Start Demo */ GUIDEMO_Main(); } от железа отвязан. Тем не менее, где-то в GUI_Init() программа зависает. В функцию залезть не могу и в тексте ее не нашел, я так догадываюсь, что она непосредственно в библиотеке STemWin, в которую доступа нет. Может ли эта проблема быть связана с тем, что примечик не знает, что у меня нет SRAM? Где это настроить? Возможно ли использовать STemWin без SRAM? У кого-нибудь получалось на Дискавери запускать STEmWin? Изменено 29 ноября, 2022 пользователем haker_fox Уточнил название темы, добавил теги, переместил в нужный раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 3 декабря, 2016 Опубликовано 3 декабря, 2016 · Жалоба Может ли эта проблема быть связана с тем, что примечик не знает, что у меня нет SRAM? Для этого GUI требуется глубокий стек. Я б это проверил для начала. Хотя имея SWD адаптер таких вопросов не должно возникать. Под GCC из командной строки что ли работаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 4 декабря, 2016 Опубликовано 4 декабря, 2016 (изменено) · Жалоба Для этого GUI требуется глубокий стек. Руководство The basic stack requirement is app. 600 bytes. If using the Window Manager additional 600 bytes should be calculated. For Memory Devices further additional 200 bytes are recommended. Please note that the stack requirement also depends on the application, the used compiler and the CPU. И потом - я же брал готовый пример, которорый компилится без единого warning. Я справедливо полагал, что там все нормально. В настройках stack равен 4096 байт. Виснет в функции LCD_X_Config на строке GUIDRV_FlexColor_Config(pDevice, &Config); И вот еще - я использую пример "Standalone", то есть без RTOS Изменено 4 декабря, 2016 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба А какой у Вас размер буфера STemWin? Драйверу FlexColor нужно задавать указатели на функции доступа к FSMC. Вы их задали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба А какой у Вас размер буфера STemWin? А где его посмотреть? Я менял #define GUI_NUMBYTES (1024) * 512 на #define GUI_NUMBYTES (320) * 240*2 , если вы об этом. Драйверу FlexColor нужно задавать указатели на функции доступа к FSMC. Вы их задали? Уважаемый. Вот если бы я писал что-то с нуля, такое предположение было бы кстати. Но я использую готовое. Значит разработчик задал. Эти указатели нужно менять в связи с тем, что я перенастроил FSMC под другой банк памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба Я менял #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]; Уважаемый. Вот если бы я писал что-то с нуля, такое предположение было бы кстати. Но я использую готовое. Значит разработчик задал. Эти указатели нужно менять в связи с тем, что я перенастроил FSMC под другой банк памяти? От адреса не зависит, т.к. ему пофиг на какие-то адреса. Там просто функции типа записать команду/данные и пр. А по каким адресам и как Вы это делаете - Ваше личное дело. Хоть через уарт :rolleyes: Вот как я делал: 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. Проблем не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба Куда это вставлять? ТАм же где GUI_NUMBYTES ? define STACK_SIZE 0x00000300 /*!< The Stack size suggest using even number */ __attribute__ ((section(".co_stack"))) unsigned long pulStack[STACK_SIZE]; Что-то не помогло. Все также виснет на GUIDRV_FlexColor_Config ( pDevice, &Config ); 1. Не использовать Flexcolor. Использовать свои функции для работы с дисплеем. Так со своими (а точнее имеющимися все в том же примере от ST, функциями, названия которых отличаются от тех, что прописаны указателями) дисплей работает. Дальше GUI_Init не идет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба Куда это вставлять? ТАм же где GUI_NUMBYTES ? define STACK_SIZE 0x00000300 /*!< The Stack size suggest using even number */ __attribute__ ((section(".co_stack"))) unsigned long pulStack[STACK_SIZE]; Нет, не там. Это размер стека. У меня оно в файле startup_stm32f439xx.c Но в разных компиляторах/средах это выглядеть по-разному. Я привёл пример для Coocox. Но и в нём стартовый код бывает или на Си, или на асме. У меня на Си. Поэтому ориентируйтесь на месте. Так со своими (а точнее имеющимися все в том же примере от ST, функциями, названия которых отличаются от тех, что прописаны указателями) дисплей работает. Дальше GUI_Init не идет. Свои функции - я имел в виду полностью Ваш драйвер дисплея. Не flexColor. если хотите - выложу полный пример STemWinDemo с полностью моим драйвером SSD1969. Драйвер сами подмените на ваш. Там требуются только функции типа записать/считать пиксель. Ну и инициализация дисплея конечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба Нет, не там. Это размер стека. У меня оно в файле startup_stm32f439xx.c Но в разных компиляторах/средах это выглядеть по-разному. Я привёл пример для Coocox. Но и в нём стартовый код бывает или на Си, или на асме. У меня на Си. Поэтому ориентируйтесь на месте. У меня такой же файл, только с расширением .S и это выглядит вот так Stack_Size EQU 0x2000 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> </h> Heap_Size EQU 0x2000 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit Не использовать Flexcolor. Использовать свои функции для работы с дисплеем. А где его отключать и как использовать свои функции? Все в том же LCD_X_Config? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба стек 0x2000 - вполне достаточно. Прочитайте мой предыдущий пост. Я его обновил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба если хотите - выложу полный пример STemWinDemo с полностью моим драйвером SSD1969 Буду благодарен, потому как конечная моя цель - это именно SSD1969, просто для начала я хотел запустить то, что как бы оттестировано разработчиком - ILI9325 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба А где его отключать и как использовать свои функции? Все в том же LCD_X_Config? см. вложение. Для Вашего диспа реализуете те же функции, которые вызываются в LCDConf.c Но!! если будете использовать SSD1963, используйте свою инициализацию дисплея. Т.к. она всегда разная. Моя может не подойти. это зависит от матрицы и способа её подключения к SSD1963. Разные тайминги плюс перевороты/зеркалирования изображения бывают по-разному сделаны. STemWinLibrary_drv.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба ..\SSD1963_Driver\SSD1963.c(9): error: #5: cannot open source input file "System.h": No such file or directory Это где искать? Какая то фигня... заменил свои GUICOnf и LCDConf на ваши - стали появляться ошибки, чего-то в них не хватает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба Сорри. Там просто функция задержки на указанное кол-во мс. В инициализации SSD надо. Приложил. Можете свою использовать, если такая у Вас есть. System.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба Еще вопрос. У меня был файл GUIConf_stm3240g_eval, стал Ваш файл GUIConf. То же самое и с LCDConf. Не нашел в проекте, где нужно перепрописать имя. И вообще- такое ощущение, что находящиеся в них функции вызываются из самой библиотеки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться