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

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

Kappt
(@kappt)
Active Member

Продолжаю мучить дисплей... Сделал тестовый проект, заливаю весь дисплей разными цветами. Все работает, но очень медленно, даже по видео на 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);
}
Цитата
Topic starter Размещено : 20.06.2021 22:34
Тэги темы
Aveal
(@aveal)
Illustrious Member Admin
От: @kappt

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

Добрый день!

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

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

Вот, набросал функции для работы с дисплеем на 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
(@kappt)
Active Member

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

ОтветитьЦитата
Topic starter Размещено : 23.06.2021 14:42
Kappt
(@kappt)
Active Member

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

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

ОтветитьЦитата
Topic starter Размещено : 24.06.2021 11:18
tech
 tech
(@tech)
Trusted Member

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

ОтветитьЦитата
Размещено : 24.06.2021 12:14
Поделиться: