Воевал с этим экраном раза 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 может кому будет интересно
Олег, добрый вечер! Использую Вашу библиотеку с ST7565R. Вопрос такой - могу ли я прикрутить другой массив со шрифтами ( естественно, символы другой высоты и ширины). Для этого необходимо дописать функцию, аналогичную в библиотеке, только указав другие размеры?
добрый вечер! все верно) Только советую если переделывать, то следующую версию библиотеки. ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-ajEqZN5s5xc.html
@@Solderingironspb Добрый вечер! Попробовал скопировать функцию для другого шрифта. Шрифт размером больше. Там даже не весь набор, а цифры и два-три символа. Размер 12х16. Изменял следующее: uint8_t x_stop = x + 12; //конечное положение по x с учетом межсимвольного интервала, for (i = 0; i
Подскажите, не совсем понимаю: 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 по поводу АВР вы наверно пишете в ардуино студио. Там все через одно место. Нал для стм тоже реализация через жопу. Попробую объяснить отличие прерываний дма и например по передачи символа. Во втором случае при возникновении прерывания вам надо скормить на передачу следующий байт. Это накладные расходы. Теперь дма. Там прерывание возникает при ошибке передачи, при передаче половины буфера и при окончание передачи. Каждое прерывание включается отдельно. Прерывание по окончание передачи возникнет когда передаст я последний байт из буфера. Вся передача идёт в фоне. Выполнение основного цикла не блокируется. Если вам интересно, то лучше перейти в ватсам и телеграм
Если на 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
Доброго! Интересное видео! Мой лайк 35.Вопрос от новичка .Пид регулятор тип переменных float , как выводить данные для отладки из прерывания и отображать в виде графика для настройки пид.По Вашему видео переделал свисток для swo и в keil5 пытался переменные из прерывания смотреть в system analyzer , данные идут с сильным запаздыванием(закрываю и открываю окно анализатора).Cubeide не ставиться система 32 бита.Какой программатор нужен для удобной отладки?
Добрый вечер) новички ПИД регуляторы не настраивают, не принижайте себя) swo очень запаздывает. Он точно не для скоростного вывода информации. Программаторы все делают одно и тоже, что китайский, что оригинальный. Возможно я скажу глупость, но...не пробовали по uart кидать данные в порт и уже на компьютере использовать какой-нибудь плоттер?) будет куда быстрей и удобней, чем swo. Ну а с пид регулятором работать через таймер, а не HAL_GetTick(), чтоб тайминги точные были.
@@Solderingironspb что тоже писал подобную библиотеку с навороченным меню под авр и что теперь когда собираюсь переходить на стм жалко будет если не получится ее портировать. вот и все )
ну так...не совсем удобно будет. Я ставлю в них резистор. С резистором делаю минимальную яркость и норм. Кстати, я обновил библиотеку. Гляньте видео "Дисплеи ST7920 и GMG12864(ST7565r). Обновление графических библиотек. Режим плоттера."
Здравствуйте. Если Вы про проблемы, как на 13:55, то такое у меня происходит в основном из за того, что я запускаю дебаг и тут же выхожу из него, а он еще прогрузиться не успевает. Поэтому возникает ошибка в последовательности запуска. Ничего критичного)
Есть по-любому. Я ведь не единственный в интернете, кто с stm32 работает) Может и найдете чего, где реализация лучше, чем у меня) Можете посмотреть библиотеку на этот дисплей у Руслана с канала «Электроника в объективе». Он там даже сделал вывод двух шрифтов. Но признаюсь честно, я до его кода еще не дорос. Слишком уж мудрено все.