Графический дисплей на контроллере ST7920. Подключаем к Stm32. Практикуемся с шиной SPI.
HTML-код
- Опубликовано: 14 июл 2024
- Микросхема контроллера/драйвера ЖК-дисплея ST7920 может работать как в символьном, так и в графическом режимах.
Поддерживает 3 вида интерфейса, а именно 8/4-битный и последовательный(spi). В видео рассмотрена библиотека для работы с данным графическим дисплеем по шине spi.
Это первый мой опыт с графическими дисплеями, поэтому особо крутых функций с летающим текстом и прочим понаписать не смог(да и зачем оно?). Для инженерных задач данного функционала хватит с головой). В будущем библиотека будет дополняться.
Заходи в нашу группу ВК solderingiron.stm32
Материалы из практического занятия: github.com/Solderingironspb/L...
ЯндексДзен: zen.yandex.ru/id/622208eed2eb...
00:00 О дисплее.
00:54 Распиновка дисплея
02:02 Важно.
02:58 Создание проекта. Настройка МК.
05:17 Скорость обновления дисплея. МК: STM32F103C8T6
05:32 Работаем с кодом. - Наука
Воевал с этим экраном раза 4, все эти 4 раза бросал так как он выводил чушь и бесил меня, перепробовал несколько библиотек, пересмотрел кучу видео, и Вы первый кто упомянул об обратной полярности SPI...огромный вам поклон...меняем 2 параметра и всё работает
Очень ценное видео, я неделю только светодиод первый раз подключал) для меня бесценна данная информация как сокровище.
НЕ ЗАПУСКАЕТСЯ ЭКРАН ? У меня экран запускался через раз при перезагрузке. Оказалось дело в некачественных проводах от программатора к STM 32 (обычные китайские в комплекте с программатором шли). Падение напряжения в проводах составляло 0,3-0,5в. Это при том что экран питается отдельно от БП. Если у вас тупит экран стоит измерить напряжение на МК. Буду рад если кому-то поможет этот комментарий. Видео просто супер, автор красавчик. Если бы таких людей было больше мир стал бы намного лучше.
Отличное видео !!! Приятно видеть, что есть люди, не поддающиеся общей современной деградации общества !!!
Супер! Необычайно полезное видео! Думаю, с таким контентом, подписчиков прибавится!
Реально круто! Поставил бы вагон лайков за такие труды.
Очень благодарю Вам. Я фен Ваший канал. Поздравляю!
Большое СПАСИБО !!! То, что доктор прописал.
Вот и у меня лежит уже десять лет такой дисплей, зайду в ВК.
Спасибо за труд!!
Просто и понятно. Спасибо!!!
Спасибо! Полезно.
Спасибо за библиотеку, для мене лентяя - самое то)
Здравствуйте, спасибо огромное за урок и библиотеку!!!
Пробовал отправлять данные по spi с помощошью cmsis, в надежде уменьшения времени обновления буфера(на дисплее с контроллером ili9341 прокатило ), картинка начала рассыпаться на высоких скоростях, начал уменьшать частоту spi, пришёл к такому же времени обновления, что и с библиотекой hal
Здравствуйте) да...именно так...я написал еще библиотеку для него в 8мибитном режиме по параллельной шине. Тоже скорости думал достигну большей. Но фиг там...не быстрее 74мс на обновление дисплея, иначе все ломается...увы.... хочу потом еще попробовать дисплей ks0108. Может там лучше ситуация будет)
@@Solderingironspb Вообщем, после недели ковыряния разных библиотек для этого экрана и раскуривания документации, получилось достичь времени обновления около 40мс через IT функцию, при попытке увеличить скорость картинка рассыпается. Был немного переделал алгоритм записи видеобуфера(подсмотрел как сделано в других библиотеках))) ), соответственно немного видоизменились функции отрисовки своих символов и картинок. Огромное спасибо вам за предоставленные исходники!
Вот выкладываю свой проект для кейла, возможно тут присутствует туева хуча косяков, но все же...
drive.google.com/file/d/1t7ghabHPRMMjBAEmeyLKF5MQ7uiUpL5S/view?usp=sharing
может кому будет интересно
@@ssorokin481 , файл не обнаружен...
:-(
круто Спасибо за F4
Если на F4 не будет заводиться, попробуйте следующее, по крайней мере у меня на F411 заработало только так...почему так...я не знаю...
Визуально скорость обновления экрана такая же. По логическому анализатору еще не проверял.
Настройки:
Частота МК 100 Мгц
В настройках spi:
Prescaler = 128
Скорость получится 781.25 KBits/s
Остальные настройки, как в видео...
И в библиотеке, в файле ST7920_lib.c замените функции отправки данных и команды на следующие:
/*----------------------Функция отправки команды на дисплей------------------------*/
static void ST7920_Send_command(uint8_t Data) {
/// Функция отправки команды на дисплей
/// \param Data - 8 бит данных. DB0 - DB7.
cs_set();
uint8_t tx_buffer[3] = { 0, };
tx_buffer[0] = 0xF8; //Отправка команды. RW = 0/RS = 0
tx_buffer[1] = Data & 0xF0; //Разбиваем 8 бит на 2 части. Передаем 7-4 бит.
tx_buffer[2] = (Data
Спасибо, познавательно! Парни поясните, как он без подсветки? Т.е. можно ли подобным экраном пользоваться без подсветки?
ну так...не совсем удобно будет. Я ставлю в них резистор. С резистором делаю минимальную яркость и норм. Кстати, я обновил библиотеку. Гляньте видео "Дисплеи ST7920 и GMG12864(ST7565r). Обновление графических библиотек. Режим плоттера."
Можно, но если вам хватит освещения для того чтобы видеть пиксели, то ради бога )
Доброго! Интересное видео! Мой лайк 35.Вопрос от новичка .Пид регулятор тип переменных float , как выводить данные для отладки из прерывания и отображать в виде графика для настройки пид.По Вашему видео переделал свисток для swo и в keil5 пытался переменные из прерывания смотреть в system analyzer , данные идут с сильным запаздыванием(закрываю и открываю окно анализатора).Cubeide не ставиться система 32 бита.Какой программатор нужен для удобной отладки?
Добрый вечер) новички ПИД регуляторы не настраивают, не принижайте себя) swo очень запаздывает. Он точно не для скоростного вывода информации. Программаторы все делают одно и тоже, что китайский, что оригинальный. Возможно я скажу глупость, но...не пробовали по uart кидать данные в порт и уже на компьютере использовать какой-нибудь плоттер?) будет куда быстрей и удобней, чем swo. Ну а с пид регулятором работать через таймер, а не HAL_GetTick(), чтоб тайминги точные были.
Спасибо , попробую .Полезный у вас канал!
Олег, добрый вечер! Использую Вашу библиотеку с ST7565R. Вопрос такой - могу ли я прикрутить другой массив со шрифтами ( естественно, символы другой высоты и ширины). Для этого необходимо дописать функцию, аналогичную в библиотеке, только указав другие размеры?
добрый вечер! все верно) Только советую если переделывать, то следующую версию библиотеки. ruclips.net/video/ajEqZN5s5xc/видео.html
@@Solderingironspb Добрый вечер! Попробовал скопировать функцию для другого шрифта. Шрифт размером больше. Там даже не весь набор, а цифры и два-три символа. Размер 12х16. Изменял следующее: uint8_t x_stop = x + 12; //конечное положение по x с учетом межсимвольного интервала, for (i = 0; i
Помоги пожалуйста подключить по i2C его через переходник о роботдин???
Не подскажете, а у CBG128064A000-BIW-R я так понял только параллельный интерфейс или я ошибаюсь?
Вообще то в дисплее можно менять заполнение. Слева направо, или снизу вверх.
Нужно читать даташит
Отлично. Какое название у сообщества?
vk.com/solderingiron.stm32
Подскажите, не совсем понимаю:
1. вы дма включили вместе с прерываниями - зачем?
2. Функция ST7920_UPDATE() в фоне работает или забирает ресурсы у основного цикла?
3. Для чего нужны прерывания для SPI, если только отправка идет?
Доброе утро!
1 и 3. Смотрите, я создал две функции, одна для отправки команды, другая для отправки данных:
static void ST7920_Send_command(uint8_t Data)
static void ST7920_Send_data(uint8_t Data)
Их я могу вызывать 3-мя способами:
* Первый - это блокирующая функция. Мы отправляем байт данных. Ждем...Ждет вообще весь основной цикл в это время....Пришел флаг, что данные отправились, отправляем второй байт данных....опять ждем....и т.д.
* Второй - это IT функция. Мы отправляем байт данных, создав при этот прерывание, потопали дальше работать, не заставляя основной цикл ждать. Т.к. мы отправляем по байту, то нам даже не пришлось проверять занятость шины и нога CS успевает опуститься уже тогда, когда все 3 байта данных отправились.
* Третий способ - это DMA. Он, как и второй способ, но суть заключается в том, чтобы по команде от периферии или ядра взять и скопировать кусок памяти с одного места на другой. По идее - это самая быстрая функция. Она тоже создает прерывание....НО....
Я привел временные данные по скорости передачи данных. ( см. время 05:16).
Если же разница в скорости между IT и блокирующей функцией еще понятна, то почему DMA такая медленная? я думаю дело как раз в том, что мы не отправляем через DMA большие потоки данных, для которых оно и предназначено, а вызываем ее для отправки каждый раз, когда нужно отправить байт...
2. Вопрос хороший и важный.
Функция обновления экрана void ST7920_Update(void) - это считай и есть функция отправки изображения на экран. Т.е. мы сформировали буфер кадра (а это 1024 элемента). И потом пуляем это все на дисплей. Функция тяжелая. При использовании IT занимает 76.544ms у основного цикла. От этого никуда не деться.
Для примера: создайте в основном цикле функцию мигания светодиода, которая будет его включать/выключать каждые 30 мс. А обновление дисплея каждые 300 мс.
Вы увидите, как работа диода будет приостанавливаться.
Что же делать в данном случае? Работать с таймерами: например, выберем таймер TIM1:
Работаете, допустим с МК на частоте 72 Мгц:
Clock Source - Internal Clock
В параметрах Prescaler указываете 719.
Counter Period указываете 3000.
В NVIC разрешаете прерывание по TIM1 update interrupt.
далее заходим в файл stm32f1xx_it.c
и ищем хэндлер: void TIM1_UP_IRQHandler(void)
пишем в него код, например:
void TIM1_UP_IRQHandler(void) {
/* USER CODE BEGIN TIM1_UP_IRQn 0 */
/* USER CODE END TIM1_UP_IRQn 0 */
HAL_TIM_IRQHandler(&htim1);
/* USER CODE BEGIN TIM1_UP_IRQn 1 */
flag_led = !flag_led;
if (flag_led) {
GPIOC->BSRR = (uint32_t) LED_Pin BSRR = LED_Pin;
}
/* USER CODE END TIM1_UP_IRQn 1 */
}
В основном цикле, или в инициализации запускаем таймер командой:
HAL_TIM_Base_Start_IT(&htim1);
Все. В итоге вы сделали так, что у вас будет запускаться, как пример, мигание светодиода каждые 30 мс. И не важно, в основном цикле хоть HAL_Delay() ставьте, хоть что. Таймер все равно будет вызывать прерывание тогда, когда нужно. Главное, чтоб приоритет у него был выше, чем у других задач.
Я про таймеры видео сниму тоже как-нибудь. А пока, можете под данным видео скачать материалы из занятия.
Там есть папка "Пример меню и анимаций из видео/ST7920".
В том проекте я включал таймер и то, что я сейчас описал - там есть. Можете тоже посмотреть).
Через дма лучше отправлять буфер. Указали буфер и количество байт включили передачу. В дма прерывание придёт по отправке буфера.
Не надо передавать по байту через дма
Спасибо за развернутый ответ, смотрю все ваши ролики про stm32 и планирую соскочить с ардуино. Правда никак не пойму как в реале отличаются способы IT от DMA? Я думал что способ DMA подразумевает отправку больших массивов из памяти в переферию в фоне, не отнимая ресурсы у основного цикла и не прибегая к таймерам, но на практике получается, что это подобные функции за исключением разного времени (70мсек и 100мсек) исполнения? Или нет?
И второй вопрос, Какие преимущества у стм от авр в плане паралельности процессов?
В моем понимании например SoftwareSerial.write (buffer) это блокирующая функция.
Serial.write(buffer) это функция паралельного процесса, которая выполняется паралельно с основным циклом.
SPI.transfer(byte) это ITфункция, хотя она блокирует основной цикл.
Какие ваши мысли по этому поводу?
@@sv-avtomatika не за что. Обрасчайтесь, если что
@@sv-avtomatika по поводу АВР вы наверно пишете в ардуино студио. Там все через одно место. Нал для стм тоже реализация через жопу.
Попробую объяснить отличие прерываний дма и например по передачи символа.
Во втором случае при возникновении прерывания вам надо скормить на передачу следующий байт. Это накладные расходы.
Теперь дма. Там прерывание возникает при ошибке передачи, при передаче половины буфера и при окончание передачи. Каждое прерывание включается отдельно. Прерывание по окончание передачи возникнет когда передаст я последний байт из буфера. Вся передача идёт в фоне. Выполнение основного цикла не блокируется.
Если вам интересно, то лучше перейти в ватсам и телеграм
Что за IT функция, которая быстрее DMA?
или как в обычном ардуино иде пользоваться твоей либой ?
Без понятия)
Библиотек готовых нет или это фсе в рамках изучения экрана?
Есть по-любому. Я ведь не единственный в интернете, кто с stm32 работает) Может и найдете чего, где реализация лучше, чем у меня) Можете посмотреть библиотеку на этот дисплей у Руслана с канала «Электроника в объективе». Он там даже сделал вывод двух шрифтов. Но признаюсь честно, я до его кода еще не дорос. Слишком уж мудрено все.
Не хотите попробовать подключить CBG128064A000-BIW-R ? экранчик соответственно с меня.
чет толком документацию найти не могу на него. Он случаем не на KS0108 чипе?
Привіт. А що це за повідомлення вилітає на екрані при прошиванні мікроконтролера?
Здравствуйте. Если Вы про проблемы, как на 13:55, то такое у меня происходит в основном из за того, что я запускаю дебаг и тут же выхожу из него, а он еще прогрузиться не успевает. Поэтому возникает ошибка в последовательности запуска. Ничего критичного)
@@Solderingironspb Дякую. Бо я теж пару разів таке отримував, але не розібрався що то ))
странно. ютуб безобидные комментарии удаляет. что-то новое
да. Это было странно. А что Вы писали?
@@Solderingironspb что тоже писал подобную библиотеку с навороченным меню под авр и что теперь когда собираюсь переходить на стм жалко будет если не получится ее портировать. вот и все )
А чего не получится-то?) если писали сами, то все у Вас получится) поменяете работу с периферией, да и все👍🏻