Продолжаю мучить дисплей... Сделал тестовый проект, заливаю весь дисплей разными цветами. Все работает, но очень медленно, даже по видео на 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); }
Продолжаю мучить дисплей... Сделал тестовый проект, заливаю весь дисплей разными цветами. Все работает, но очень медленно, даже по видео на youtube видно, что такой же дисплей работает намного быстрее. Вот мой код для отправки данных и установки цвета пикселя:
Добрый день!
Это как раз тот случай, когда быстродействия HAL недостаточно. Надо отправку данных в SPI сделать напрямую через регистры - скорость отрисовки значительно увеличится.
Вот, набросал функции для работы с дисплеем на 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(); } //--------------------------------------------------------------------------
Благодарю, вечером будет возможность проверить в деле )
Готов отчитаться о результатах)
Все получилось, скорость ЗНАЧИТЕЛЬНО выросла. Только такой вопрос - теперь нужно и инициализацию SPI сделать без HAL?
Да нет, незачем. HAL главное обдуманно использовать - критические участки кода, как в данном случае, по мере необходимости надо оптимизировать, переписав вручную через регистры напрямую. Без библиотечных оберток.