Top.Mail.Ru
Уведомления
Очистить все

[Решено] ST7735 медленная отрисовка

(@kappt)
Level 1

Продолжаю мучить дисплей... Сделал тестовый проект, заливаю весь дисплей разными цветами. Все работает, но очень медленно, даже по видео на youtube видно, что такой же дисплей работает намного быстрее. Вот мой код для отправки данных и установки цвета пикселя:

void SendCommand(uint8_t data)
{
  // Низкий уровень на ножку RS
  RS_LOW();
  HAL_SPI_Transmit(&hspi1, &data, 1, 2000);
}


void SendData(uint8_t data)
{
  // Высокий уровень на ножку RS
  RS_HIGH();
  HAL_SPI_Transmit(&hspi1, &data, 1, 2000);
}

void SetPixel(uint8_t xPos, uint8_t yPos, uint16_t color)
{
  LCD_SendCommand(0x2A);
  LCD_SendData(0x00);
  LCD_SendData(xPos);

  LCD_SendCommand(0x2B);
  LCD_SendData(0x00);
  LCD_SendData(yPos);

  LCD_SendCommand(0x2C);
  LCD_SendData((color & 0xFF00) >> 8);
  LCD_SendData(color & 0x00FF);
}
Цитата
Создатель темы Размещено : 20.06.2021 22:34
Метки темы
Aveal
(@aveal)
Top level Admin
От: @kappt

Продолжаю мучить дисплей... Сделал тестовый проект, заливаю весь дисплей разными цветами. Все работает, но очень медленно, даже по видео на youtube видно, что такой же дисплей работает намного быстрее. Вот мой код для отправки данных и установки цвета пикселя:

Добрый день!

Это как раз тот случай, когда быстродействия HAL недостаточно. Надо отправку данных в SPI сделать напрямую через регистры - скорость отрисовки значительно увеличится.

ОтветитьЦитата
Размещено : 23.06.2021 01:26
tech
 tech
(@tech)
Level 3

Вот, набросал функции для работы с дисплеем на ST7735:

//--------------------------------------------------------------------------
void ST7735_SendByte(uint8_t data)
{
  while((SPI1->SR & SPI_SR_TXE) == RESET);  
  SPI1->DR = data;
}

//--------------------------------------------------------------------------
void ST7735_WaitLastData()
{
  while((SPI1->SR & SPI_SR_TXE) == RESET); 
  while((SPI1->SR & SPI_SR_BSY) != RESET);
}

//--------------------------------------------------------------------------
void ST7735_SendCommand(uint8_t data)
{
  HAL_GPIO_WritePin(RS_PORT, RS_PIN, GPIO_PIN_RESET);
  ST7735_SendByte(data);
  ST7735_WaitLastData();
}

//--------------------------------------------------------------------------
void ST7735_SendData(uint8_t data)
{
  HAL_GPIO_WritePin(RS_PORT, RS_PIN, GPIO_PIN_SET);  
  ST7735_SendByte(data);
  ST7735_WaitLastData();
}

//--------------------------------------------------------------------------
void ST7735_SendDataMultiple(uint8_t *data, int num)
{
  HAL_GPIO_WritePin(RS_PORT, RS_PIN, GPIO_PIN_SET);
  
  for (int i = 0; i < num; i++)
  {
    ST7735_SendByte(*data);
    data++;
  }
  
  ST7735_WaitLastData();
}

//--------------------------------------------------------------------------
ОтветитьЦитата
Размещено : 23.06.2021 11:29
(@kappt)
Level 1

Благодарю, вечером будет возможность проверить в деле )

ОтветитьЦитата
Создатель темы Размещено : 23.06.2021 14:42
(@kappt)
Level 1

Готов отчитаться о результатах)

Все получилось, скорость ЗНАЧИТЕЛЬНО выросла. Только такой вопрос - теперь нужно и инициализацию SPI сделать без HAL?

ОтветитьЦитата
Создатель темы Размещено : 24.06.2021 11:18
tech
 tech
(@tech)
Level 3

Да нет, незачем. HAL главное обдуманно использовать - критические участки кода, как в данном случае, по мере необходимости надо оптимизировать, переписав вручную через регистры напрямую. Без библиотечных оберток.

ОтветитьЦитата
Размещено : 24.06.2021 12:14
Aveal
(@aveal)
Top level Admin

Update: вышли статьи по работе с ST7735: ссылка_1, ссылка_2.

ОтветитьЦитата
Размещено : 02.11.2021 11:03
Поделиться: