Пт мар 18, 2022 19:45:05
Пт мар 18, 2022 20:10:31
Сб мар 19, 2022 08:30:05
// HSI / 2 -> PLL = 8/2 = 4 * 16 = 64MHz [15]
// APB low speed = HCLK /2 (32MHz) [4]
RCC->CFGR = (15 << 18) | (4 << 8);
// Включаем PLL
RCC->CR |= RCC_CR_PLLON;
// Ждём готовности PLL
while (!(RCC->CR & RCC_CR_PLLRDY)) {};
// Увеличиваем латентность flash памяти до 2 циклов. Иначе будут очень интересные косяки.
FLASH->ACR = 0x12;
// Переключаемся на PLL
RCC->CFGR |= 2;
// Ждём, пока не переключимся на PLL
while ((RCC->CFGR & 0x0C) != 0x08) {};
// ГотовЕнько! Ядро тикает на частоте в 64МГц.
Сб мар 19, 2022 12:13:14
Сб мар 19, 2022 13:05:18
Сб мар 19, 2022 15:59:51
Помнится, на чипе с тактированием на 50МГц (совместимость с MII интерфейсом) экран 320*240 в 16 битной палитре заполняется... наверное, за 0.1с, либо даже быстрее.
Сб мар 19, 2022 20:50:38
// функция заливки экрана без вычислений, прямая передача данных из массива в дисплей
void TFT9488_FloodMassive(uint16_t *data, uint32_t lenght) {
uint16_t i, color;
uint8_t hi, lo;
TFT9488_CS_Active();
TFT9488_RS_Command();
TFT9488_Write8(0x2C);
TFT9488_RS_Data();
// Данные не берутся из переданных данных, то 2 строчки ниже это для отладки
lenght = 480 * 320;
color = YELLOW;
for (i = 0; i <= lenght; i++) {
// color = data[i];
hi = color >> 8;
lo = color;
//TFT9488_Port_Write(hi);
//Отправка первого бита
GPIOA->BSRR = ((GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_9) << 16)
| ((hi & 0b10000000) << 1) // 7 бит данных на 8 пин порт А
| ((hi & 0b00000100) << 8) // 2 бит данных на 10 пин порт А
| ((hi & 0b00000001) << 9); // 0 бит данных на 9 пин порт А
GPIOB->BSRR = ((GPIO_PIN_10 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_3)
<< 16) | ((hi & 0b01000000) << 4) // 6 бит данных на 10 пин порта В
| ((hi & 0b00100000) >> 1) // 5 бит данных на 4 пин порта В
| ((hi & 0b00010000) << 1) // 4 бит данных на 5 пин порта В
| (hi & 0b00001000); // 3 бит данных на 3 пин порт В
GPIOC->BSRR = (GPIO_PIN_7 << 16) | ((hi & 0b00000010) << 6); // 1 бит данных на 7 пин порта С
// СТРОБ НА порту WR
GPIOA->BSRR = GPIO_BSRR_BR1;
GPIOA->BSRR = GPIO_BSRR_BS1;
// TFT9488_Port_Write(lo);
// Отправка второго байта
GPIOA->BSRR = ((GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_9) << 16)
| ((lo & 0b10000000) << 1) // 7 бит данных на 8 пин порт А
| ((lo & 0b00000100) << 8) // 2 бит данных на 10 пин порт А
| ((lo & 0b00000001) << 9); // 0 бит данных на 9 пин порт А
GPIOB->BSRR = ((GPIO_PIN_10 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_3)
<< 16) | ((lo & 0b01000000) << 4) // 6 бит данных на 10 пин порта В
| ((lo & 0b00100000) >> 1) // 5 бит данных на 4 пин порта В
| ((lo & 0b00010000) << 1) // 4 бит данных на 5 пин порта В
| (lo & 0b00001000); // 3 бит данных на 3 пин порт В
GPIOC->BSRR = (GPIO_PIN_7 << 16) | ((lo & 0b00000010) << 6); // 1 бит данных на 7 пин порта С
// СТРОБ НА порту WR
GPIOA->BSRR = GPIO_BSRR_BR1;
GPIOA->BSRR = GPIO_BSRR_BS1;
}
TFT9488_CS_Idle();
}
Сб мар 19, 2022 21:14:18
Сб мар 19, 2022 21:57:47
VladislavS писал(а):The Rock, вы упорно игнорируете советы.
VladislavS писал(а):1. WR=0 надо делать той же командой, которой вы данные устанавливаете в порт.
GPIOA->BSRR = GPIO_BSRR_BR1;
GPIOA->BSRR = GPIO_BSRR_BS1;
VladislavS писал(а):3. Включить оптимизацию.
VladislavS писал(а):2. Маску для порта B вычислять табличным способом.
Сб мар 19, 2022 22:08:49
Я не знаю каким шрифтом уже наптсать, чтобы было понятно. Это надо сделать ТОЙ ЖЕ КОМАНДОЙ ЧТО И ЗАПИСЬ БАЙТА ДАННЫХ. У вас на каждый байт 5 записей в порт (3 на данные и 2 на строб). Можно сброс строба объединить с записью данных. Получите 4 записи в порт вместо 5 или -20%.У меня в коде написан WR=0;
Сб мар 19, 2022 22:18:36
COKPOWEHEU, видел ваше видео. Хочу такую же скорость, но увы, пока моих знаний не хватает чтобы так сделать...
Вс мар 20, 2022 12:52:11
VladislavS писал(а):3. Включить оптимизацию.
Вс мар 20, 2022 13:07:43
template <typename T, size_t SIZE>
class ENCODE_TABLE
{
T table[SIZE]{};
public:
template <typename F>
constexpr ENCODE_TABLE(F f) { size_t i{}; for(auto& x:table) x=f(i++); }
constexpr auto operator()(const size_t n) const { return table[n]; }
constexpr auto& operator[](const size_t n) const { return table[n]; }
};
constexpr ENCODE_TABLE<uint32_t,16> MaskB(
[](auto x)
{
return GPIO_BSRR_BR10
| GPIO_BSRR_BR5
| GPIO_BSRR_BR4
| GPIO_BSRR_BR3
| ((x&1)?GPIO_BSRR_BS3:0)
| ((x&2)?GPIO_BSRR_BS5:0)
| ((x&4)?GPIO_BSRR_BS4:0)
| ((x&8)?GPIO_BSRR_BS10:0);
});
Вс мар 20, 2022 19:56:55
VladislavS писал(а):4. Для теста скорости все маски вообще заранее один раз можно вычислить.
for (i = 0; i <= lenght; i++) {
// Запись первого байта
GPIOA->BSRR = 0x700 << 16 | 0x20700 ;
GPIOB->BSRR = 0x438 << 16 | 0x438;
GPIOC->BSRR = 0x80 << 16 | 0x80;
GPIOA->BSRR = GPIO_BSRR_BS1;
//Запись второго байта
GPIOA->BSRR = 0x700 << 16 | 0x20100 ;
GPIOB->BSRR = 0x438 << 16 | 0x410;
GPIOC->BSRR = 0x80 << 16 | 0x0;
GPIOA->BSRR = GPIO_BSRR_BS1;
}
#if LCD_ORIENT_V
#define LCD_MAXX 239
#define LCD_MAXY 319
Вс мар 20, 2022 20:33:11
COKPOWEHEU, я у вас в проекте увидел вот эти строчки
У вас на видео 320*240 крутится
Да. Но вы можете, например, сжать изображение. Скажем, кодировать 1 пиксель одним битом. Я так шрифт кодировал. Или использовать виртуальные пиксели по 2х2 или 3х3 реальных. Или рисовать векторную графику, то есть не по точкам, а по фигурам. Ну и естественно никто не отменял внешнюю память.Подскажите пожалуйста ещё, правильно ли я считаю. Что целый кадр не влезет в моих 128Кб памяти процессора ? Так как мой кадр весит аж 320 * 480 * 2 (байта) = 307 кБайт?
Думаю, нет. У вас во время обновления экрана контроллер только обновляет экран. Но вы, наверное, могли бы использовать DMA чтобы во время обновления экрана он делал что-то полезное - считал следующий кадр, например. Сама по себе скорость вывода от этого упадет, но в целом частота обновления увеличится.Можно ли сказать, что то что я получил на дисплее это максимальный результат обновления доступный в моей конфигурации когда дисплей подключен на 3х портах ?
Вс мар 20, 2022 20:43:57
Нет, мой вопрос связан с тем, что у вас все очень быстро обновляется. Но если там 320*240, то у меня экран 320*480 и у меня будет обновлять подольше чем ваш по SPI... и такой красоты я не получу.The Rock писал(а):Если же вопрос в том почему цифры на 1 меньше
Понял, спасибо. А я то думал почему у меня МК рушится когда я создавал массив на полный кадр)The Rock писал(а):Да. Но вы можете, например, сжать изображение.
Просто если у меня уже максимальный теоретический , то я бы относительно этой максималки сделал бы основную функцию вывода цвета. И пошел бы уже дальше узнавать новое и пилить свой проект )The Rock писал(а):Думаю, нет. У вас во время обновления экрана контроллер только обновляет экран.
Вс мар 20, 2022 21:38:14
Вс мар 20, 2022 21:39:29
Вс мар 20, 2022 21:49:40
Вс мар 20, 2022 22:02:19
Да нет, запас по скорости там есть. Я намерил что-то около 11 кадров в секунду (там ведь еще математика), у вас площадь экрана ровно вдвое больше, значит 5 кадров в секунду получить можно. А теоретический предел 15 кадров в секунду. Для такого дисплея вполне приемлемо. Он ведь и сам не слишком быстрый.у меня экран 320*480 и у меня будет обновлять подольше чем ваш по SPI... и такой красоты я не получу.
Оптимизация -О3 , по гуглу искал и примерно в том месте где должен быть выбор или вбивания этого параметра у меня отсутствует возможность редактирования (