Перейти к содержанию
    

Искажение текста при использовании STEmWin

Здравствуйте, уважаемые форумчане

Для отрисовки графики использую библиотеку 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));

 Вот картинка при нормальном включении:

image.png.66cb162f559fb845c44e95a150ff7c7b.png

image.png.1afd02eb70c7e6054f43b32fe2a2d830.png

 Вот картинка при включении, когда искажается текст:

image.png.b881f9c289eae1bc1ab92bc59831dcc9.png

image.png.0e60c6a4933a07a8088f72c6b0725a73.png

также прикладываю исходники инициализации 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();
  }

буду рад любой помощи, уже бьюсь с этой проблемой почти неделю...

спасибо, жду ответа

Изменено пользователем xxxmatrixxx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Урежьте проект только до работы GUI - STEmWin , вместо ваших прикладных программных блоков поставьте заглушки. Минимизируйте код.

В листингах компиляции и линковки внимательно почитайте все, а именно warning.

"1 раз из пяти включений" это четкая закономерность или среднее значение ?

Похоже на неправильное распределение памяти или на "накладку", когда какой-либо указатель "убежал" итд итп

Проверьте, все переменные и указатели должны быть изначально инициализированы. Возможна работа с "убитым" указателем.

Если есть возможность сменить модель памяти - поменяйте (со "small" на "large" или что там в опциях компилятора )

Покурите док на библиотеку, требования к объему памяти и настройкам компилятора-cреды

Ну, и debug, debug и еще раз debug. Делайте точки останова, смотрите что в RAM (если вдруг знакогенератор в RAM)

Надо исключить то, что сбой происходит на аппаратном уровне (элементарно из-за неисправного-сбойного LCD или невыполнения требований протокола работы с ним, тайминг-частота, таймаут итд)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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" или что там в опциях компилятора )

image.png.d0ae618b448b5235c57d7572a53a33ab.png

спасибо за ответ, пересмотрю еще раз то, что вы указали

Изменено пользователем xxxmatrixxx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, xxxmatrixxx сказал:

сразу стал проверять, посмотрел времянку осцилом, т.к. передаю данные на дисплей по FSMC, а считываю данные от тачскрина по SPI

я увеличил тайминги FSMC

При чём тут "тайминги"? Вам говорят, что проблема на 99% - в вашем коде. Все признаки на это указывают. Там и ищите баги.

Цитата

да и как-то при такой ситуации, где виноват FSMC, неясно, почему остальные символы текстовые не искажаются

Кого-то обвинять нужно в 10-ю очередь. А сначала - искать баги у себя. В коде. Искать и искать. Пока не найдёте.

Почему искажаются только в определённых местах? Например потому, что ваш кривой код где-то что-то портит. Портит что-то определённое, в конкретных местах. Портит какие-то рабочие переменные этой граф.библиотеки. Если бы проблема была "в таймингах", искажалось бы всё подряд.

Искать можно методом исключения, отключая блоки программы. Можно вообще: минимизировать проект до отрисовки какого-то одного, проблемного элемента; добиться его стабильной работы; а потом уже добавлять другие куски кода. Тщательно отлаживая после каждого изменения кода и если возник баг - не добавлять ничего нового, пока он не найден и не исправлен.

 

PS: Убрать все варнинги (Вы так и не ответили - есть ли они у Вас?); проверить все стеки на переполнение; убрать использование динамической памяти; задействовать MPU; написать обработчик HardFault-а и других fault-ов...

 

10 часов назад, k155la3 сказал:

Ну, и debug, debug и еще раз debug. Делайте точки останова, смотрите что в RAM (если вдруг знакогенератор в RAM)

В с умом написанной программе на таком CPU, обязательно должен использоваться MPU. Это надо было сделать ещё до притаскивания всяких стемвинов-ов и пр. стороннего кода, в котором не особо ориентируешься. И тогда не было бы никаких проблем с разрушением знакогенератора (если у ТС именно он портится). Так как они бы сразу обнаружились и исправились.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну например.

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 проверьте корреляцию работы тачскрина и наличие сбоя. Вектора прерываний тудаже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

огромное спасибо за ответы!!!

пересмотрел все - и настройки дебагера, и компиляции, и выделяемая память под 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);
}

всем спасибо, проблема решена!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, xxxmatrixxx сказал:

полез смотреть инициализацию  ILI9341 и когда между командами поставил задержку в 1мс, сразу все заработало без сбоев

всем спасибо, проблема решена!!!

Навтыкание везде задержек, без понимания зачем? и что именно происходило, это не "решение проблемы", это заметание г*вна под ковёр. Завтра опять наступите. :unknw:

PS: А такой быдлокод как выше - вообще нужно сразу в мусорку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если проект многопоточный, то инициализация просто могла не успеть отработать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 hours ago, jcxz said:

Навтыкание везде задержек, без понимания зачем? и что именно происходило, это не "решение проблемы", это заметание г*вна под ковёр. Завтра опять наступите. :unknw:

PS: А такой быдлокод как выше - вообще нужно сразу в мусорку.

я дома отлаживал, идея была в том, что какая-то команда не успевала отработать на контроллере ILI9341, какая именно не выяснял и не хотел... поставил везде задержки, это помогло, значит, мое предположение было верно

а функция инициализации отрабатывает 1 раз в самом начале, приложение у меня без ОС

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, xxxmatrixxx сказал:

я дома отлаживал, идея была в том, что какая-то команда не успевала отработать на контроллере ILI9341, какая именно не выяснял и не хотел... поставил везде задержки, это помогло, значит, мое предположение было верно

Совершенно неверный вывод. Как и предположение. Или приведите выдержку из мануала ILI9341 где сказано про необходимость какой -то задержки?

А перестало глючить например потому, что раньше у вас какой-то баг портил некую переменную в ОЗУ. Теперь размер кода изменился и время выполнения этого участка кода изменилось. Соответственно: если раньше что-то портилось в одном месте памяти, то теперь - портится в другом. И влияние этой порчи вы ещё не заметили. Но завтра что-то изменится в распределении памяти и опять наступите на это вещество, заметённое под ковёр.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, xxxmatrixxx said:

.. поставил везде задержки, это помогло, значит, мое предположение было верно . . .

Вопросы веры на форуме непопулярны. Вам достаточно провести 5-6 итераций с кодом выше чтобы найти причину.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, xxxmatrixxx сказал:

я дома отлаживал, идея была в том, что какая-то команда не успевала отработать на контроллере ILI9341, какая именно не выяснял и не хотел...

Ну вот и зря! Вам тут советуют сделать правильную инициализацию, и посмотреть еще раз. Вот то, что у вас происходит не должно быть именно из-за инита дисплея, тут дело глубже... Конечно ваше дело, но при усложнении вашей программы может снова выплыть подобная какашка, только отлаживать уже будет труднее, ИМХО.

03.04.2022 в 10:53, jcxz сказал:

с разрушением знакогенератора (если у ТС именно он портится).

Там если присмотреться, еще и некоторые граф. элементы искажает тоже, но знакогенератор конечно совсем "не але" выглядит...

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...