STM32F429 SRAM + EXT SRAM + TFT 16BIT с DMA

Diger67
Пн 16 января 2017 г. 1:59
Добрый день. Я пытаюсь реализовать идею удаления информации на экране TFT, предварительно записанной во внешней памяти, а затем пишу ее в TFT, используя DMA. Вот что случилось.

https: // youtu.be/2yn_j_dloy4
https: // youtu.be/wymzsf-hkl0
https: // youtu.be/onpp7y9hbw4
https: // youtu.be/nulbxs08cjs
https: // youtu.be/g_qix3edddc
https: // youtu.be/oycxaozcjm4

Diger67
Чт 19 января 2017 г. 8:37 утра
Это решение позволяет подготовить копию области отображения во внешней памяти и отображать один дамп. Это также позволяет вам реализовать функцию виртуальных слоев. С достаточной внешней памятью может хранить несколько предварительно сформированных скриншотов экрана и распечатать их по требованию.

Стивестронг
Чт 19 января 2017 г., 19:53
Не просмотрев видео, можно было бы описать, какой тип TFT вы используете? SPI или параллель?

Diger67
Чт 19 января 2017 г. 11:43
Используется TFT, подключенный в параллельной 16-битной шине. Вероятно, можно SPI и использовать. Я не задумывался о этом вопросе.

Стивестронг
Пт 20 января 2017 г. 9:19
Таким образом, вы фактически используете 16 -битную шину для данных и еще 8 бит для контрольных сигналов, верно? Я думаю, тебе нужно два разных DMA для этого.

Как синхронизировать два DMA? Вызвано тем же счетчиком?

Rogerclark
Пт 20 января 2017 г. 9:57 утра
Стивестронг написал:Таким образом, вы фактически используете 16 -битную шину для данных и еще 8 бит для контрольных сигналов, верно? Я думаю, тебе нужно два разных DMA для этого.

Как синхронизировать два DMA? Вызвано тем же счетчиком?

Пито
Пт 20 января 2017 г. 11:51
Тф -дисплей с 16 -битными данными должен быть подключен через FSMC. FSMC - это интерфейс для 16 -битного TFT..
И это будет отображена память. Тогда вы можете использовать DMA.
Где -то есть примеры, afaik.
Поиск "STM32 FSMC TFT -дисплей" в Интернете..

Diger67
Пт 20 января 2017 г., 19:05
Стивестронг написал:Таким образом, вы фактически используете 16 -битную шину для данных и еще 8 бит для контрольных сигналов, верно? Я думаю, тебе нужно два разных DMA для этого.

Как синхронизировать два DMA? Вызвано тем же счетчиком?

Diger67
Вт 24 января 2017 г. 14:17
Замена внешней памяти дала результат. Изображение выводится стабильно без искажений. STM32F446, будет подключен к 25QXXX на QSPI и перенесен на все массивы константов. Следующий шаг в переходном STM32F746.

Стивестронг
Вт 24 января 2017 г. 16:21
Я думаю, что это установка (взятая из реализации диска QVGA TFT-LCD STM32, AN3241, глава 2): QVGA TFT-LCD signal interfacing with STM32F10xx FSMC The TFT-LCD synchronization signals VSYNC and HSYNC are managed through STM32 GPIOs. The FSMC memory interface Write-enable signal is used in inverted configuration as a DCLK (pixel clock) for the TFT, and the FSMC chip-select signal acts as a TFT-enable signal. When data is transferred to the FSMC bus, the chip-select is first asserted low to enable the TFT-LCD. Then the write-enable signal is asserted low to allow 16-bit data transfer to the TFT RGB line on its low level which results in a single pixel display: ■ TFT-Enable: FSMC chip select (pin PG12) ■ VSYNC: GPIO - pin PA8 ■ HSYNC: GPIO - pin PC6 ■ DCLK: FSMC WE in inverted mode - pin PD5 ■ Data Bus: FSMC[D0:D15] ■ SPI1: used for LCD configuration

Diger67
Вторник 24 января 2017 г. 9:51 вечера
В этом документе вы, эмуляция, описывает пример LTDC. Я решаю проблему использования контроллера TFT. Кроме того, все, что я делаю, верно для приведенного выше примера.

Diger67
Пн 30 января 2017 г. 14:44
Проект продолжает развиваться на основе STM32F429. Написание функции для отображения спрайта на любом фоне (виртуальный слой). Теперь, чтобы иметь дело с QSPI и записать его с помощью информации Stlink. После этого я буду носить его на STM32F446. Он также напишет функцию для работы с 29 серии NO NO для хранения спрайтов и генератора символов STM32F429.

https: // youtu.be/8xuip0jbnwq

Diger67
Сб 04 февраля 2017 г. 3:24
Проблема с сбоями при выводе изображения удаляется. Это был плохой контакт с контактом RD Contact. Но это привело к положительному результату, код был оптимизирован, чтобы эти сбои мало влияли на программу.

Diger67
Пн, 13 февраля 2017 г. 20:46
Игнорировать TFT и рассмотреть возможность работы с XPT2046.

https: // youtu.be/oanado2nucq

Diger67
Солнце 26 февраля 2017 г., 19:22
Продолжение работы, мы подключаем весь материал в один проект. Начните с маленькой, очень простой кнопки.

https: // vk.com/прочь.PHP?to = https%3a%2f% ... 656325_526

Рекснанет
Пн 27 февраля 2017 г. 10:17
Если бы вы могли поговорить на английском языке на видео, это было бы здорово :)
Русский не моя специальность ;)
Но спасибо за обмен!

Стивестронг
Пн 27 февраля 2017 г. 10:32
Рекснанет написал:Если бы вы могли поговорить на английском языке на видео, это было бы здорово :)
Русский не моя специальность ;)
Но спасибо за обмен!

Diger67
Вт
Создать три новых интерактивных элемента. Текстовое поле, флажок, текст. И их работа с сенсорным экраном.
https: // youtu.be/u4ci-gbdwqm

Стивестронг
Вт
К сожалению, это не ценность для неруссийского говорящего сообщества...

Diger67
Пт 10 марта 2017 г. 13:30
Стивестронг написал:К сожалению, это не ценность для неруссийского говорящего сообщества...

Diger67
Солнце 12 марта 2017 г. 10:25
Проблема со стабилизацией чтения чтения при прикосновении к сенсорному экрану была решена. Ниже вы можете увидеть, как это сделано. void Sort (uint16_t *mas) { uint8_t i,j; uint16_t k; for(i=1;i<10;i++) for(j=0;j<9;j++) if(mas[i]>mas[j]) { k=mas[i]; mas[i]=mas[j]; mas[j]=k; } } //------------------------------------------------------------------------------- bool IsTouch(void) { if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == RESET) return true; return false; } //------------------------------------------------------------------------------- bool Get_Touch_xy(__IO uint16_t *x_kor, __IO uint16_t *y_kor) { __IO uint16_t touch_x = 0; __IO uint16_t touch_y = 0; uint16_t touch_X[10]={0}, touch_Y[10]={0}, touch_avg; uint8_t i, flag; flag = IsTouch(); //press = IsTouch_XY(); if(flag) //Есть касание //There is a touch { for(i=0;i<10;i++) //Считываем десять измерений x и y в точке касания //Read ten dimensions x and y at the point of tangency { touch_X[i] = Get_Touch(chx); touch_Y[i] = Get_Touch(chy); } Sort(touch_X); //Сортируем измерения по нарастающей //We sort the measurements by increasing Sort(touch_Y); touch_avg=0; //Расчитываем среднее арифметическое измерений отбросив два наименьших и два наибольших for(i=2;i<6;i++) //We calculate the average of the arithmetic measurements by discarding the two smallest and two largest touch_avg+=touch_X[i]; touch_x=touch_avg/4; touch_avg=0; for(i=2;i<6;i++) touch_avg+=touch_Y[i]; touch_y=touch_avg/4; touch_x -= Xmin; touch_x = 240 - touch_x/((Xmax-Xmin)/240); touch_y -= Ymin; touch_y = 320 - touch_y/((Ymax-Ymin)/320); if(touch_x > 240) touch_x = 240; if(touch_y > 320) touch_y = 320; init_XPT2046(); // *x_kor = touch_x; // *y_kor = touch_y; *y_kor = touch_x; *x_kor = touch_y; } return flag; }

Diger67
Вт 14 марта 2017 г. 14:40
В этом видео мы посмотрим на создание элемента слайдера и его работы на практике. Также рассмотрим изменения, внесенные в функцию чтения координат, которые увеличивают стабильность значения чтения. Ну и на небольшом бонусе мы рассмотрим функции для работы с аппаратным сдвигом изображения, используя возможности контроллера ILI9341.

https: // youtu.be/cgogelfqeys

Diger67
Солнце 19 марта 2017 г. 6:45
Подключил независимую от энергии память 24C16, теперь вы можете сохранить значения и переменные калибровки, не опасаясь сбоя энергии. Ну, вот простая калибровка сенсорного экрана. Точность 2-4 пикселя. Мне было достаточно.
void touchSetCoef(int16_t _ax, int16_t _bx, int16_t _ay, int16_t _by, bool colibrate) { I2CBuff[0] = _ax>>8; //hight byte I2CBuff[1] = _ax; //low byte I2CBuff[2] = _bx>>8; I2CBuff[3] = _bx; I2CBuff[4] = _ay>>8; I2CBuff[5] = _ay; I2CBuff[6] = _by>>8; I2CBuff[7] = _by; I2CBuff[8] = colibrate; I2cWriteBuffer(hi2c1, EEPROM_HW_ADDRESS, 0, 8); } //------------------------------------------------------------------------------ void touchGetCoef(int16_t *_ax, int16_t *_bx, int16_t *_ay, int16_t *_by) { I2cReadBuffer(hi2c1, EEPROM_HW_ADDRESS, 0, 8); *_ax = I2CBuff[0]<<8; //hight byte *_ax |= I2CBuff[1]; //low byte *_bx = I2CBuff[2]<<8; *_bx |= I2CBuff[3]; *_ay = I2CBuff[4]<<8; *_ay |= I2CBuff[5]; *_by = I2CBuff[6]<<8; *_by |= I2CBuff[7]; } //------------------------------------------------------------------------------ void TouchColibrate(void) { uint16_t x, y; static Text_TypeDef text0; static Text_TypeDef text1; // if(!ReadStatusCalibrate()) // return; init_text(&text0, 50, 100, BLACK, CYAN, 2, 2, MANUAL); init_text(&text1, 50, 120, BLACK, CYAN, 2, 2, MANUAL); sprintf(text0.text1, "%s", "Калибровка"); ram_bg_to_screen(SCREEN_BASE_ADDR_1); tft_text(&text0, &text0.textvar); drawLine (10, 10+25, 10+50, 10+25, BLACK); drawLine (10+25, 10, 10+25, 10+50, BLACK); DrawCircle(35, 35, 4, BLACK); SetCursor(50, 120); sprintf(text1.text1, "%s", "Нажимайте "); tft_text(&text1, &text1.textvar); tft(); while (1) { // ждать нажатия while (!IsTouch()); Get_Touch_xy (&x, &y, false); if (x < 4090 && y < 4090) { xPos[0] = x; yPos[0] = y; break; } // if } // while sprintf(text1.text1, "%s", "Отпускайте"); tft_text(&text1, &text1.textvar); tft(); while (IsTouch()); ram_bg_to_screen(SCREEN_BASE_ADDR_1); tft_text(&text0, &text0.textvar); drawLine (LCD_PIXEL_WIDTH-10-50, 10+25, LCD_PIXEL_WIDTH-10-50+50, 10+25, BLACK); drawLine (LCD_PIXEL_WIDTH-10-25, 10, LCD_PIXEL_WIDTH-10-25, 10+50, BLACK); DrawCircle(285, 35, 4, BLACK); sprintf(text1.text1, "%s", "Нажимайте "); tft_text(&text1, &text1.textvar); tft(); while (1) { // ждать нажатия while (!IsTouch()); Get_Touch_xy (&x, &y, false); if (x < 4090 && y < 4090) { xPos[1] = x; yPos[1] = y; break; } // if } // while sprintf(text1.text1, "%s", "Отпускайте"); tft_text(&text1, &text1.textvar); tft(); while (IsTouch()); ram_bg_to_screen(SCREEN_BASE_ADDR_1); tft_text(&text0, &text0.textvar); drawLine (10, LCD_PIXEL_HEIGHT-10-25, 10+50, LCD_PIXEL_HEIGHT-10-25, BLACK); // hor drawLine (10+25, LCD_PIXEL_HEIGHT-10-50, 10+25, LCD_PIXEL_HEIGHT-10-50+50, BLACK); // vert DrawCircle(35, 205, 4, BLACK); sprintf(text1.text1, "%s", "Нажимайте "); tft_text(&text1, &text1.textvar); tft(); while (1) { // ждать нажатия while (!IsTouch()); Get_Touch_xy (&x, &y, false); if (x < 4090 && y < 4090) { xPos[2] = x; yPos[2] = y; break; } // if } // while sprintf(text1.text1, "%s", "Отпускайте"); tft_text(&text1, &text1.textvar); tft(); while (IsTouch()); ram_bg_to_screen(SCREEN_BASE_ADDR_1); tft_text(&text0, &text0.textvar); drawLine (LCD_PIXEL_WIDTH-10-50, LCD_PIXEL_HEIGHT-10-25, LCD_PIXEL_WIDTH-10-50+50, LCD_PIXEL_HEIGHT-10-25, BLACK); // hor drawLine (LCD_PIXEL_WIDTH-10-25, LCD_PIXEL_HEIGHT-10-50, LCD_PIXEL_WIDTH-10-25, LCD_PIXEL_HEIGHT-10-50+50, BLACK); // vert DrawCircle(285, 205, 4, BLACK); sprintf(text1.text1, "%s", "Нажимайте "); tft_text(&text1, &text1.textvar); tft(); while (1) { // ждать нажатия while (!IsTouch()); Get_Touch_xy (&x, &y, false); if (x < 4090 && y < 4090) { xPos[3] = x; yPos[3] = y; break; } // if } // while sprintf(text1.text1, "%s", "Отпускайте"); tft_text(&text1, &text1.textvar); tft(); while (IsTouch()); sprintf(text1.text1, "%s", " "); tft_text(&text1, &text1.textvar); tft(); // Расчёт коэффициентов if(xPos[0]>xPos[3]) { swap(xPos[0],xPos[3]); } axc[0] = (xPos[3] - xPos[0])/(xCenter[3] - xCenter[0]); bxc[0] = xCenter[0] - xPos[0]/axc[0]; if(yPos[0]>yPos[3]) { swap(yPos[0],yPos[3]); } ayc[0] = (yPos[3] - yPos[0])/(yCenter[3] - yCenter[0]); byc[0] = yCenter[0] - yPos[0]/ayc[0]; touchSetCoef (axc[0], bxc[0], ayc[0], byc[0], true); ram_bg_to_screen(SCREEN_BASE_ADDR_1); text0.y0 = 110; text0.text_poz = CENTER; touchGetCoef(&ax, &bx, &ay, &by); sprintf(text0.text1, "%s", "Калибровка завершена"); tft_text(&text0, &text0.textvar); tft(); HAL_Delay(2000); }

Diger67
Солнце 19 марта 2017 г., 17:05
Работа с сенсорным экраном может считаться полной, может быть оптимизация. Теперь, когда вы впервые включаетесь после загрузки прошивки, система немедленно входит в режим калибровки. Затем записывает все данные и флаг «калибровка, сделаны в его eEprom. Осталось обеспечить принудительный переход к этому режиму в параметрах настроек. И этот вариант работы кода раздела был сделан.

Diger67
Солнце 26 марта 2017 г. 16:18
Калибровка сенсорного экрана и сохранения данных в его EEPROM 24L16

https: // youtu.be/5kthe-pgfuq

Детектор металла DC42 улучшение

Бинарные часы