Графический дисплей на контроллере 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 Работаем с кодом.
  • НаукаНаука

Комментарии • 54

  • @Sleep88Walker
    @Sleep88Walker 3 года назад +5

    Воевал с этим экраном раза 4, все эти 4 раза бросал так как он выводил чушь и бесил меня, перепробовал несколько библиотек, пересмотрел кучу видео, и Вы первый кто упомянул об обратной полярности SPI...огромный вам поклон...меняем 2 параметра и всё работает

  • @masterkit9517
    @masterkit9517 3 года назад +8

    Очень ценное видео, я неделю только светодиод первый раз подключал) для меня бесценна данная информация как сокровище.

  • @JONSIM-or7vw
    @JONSIM-or7vw Год назад +1

    НЕ ЗАПУСКАЕТСЯ ЭКРАН ? У меня экран запускался через раз при перезагрузке. Оказалось дело в некачественных проводах от программатора к STM 32 (обычные китайские в комплекте с программатором шли). Падение напряжения в проводах составляло 0,3-0,5в. Это при том что экран питается отдельно от БП. Если у вас тупит экран стоит измерить напряжение на МК. Буду рад если кому-то поможет этот комментарий. Видео просто супер, автор красавчик. Если бы таких людей было больше мир стал бы намного лучше.

  • @user-bn2qp6sh8r
    @user-bn2qp6sh8r 3 года назад +4

    Отличное видео !!! Приятно видеть, что есть люди, не поддающиеся общей современной деградации общества !!!

  • @ALCohol-qu7ib
    @ALCohol-qu7ib 3 года назад +1

    Супер! Необычайно полезное видео! Думаю, с таким контентом, подписчиков прибавится!

  • @user-br6cz6yi7c
    @user-br6cz6yi7c 2 года назад +3

    Реально круто! Поставил бы вагон лайков за такие труды.

  • @edmelectronics4110
    @edmelectronics4110 3 года назад

    Очень благодарю Вам. Я фен Ваший канал. Поздравляю!

  • @user-bp8dl5hi5x
    @user-bp8dl5hi5x 5 месяцев назад

    Большое СПАСИБО !!! То, что доктор прописал.

  • @Radiolubitel-Petrovich
    @Radiolubitel-Petrovich 2 года назад +1

    Вот и у меня лежит уже десять лет такой дисплей, зайду в ВК.

  • @avr_stm_pro2955
    @avr_stm_pro2955 3 года назад

    Спасибо за труд!!

  • @user-zt4gd7jn3g
    @user-zt4gd7jn3g 3 года назад

    Просто и понятно. Спасибо!!!

  • @Karroo74
    @Karroo74 3 года назад

    Спасибо! Полезно.

  • @vipagnes6127
    @vipagnes6127 9 месяцев назад

    Спасибо за библиотеку, для мене лентяя - самое то)

  • @ssorokin481
    @ssorokin481 3 года назад

    Здравствуйте, спасибо огромное за урок и библиотеку!!!
    Пробовал отправлять данные по spi с помощошью cmsis, в надежде уменьшения времени обновления буфера(на дисплее с контроллером ili9341 прокатило ), картинка начала рассыпаться на высоких скоростях, начал уменьшать частоту spi, пришёл к такому же времени обновления, что и с библиотекой hal

    • @Solderingironspb
      @Solderingironspb  3 года назад +2

      Здравствуйте) да...именно так...я написал еще библиотеку для него в 8мибитном режиме по параллельной шине. Тоже скорости думал достигну большей. Но фиг там...не быстрее 74мс на обновление дисплея, иначе все ломается...увы.... хочу потом еще попробовать дисплей ks0108. Может там лучше ситуация будет)

    • @ssorokin481
      @ssorokin481 3 года назад +1

      @@Solderingironspb Вообщем, после недели ковыряния разных библиотек для этого экрана и раскуривания документации, получилось достичь времени обновления около 40мс через IT функцию, при попытке увеличить скорость картинка рассыпается. Был немного переделал алгоритм записи видеобуфера(подсмотрел как сделано в других библиотеках))) ), соответственно немного видоизменились функции отрисовки своих символов и картинок. Огромное спасибо вам за предоставленные исходники!
      Вот выкладываю свой проект для кейла, возможно тут присутствует туева хуча косяков, но все же...
      drive.google.com/file/d/1t7ghabHPRMMjBAEmeyLKF5MQ7uiUpL5S/view?usp=sharing
      может кому будет интересно

    • @Wo_Wang
      @Wo_Wang Год назад

      @@ssorokin481 , файл не обнаружен...
      :-(

  • @andrejzav5690
    @andrejzav5690 3 года назад

    круто Спасибо за F4

    • @Solderingironspb
      @Solderingironspb  3 года назад

      Если на 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

  • @solegm3331
    @solegm3331 2 года назад

    Спасибо, познавательно! Парни поясните, как он без подсветки? Т.е. можно ли подобным экраном пользоваться без подсветки?

    • @Solderingironspb
      @Solderingironspb  2 года назад

      ну так...не совсем удобно будет. Я ставлю в них резистор. С резистором делаю минимальную яркость и норм. Кстати, я обновил библиотеку. Гляньте видео "Дисплеи ST7920 и GMG12864(ST7565r). Обновление графических библиотек. Режим плоттера."

    • @vladilion90
      @vladilion90 Год назад

      Можно, но если вам хватит освещения для того чтобы видеть пиксели, то ради бога )

  • @raven8867
    @raven8867 3 года назад

    Доброго! Интересное видео! Мой лайк 35.Вопрос от новичка .Пид регулятор тип переменных float , как выводить данные для отладки из прерывания и отображать в виде графика для настройки пид.По Вашему видео переделал свисток для swo и в keil5 пытался переменные из прерывания смотреть в system analyzer , данные идут с сильным запаздыванием(закрываю и открываю окно анализатора).Cubeide не ставиться система 32 бита.Какой программатор нужен для удобной отладки?

    • @Solderingironspb
      @Solderingironspb  3 года назад

      Добрый вечер) новички ПИД регуляторы не настраивают, не принижайте себя) swo очень запаздывает. Он точно не для скоростного вывода информации. Программаторы все делают одно и тоже, что китайский, что оригинальный. Возможно я скажу глупость, но...не пробовали по uart кидать данные в порт и уже на компьютере использовать какой-нибудь плоттер?) будет куда быстрей и удобней, чем swo. Ну а с пид регулятором работать через таймер, а не HAL_GetTick(), чтоб тайминги точные были.

    • @raven8867
      @raven8867 3 года назад

      Спасибо , попробую .Полезный у вас канал!

  • @sergey705
    @sergey705 5 месяцев назад

    Олег, добрый вечер! Использую Вашу библиотеку с ST7565R. Вопрос такой - могу ли я прикрутить другой массив со шрифтами ( естественно, символы другой высоты и ширины). Для этого необходимо дописать функцию, аналогичную в библиотеке, только указав другие размеры?

    • @Solderingironspb
      @Solderingironspb  5 месяцев назад

      добрый вечер! все верно) Только советую если переделывать, то следующую версию библиотеки. ruclips.net/video/ajEqZN5s5xc/видео.html

    • @sergey705
      @sergey705 5 месяцев назад

      @@Solderingironspb ​Добрый вечер! Попробовал скопировать функцию для другого шрифта. Шрифт размером больше. Там даже не весь набор, а цифры и два-три символа. Размер 12х16. Изменял следующее: uint8_t x_stop = x + 12; //конечное положение по x с учетом межсимвольного интервала, for (i = 0; i

  • @MrFog124
    @MrFog124 3 года назад +1

    Помоги пожалуйста подключить по i2C его через переходник о роботдин???

  • @andrewtitoff6167
    @andrewtitoff6167 10 месяцев назад

    Не подскажете, а у CBG128064A000-BIW-R я так понял только параллельный интерфейс или я ошибаюсь?

  • @user-ur8ou9ft1n
    @user-ur8ou9ft1n 5 месяцев назад

    Вообще то в дисплее можно менять заполнение. Слева направо, или снизу вверх.
    Нужно читать даташит

  • @user-ff1sm3di7n
    @user-ff1sm3di7n 2 года назад

    Отлично. Какое название у сообщества?

  • @sv-avtomatika
    @sv-avtomatika 3 года назад +1

    Подскажите, не совсем понимаю:
    1. вы дма включили вместе с прерываниями - зачем?
    2. Функция ST7920_UPDATE() в фоне работает или забирает ресурсы у основного цикла?
    3. Для чего нужны прерывания для SPI, если только отправка идет?

    • @Solderingironspb
      @Solderingironspb  3 года назад

      Доброе утро!
      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".
      В том проекте я включал таймер и то, что я сейчас описал - там есть. Можете тоже посмотреть).

    • @user-tm5fp3xw9j
      @user-tm5fp3xw9j 3 года назад

      Через дма лучше отправлять буфер. Указали буфер и количество байт включили передачу. В дма прерывание придёт по отправке буфера.
      Не надо передавать по байту через дма

    • @sv-avtomatika
      @sv-avtomatika 3 года назад

      Спасибо за развернутый ответ, смотрю все ваши ролики про stm32 и планирую соскочить с ардуино. Правда никак не пойму как в реале отличаются способы IT от DMA? Я думал что способ DMA подразумевает отправку больших массивов из памяти в переферию в фоне, не отнимая ресурсы у основного цикла и не прибегая к таймерам, но на практике получается, что это подобные функции за исключением разного времени (70мсек и 100мсек) исполнения? Или нет?
      И второй вопрос, Какие преимущества у стм от авр в плане паралельности процессов?
      В моем понимании например SoftwareSerial.write (buffer) это блокирующая функция.
      Serial.write(buffer) это функция паралельного процесса, которая выполняется паралельно с основным циклом.
      SPI.transfer(byte) это ITфункция, хотя она блокирует основной цикл.
      Какие ваши мысли по этому поводу?

    • @user-tm5fp3xw9j
      @user-tm5fp3xw9j 3 года назад

      @@sv-avtomatika не за что. Обрасчайтесь, если что

    • @user-tm5fp3xw9j
      @user-tm5fp3xw9j 3 года назад

      @@sv-avtomatika по поводу АВР вы наверно пишете в ардуино студио. Там все через одно место. Нал для стм тоже реализация через жопу.
      Попробую объяснить отличие прерываний дма и например по передачи символа.
      Во втором случае при возникновении прерывания вам надо скормить на передачу следующий байт. Это накладные расходы.
      Теперь дма. Там прерывание возникает при ошибке передачи, при передаче половины буфера и при окончание передачи. Каждое прерывание включается отдельно. Прерывание по окончание передачи возникнет когда передаст я последний байт из буфера. Вся передача идёт в фоне. Выполнение основного цикла не блокируется.
      Если вам интересно, то лучше перейти в ватсам и телеграм

  • @sledleo
    @sledleo 3 года назад

    Что за IT функция, которая быстрее DMA?

  • @MrFog124
    @MrFog124 3 года назад +1

    или как в обычном ардуино иде пользоваться твоей либой ?

  • @user-bh2ot5ks8f
    @user-bh2ot5ks8f 3 года назад

    Библиотек готовых нет или это фсе в рамках изучения экрана?

    • @Solderingironspb
      @Solderingironspb  3 года назад

      Есть по-любому. Я ведь не единственный в интернете, кто с stm32 работает) Может и найдете чего, где реализация лучше, чем у меня) Можете посмотреть библиотеку на этот дисплей у Руслана с канала «Электроника в объективе». Он там даже сделал вывод двух шрифтов. Но признаюсь честно, я до его кода еще не дорос. Слишком уж мудрено все.

  • @andrewtitoff6167
    @andrewtitoff6167 9 месяцев назад

    Не хотите попробовать подключить CBG128064A000-BIW-R ? экранчик соответственно с меня.

    • @Solderingironspb
      @Solderingironspb  9 месяцев назад

      чет толком документацию найти не могу на него. Он случаем не на KS0108 чипе?

  • @victorsi1992
    @victorsi1992 3 года назад

    Привіт. А що це за повідомлення вилітає на екрані при прошиванні мікроконтролера?

    • @Solderingironspb
      @Solderingironspb  3 года назад

      Здравствуйте. Если Вы про проблемы, как на 13:55, то такое у меня происходит в основном из за того, что я запускаю дебаг и тут же выхожу из него, а он еще прогрузиться не успевает. Поэтому возникает ошибка в последовательности запуска. Ничего критичного)

    • @victorsi1992
      @victorsi1992 3 года назад

      @@Solderingironspb Дякую. Бо я теж пару разів таке отримував, але не розібрався що то ))

  • @SaLaGaDH
    @SaLaGaDH 3 года назад +1

    странно. ютуб безобидные комментарии удаляет. что-то новое

    • @Solderingironspb
      @Solderingironspb  3 года назад

      да. Это было странно. А что Вы писали?

    • @SaLaGaDH
      @SaLaGaDH 3 года назад

      @@Solderingironspb что тоже писал подобную библиотеку с навороченным меню под авр и что теперь когда собираюсь переходить на стм жалко будет если не получится ее портировать. вот и все )

    • @Solderingironspb
      @Solderingironspb  3 года назад +1

      А чего не получится-то?) если писали сами, то все у Вас получится) поменяете работу с периферией, да и все👍🏻