Ну я просто предположил ) Может там как раз наоборот, грамотно сделано.
Доброго )
Пока для своего проекта (цифровая рация) ещё жду детали, надо будет подсоединить просто микрофон и динамик для начала. Затем освоить передачу и приём, а затем уже подключать сжатие пакетов. Пока есть чем заняться )
Чем больше пытаюсь разобраться тем больше вопросов...
Пока смотрю информацию. Не могу понять, куда правильно подключать библиотеки. Например - "Первое, что нужно сделать, скопировать папку STM32F10x_Speex_Lib с библиотекой Speex в папку Drivers проекта". Почему именно в папку проекта (это из примера). Обычно же подключают в папку - "Core"?
Или же это делается из-за "уровня" приоритета работы библиотеки... Как правильно выбрать место для подключения папки с библиотеками (в сложных примерах целые папки библиотек и чего с ними делать даже примерно не понимаю).
Или же это всё делается конкретно в каждом случае ? (или я всё не так понимаю)
Доброго дня )
Библиотека в данном случае - это просто набор файлов. То есть положить их можно абсолютно куда угодно, главное сообщить компилятору и линкеру пути, по которым эти библиотеки следует искать. Вот как вариант, здесь у меня в папке Modules:
Здравствуйте !
Новый вопрос, пытаюсь переделать готовую библиотеку для работы с tft (spi) экранчиком. контроллер st7789. Библиотека работает с разрешением 240х240. Мне надо 240х320, пока есть экран 240х280. Он работает в режиме 240х260.
Сейчас пробую освоить Н7 контроллер, оперативки много. Переменные в библиотеке поменял ,как мне кажется, буфер есть под 240х280, а вот его вывести как не понимаю ? Вывожу через DMA, а он размером 16 байт. Примеры есть готовые - выводят частями с отслеживанием по TX колбэк функции.
Как не пытаюсь сделать отправку частями, он у меня каждую часть по экрану распихивает в в разных порядках (то слева один кусок то справа, то с низу). И каждый кусок (выведенный на экран) один и тот же (дублируется) и размером именно тем которым я его отправляю.
То есть он должен сшивать эти части, а не распихивать один и тот же...
Как сделать адресацию каждого нового куска в DMA не пойму ?
Использование DMA с дисплеем абсолютно бесполезное занятие.
Его возможно использовать только в двух случаях
- заливка одним цветом
- вывод картинки.
Что бы выводить картинку нужно очень хорошо понимать, как работает дисплей.
Я с DMA особо не работал, но у серии H7 регистр адреса DMA 32 разряда. Этого достаточно, что бы выводить картинку, на данном контроллере, целиком, а не частями.
Если хочется кусками, делается просто.
У TFT дисплеев для вывода информации используется следующий метод:
- Устанавливаем координаты окна вывода;
- Считаем сколько пикселей в это окно помещается:
- Начинаем передавать столько 16 разрядных данных, сколько пикселей умещается в окне. (Вот здесь и можно использовать DMA).
Допустим у нас 320х240 пикселей экран. Разбиваем его по ВЕРТИКАЛИ на 5 частей.
Получаем 5 кусков экрана 320х48 пикселей.
Выставляем окно вывода с координатами X=0, Y=0 - левый верхний угол, X=319, Y=47 - правый нижний угол и выводим 15360 точек.
Затем выставляем координаты X=0, Y=48 - левый верхний угол, X=319, Y=95 (48+48-1 так как адресация с 0). и опять выводим следующие 15350 точек.
И так, пока не выведем всё изображение.
Если что, я очень много драйверов для разных дисплеев написал. Как это делается знаю на 80%. Остальные 20% - это дисплеи с несколькими слоями отображения. Но они мало используются и дорогие, поэтому на них мало кто клюёт.
"но у серии H7 регистр адреса DMA 32 разряда" - чего то я это упустил (был уверен, что 16 разрядов)
Хочу этот маленький дисплей запустить по spi шине, может и без DMA. Просто готовый пример с DMA, потихоньку разбираюсь что и как...
Эдуард спасибо, буду разбираться )
Это DMA2D, но она для параллельного интерфейса (вроде как)
DMA может работать с любым устройством, в том числе и SPI
Вот здесь есть библиотеки, правда они на классах. Может чем то поможет https://disk.yandex.ru/d/ymB60PAjT5rjTw
MTWorkDevel->STM32Lib->Library
Не понимаю как взять часть буфера и отправить одной частью, затем указать адрес на новый кусок ?
void SPI_send_dma(SPI_TypeDef *SPIx, uint8_t word16bit, uint8_t *pBuff, uint32_t Len, void (*func)(void)) { //if (SPIx == hspi.Instance) //{ //dma_spi_cnt = 2; Len = 62400; // 62400 HAL_SPI_Transmit_DMA(&hspi2, pBuff, Len); } //А сам буфер: void GC9A01A_RamWrite(uint16_t *pBuff, uint32_t Len) { while (Len--) { SendData(*pBuff >> 8); // отправляем старший байт (rgb 565 - 16 bit) SendData(*pBuff & 0xFF); // отправляем младший байт } }
Изображение уже сгенерировано и лежит в буфере, а как его от туда вытащить не знаю ?
Библиотеки скачал, спасибо. Разбираться буду конечно
В функции RamWrite забыли задать окно вывода и где функция SendData?
Я так понимаю, что она должна отсылать только один байт, а Вам нужно отослать дамп памяти через DMA
Изначально нужно настроить DMA на передачу определённого количества байт
Затем передать команду записи в RAM и передать координаты окна. Затем уже используя DMA передать буфер.
И по обрывкам кода сложно понять что Вы делаете.
Эдуард, могу прислать весь пакет (в codeide) ?
Или куски не достающие ..
У меня программка из интернета готовая была, она похоже не один раз переделывалась "под себя"
У меня нет Кокоса. Его уже не поддерживают. Переходите на CubeIDE
А код глянуть можно. Но быстро не обещаю.
Как назначить смещение адреса новой части буфера изображения не понимаю.
Как в этой программе работает функция окончания передачи части буфера - тоже не понимаю. Колбэк функция срабатывает, пробовал делить буфер на 4 части и передавать их - на экранчике эти буферы размазывает по сторонам экрана..