xxxmatrixxx 0 2 апреля, 2022 Опубликовано 2 апреля, 2022 (изменено) · Жалоба Здравствуйте, уважаемые форумчане Для отрисовки графики использую библиотеку STEmWin, сейчас борюсь со следующей проблемой: - 1 раз из 5 включений модуля шрифт текстовых полей SPINBOX, EDIT, MULTIEDIT искажается, при этом никогда не искажается текст в кнопках (BUTTONS) и простые текстовые поля(TEXT) - если при вкл текст исказился, то при перересовки окон он все равно искажается и наоборот(я переключаюсь между 3мя окнами, при этом одно закрываю, а другое открываю): GUI_EndDialog(hWin_SetConfig, 0); // закрывается текущее hWin_Result = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0); // вызывается для другого окна(находится в другом файле) - заметил такую тенденцию, что если добавить при отрисовки элемента функцию задающую цвет текста, причем обязательно с параметром EDIT_CI_ENABLED, то искажение текста при вкл уменьшаются SPINBOX_SetTextColor(hItem, EDIT_CI_ENABLED, GUI_MAKE_COLOR(GUI_BLUE)); EDIT_SetTextColor(hItem, EDIT_CI_ENABLED, GUI_MAKE_COLOR(GUI_BLUE)); Вот картинка при нормальном включении: Вот картинка при включении, когда искажается текст: также прикладываю исходники инициализации STEmWin Conf.rar и как я отрабатываю ее в main: res = GUI_Init(); uart_printf("\033c\r\n"); uart_printf("|||||||||||||||||||||||||||||||||||||||\r\n"); uart_printf("Init MCU Complete\r\n"); uart_printf("Version Program: %s (%s %s) \r\n", VERSION_PROGRAM, __DATE__, __TIME__); Work_Init(); GUI_SelectLayer(0); TS_State.Layer = 0; TS_State.Pressed = 0; WM_MULTIBUF_Enable(0); hDlg = GlCreateWindow_SetConfig(); //HAL_LPTIM_Counter_Start_IT(&hlptim1,200); GUI_Clear(); while (1) { if(TS_State.Pressed){ //uart_printf("T_IRQ: x = %d, y = %d\r\n",TS_State.x,TS_State.y); TS_State.Pressed = 0; GUI_TOUCH_StoreStateEx(&TS_State); } GUI_Delay(10); //GUI_Exec(); } буду рад любой помощи, уже бьюсь с этой проблемой почти неделю... спасибо, жду ответа Изменено 2 апреля, 2022 пользователем xxxmatrixxx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба Урежьте проект только до работы GUI - STEmWin , вместо ваших прикладных программных блоков поставьте заглушки. Минимизируйте код. В листингах компиляции и линковки внимательно почитайте все, а именно warning. "1 раз из пяти включений" это четкая закономерность или среднее значение ? Похоже на неправильное распределение памяти или на "накладку", когда какой-либо указатель "убежал" итд итп Проверьте, все переменные и указатели должны быть изначально инициализированы. Возможна работа с "убитым" указателем. Если есть возможность сменить модель памяти - поменяйте (со "small" на "large" или что там в опциях компилятора ) Покурите док на библиотеку, требования к объему памяти и настройкам компилятора-cреды Ну, и debug, debug и еще раз debug. Делайте точки останова, смотрите что в RAM (если вдруг знакогенератор в RAM) Надо исключить то, что сбой происходит на аппаратном уровне (элементарно из-за неисправного-сбойного LCD или невыполнения требований протокола работы с ним, тайминг-частота, таймаут итд) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xxxmatrixxx 0 3 апреля, 2022 Опубликовано 3 апреля, 2022 (изменено) · Жалоба Quote 1 раз из пяти включений" это четкая закономерность или среднее значение ? среднее значение Quote Похоже на неправильное распределение памяти или на "накладку", когда какой-либо указатель "убежал" итд итп думал об этом, пробовал подсовывать вместо вычисляемых значений чисто константы - текст все равно искажается меня смущает искажение именно на этих элементах(SpinBox, Edit, MultiEdit), на остальных элементах не искажается текст вот выделение памяти 'Invoking: GNU ARM Cross Print Size' arm-none-eabi-size --format=berkeley "stm32_depth.elf" text data bss dec hex filename 227928 3744 112240 343912 53f68 stm32_depth.elf 'Finished building: stm32_depth.siz' и сам линковщик STM32L496ZGTx_FLASH.ld Quote Надо исключить то, что сбой происходит на аппаратном уровне (элементарно из-за неисправного-сбойного LCD или невыполнения требований протокола работы с ним, тайминг-частота, таймаут итд) сразу стал проверять, посмотрел времянку осцилом, т.к. передаю данные на дисплей по FSMC, а считываю данные от тачскрина по SPI я увеличил тайминги FSMC, но это не привело к улучшению результата, да и там дается определенные схемы работы,т.е. не все сигналы могу подвинуть да и как-то при такой ситуации, где виноват FSMC, неясно, почему остальные символы текстовые не искажаются у меня используется контроллер stm32l496, там стоит up to 1 Mbyte of Flash memory, 320 Kbyte of SRAM у меня сейчас занято меньше половины Quote Если есть возможность сменить модель памяти - поменяйте (со "small" на "large" или что там в опциях компилятора ) спасибо за ответ, пересмотрю еще раз то, что вы указали Изменено 3 апреля, 2022 пользователем xxxmatrixxx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 203 3 апреля, 2022 Опубликовано 3 апреля, 2022 · Жалоба 4 часа назад, xxxmatrixxx сказал: сразу стал проверять, посмотрел времянку осцилом, т.к. передаю данные на дисплей по FSMC, а считываю данные от тачскрина по SPI я увеличил тайминги FSMC При чём тут "тайминги"? Вам говорят, что проблема на 99% - в вашем коде. Все признаки на это указывают. Там и ищите баги. Цитата да и как-то при такой ситуации, где виноват FSMC, неясно, почему остальные символы текстовые не искажаются Кого-то обвинять нужно в 10-ю очередь. А сначала - искать баги у себя. В коде. Искать и искать. Пока не найдёте. Почему искажаются только в определённых местах? Например потому, что ваш кривой код где-то что-то портит. Портит что-то определённое, в конкретных местах. Портит какие-то рабочие переменные этой граф.библиотеки. Если бы проблема была "в таймингах", искажалось бы всё подряд. Искать можно методом исключения, отключая блоки программы. Можно вообще: минимизировать проект до отрисовки какого-то одного, проблемного элемента; добиться его стабильной работы; а потом уже добавлять другие куски кода. Тщательно отлаживая после каждого изменения кода и если возник баг - не добавлять ничего нового, пока он не найден и не исправлен. PS: Убрать все варнинги (Вы так и не ответили - есть ли они у Вас?); проверить все стеки на переполнение; убрать использование динамической памяти; задействовать MPU; написать обработчик HardFault-а и других fault-ов... 10 часов назад, k155la3 сказал: Ну, и debug, debug и еще раз debug. Делайте точки останова, смотрите что в RAM (если вдруг знакогенератор в RAM) В с умом написанной программе на таком CPU, обязательно должен использоваться MPU. Это надо было сделать ещё до притаскивания всяких стемвинов-ов и пр. стороннего кода, в котором не особо ориентируешься. И тогда не было бы никаких проблем с разрушением знакогенератора (если у ТС именно он портится). Так как они бы сразу обнаружились и исправились. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 3 апреля, 2022 Опубликовано 3 апреля, 2022 · Жалоба ну например. extern GUI_PID_STATE TS_State; unsigned char TouchScreen_ReadXY() { if(XPT2046_TouchGetCoordinates(&(ts_h.x_t), &(ts_h.y_t))){ ts_h.x = ts_h.ax*ts_h.x_t + ts_h.bx*ts_h.y_t + ts_h.dx; ts_h.y = ts_h.ay*ts_h.x_t + ts_h.by*ts_h.y_t + ts_h.dy; TS_State.x = ts_h.x; TS_State.y = ts_h.y; return 1; } return 0; } работа по (глобальному ?) указателю. Оптимизатор мог освободить эту память в модуле, где он объявлен. И на его место распределить видео-буфер работы с LCD/TFT. Отключите для отладки ВСЕ (в томчисле тачскрин), кроме работы с дисплеем. ps проверьте корреляцию работы тачскрина и наличие сбоя. Вектора прерываний тудаже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xxxmatrixxx 0 3 апреля, 2022 Опубликовано 3 апреля, 2022 · Жалоба огромное спасибо за ответы!!! пересмотрел все - и настройки дебагера, и компиляции, и выделяемая память под STEmWin, различные приемы конфиуграции, откл весь код свой, только вывод изображения - косяк остался но явно было видно, что уже дело в инициализации самого контроллера ILI9341, либо подключение драйвера полез смотреть драйверную часть, как подключал, все перепроверил, поэкспериментировал с настройками - все равно косяк остался полез смотреть инициализацию ILI9341 и когда между командами поставил задержку в 1мс, сразу все заработало без сбоев void LCD_Init(void) { #if LCD_DATA == 1 HAL_GPIO_8Bus_Init(); delay_us(100); #endif LCD_U_IM DWT_Init_for_delay_us(); //HAL_SetLedK(lcd_leds); LCD_Reset(); LCD_Wr_Cmd_8(SOFTWARE_RESET); delay_us(100); LCD_Wr_Cmd_8(POWER_CONTROL_1); delay_us(1000); LCD_Wr_Data_8(0x25); delay_us(1000); LCD_Wr_Cmd_8(POWER_CONTROL_2); delay_us(1000); LCD_Wr_Data_8(0x01); delay_us(1000); LCD_Wr_Cmd_8(VCOM_CONTROL_1); delay_us(1000); LCD_Wr_Data_8(0x2B); delay_us(1000); LCD_Wr_Data_8(0x2B); delay_us(1000); LCD_Wr_Cmd_8(VCOM_CONTROL_2); delay_us(1000); LCD_Wr_Data_8(0x06); delay_us(1000); LCD_Wr_Cmd_8(COLMOD_PIXEL_FORMAT_SET); delay_us(1000); LCD_Wr_Data_8(0x05); delay_us(1000); LCD_Wr_Cmd_8(FRAME_RATE_CONTROL_NORMAL); delay_us(1000); LCD_Wr_Data_8(0x00); delay_us(1000); LCD_Wr_Data_8(0x18); delay_us(1000); LCD_Wr_Cmd_8(DISPLAY_FUNCTION_CONTROL); delay_us(1000); LCD_Wr_Data_8(0x0A); delay_us(1000); LCD_Wr_Data_8(0x82); delay_us(1000); LCD_Wr_Data_8(0x27); delay_us(1000); LCD_Wr_Cmd_8(COLMOD_PIXEL_FORMAT_SET); delay_us(1000); LCD_Wr_Data_8(0x55); delay_us(1000); LCD_Wr_Cmd_8(SLEEP_OUT); delay_us(1000); LCD_Wr_Cmd_8(DISPLAY_ON); delay_us(1000); LCD_Orientation(DEFAULT_ORIENTATION); //LCD_Rect_Fill(0, 0, LCD_HEIGHT, LCD_WIDTH, BLUE); //delay_us(1000000); //LCD_Rect_Fill(0, 0, LCD_HEIGHT, LCD_WIDTH, RED); //delay_us(1000000); } всем спасибо, проблема решена!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 203 3 апреля, 2022 Опубликовано 3 апреля, 2022 · Жалоба 21 минуту назад, xxxmatrixxx сказал: полез смотреть инициализацию ILI9341 и когда между командами поставил задержку в 1мс, сразу все заработало без сбоев всем спасибо, проблема решена!!! Навтыкание везде задержек, без понимания зачем? и что именно происходило, это не "решение проблемы", это заметание г*вна под ковёр. Завтра опять наступите. PS: А такой быдлокод как выше - вообще нужно сразу в мусорку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 3 апреля, 2022 Опубликовано 3 апреля, 2022 · Жалоба Если проект многопоточный, то инициализация просто могла не успеть отработать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xxxmatrixxx 0 4 апреля, 2022 Опубликовано 4 апреля, 2022 · Жалоба 22 hours ago, jcxz said: Навтыкание везде задержек, без понимания зачем? и что именно происходило, это не "решение проблемы", это заметание г*вна под ковёр. Завтра опять наступите. PS: А такой быдлокод как выше - вообще нужно сразу в мусорку. я дома отлаживал, идея была в том, что какая-то команда не успевала отработать на контроллере ILI9341, какая именно не выяснял и не хотел... поставил везде задержки, это помогло, значит, мое предположение было верно а функция инициализации отрабатывает 1 раз в самом начале, приложение у меня без ОС Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 203 4 апреля, 2022 Опубликовано 4 апреля, 2022 · Жалоба 1 час назад, xxxmatrixxx сказал: я дома отлаживал, идея была в том, что какая-то команда не успевала отработать на контроллере ILI9341, какая именно не выяснял и не хотел... поставил везде задержки, это помогло, значит, мое предположение было верно Совершенно неверный вывод. Как и предположение. Или приведите выдержку из мануала ILI9341 где сказано про необходимость какой -то задержки? А перестало глючить например потому, что раньше у вас какой-то баг портил некую переменную в ОЗУ. Теперь размер кода изменился и время выполнения этого участка кода изменилось. Соответственно: если раньше что-то портилось в одном месте памяти, то теперь - портится в другом. И влияние этой порчи вы ещё не заметили. Но завтра что-то изменится в распределении памяти и опять наступите на это вещество, заметённое под ковёр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 4 апреля, 2022 Опубликовано 4 апреля, 2022 · Жалоба 1 hour ago, xxxmatrixxx said: .. поставил везде задержки, это помогло, значит, мое предположение было верно . . . Вопросы веры на форуме непопулярны. Вам достаточно провести 5-6 итераций с кодом выше чтобы найти причину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 38 4 апреля, 2022 Опубликовано 4 апреля, 2022 (изменено) · Жалоба 9 часов назад, xxxmatrixxx сказал: я дома отлаживал, идея была в том, что какая-то команда не успевала отработать на контроллере ILI9341, какая именно не выяснял и не хотел... Ну вот и зря! Вам тут советуют сделать правильную инициализацию, и посмотреть еще раз. Вот то, что у вас происходит не должно быть именно из-за инита дисплея, тут дело глубже... Конечно ваше дело, но при усложнении вашей программы может снова выплыть подобная какашка, только отлаживать уже будет труднее, ИМХО. 03.04.2022 в 10:53, jcxz сказал: с разрушением знакогенератора (если у ТС именно он портится). Там если присмотреться, еще и некоторые граф. элементы искажает тоже, но знакогенератор конечно совсем "не але" выглядит... Изменено 4 апреля, 2022 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться