Всем привет. Есть дисплей 480х320 на ili9486 с параллельным 16 битным интерфейсом. Дисплей подключен к платке stm32f411.Прога для управления дисплеем написана без использования библиотек,просто на порты стм подключенные к дисплею выводятся нужные данные.Код с настройками портов стм и функцией отправки данных на дисплей приведен ниже.В данный момент использую только первые 8 бит шины из 16,для простоты эксперементов.
void LCD_Write(char DATA1,char TIP1 ){ *GPIOA_ODR=DATA1; if(TIP1==1)*GPIOB_ODR=1;else *GPIOB_ODR=9; //Если 1 то команда,если 0 то данные (Устанавливаем лог уровень на пин дисплея данные/команда )
delayMicroseconds(400); if(TIP1==1)*GPIOB_ODR=5;else *GPIOB_ODR=13;//Если 1 то команда,если 0 то данные (Устанавливаем лог1 на пин записи с учетом выбора данные/команда)
delayMicroseconds(400); *GPIOB_ODR=1; //Устанавливаем лог 0 на пин записи
delayMicroseconds(400);
}
На порте А висит шина данных дисплея 8 бит,на порте В управляющие пины rst.cs,wr,rs. Основной код,это просто многократный вызов функции LCD_Write с необходимыми аргументами. В общем в данный момент дисплей проходит инициализацию,далее командами Column Address Set и Page Address Set выделяю область куда выводить данные,затем командой Memory Write зажигаю пиксели выделенной области. В итоге дисплей отрисовывает пиксели. Проблема заключается в том,между командами в функции обязательно должна быть пауза не менее 400микросек,иначе дисплей не реагирует на команды,то есть если в вот в функции LCD_Write паузы установлены на 400 -все нормально работает,рисуються пиксели но медленно,если же просто заменить значение 400 на например 200 ничего не работает вообще.В чем проблемма?
Последний раз редактировалось alkis3 Ср май 18, 2022 17:09:18, всего редактировалось 1 раз.
Нострадамлю жуткий говнокод, где адов ногодрыг (функция delayMicroseconds - тому подтверждение) наобум. Если нет нормального параллельного интерфейса, его можно эмулировать при помощи DMA! По таймеру пинать - чтобы был четкий тайминг. Ну элементарно же это делается!..
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Можно пример какой нибудь ,ну где почитать про то что вы говорите?Суть в том что я с стм что либо делать начал только 5 дней назад
Добавлено after 1 minute 54 seconds: И если не трудно,скажите в чем именно причина того ,что в этом коде обязательно нужны такие паузы?Там чтото не поспевает или что?
Ну и не надо попиксельно точками рисовать. Поставьте размер окна хотябы 100х100, а лучше 200х200 пикселей и выводите в это окошко картинку из внутреннего буфера в SRAM. Хотя конечно для такого микроконтроллера такого размера дисплей - тут немудренно, что черезопно будет. Ну и мануал на дисплей прочтите, на стр.298
Цитата:
я с стм что либо делать начал только 5 дней назад
Я 5 дней на СТМке светодиодами мигал и таймеры крутил, а вы сразу прям за дисплей исполинских размеров принялись. Оттого и получается, что управление пинами не освоили и не изучили структуру заголовочника CMSIS, вы пытаетесь передефайнить уже существующие определения и сотворить дикую дичь. Начинать надо с простого, помаленьку. Понимаю, что хочется сразу дисплей, буковки-циферки, большой термометр с интернет-погодой, но.... Но надо начинать с начала, с азов. Все так делали, потому и ошибок в базовых познаниях не допускают.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
По поводу пинов.Я кодю сейчас в среде ардуино иде,там в общем то есть другой,более простой и наверное грамотный способ выведение инфы на пины.Если допустим выводить значения им,то тогда что то измениться?
Добавлено after 2 hours 4 minutes 2 seconds: Да в последней написано В в коде
Добавлено after 16 minutes 10 seconds: Вижу мануал,скорость работы портов очень высокая..Тогда опять таки вопрос почему работает только при наличии этих огромных пауз? То есть на сколько я понимаю дело не в стм контроллере по сколько во время паузы он тупо ничего не делает, подключение к дисплею верное иначе бы он вообще ничего никогда не выводил ни с паузами ни без,в мануале видно что по скорости дисплей должен справляться..так в чем же может быть причина?
Это я к тому, что вместо ODR=5; ODR=9, ODR=1 можно же изучить возможности микроконтроллера по раздельному управлению ногами, не затрагивая соседние ноги. Или хотябы на худой конец узнать, что у языка Си есть логические операции AND и OR для влияния только на один бит. Возможно, что-то накосяпорено с порядком переключений ног. Возможно, косяки в настройке дисплея.
Про то как выводить на отдельные пины мне известно,но для простоты кода,чтоб он небыл громозким я сделал вывод сразу на весь порт. Ну вроде все нормально с переключением ,сейчас переписал функцию чтоб пины дергались строго в той последовательность как на диаграмме в даташите.В итоге у меня получилось 5 пауз не короче чем по 150 микросек. Есть предположение,что медлительность дисплея вызвана тем,что изображение я в него вывожу попиксельно командами которые сразу эти пиксели выбрасывают на экран.Может быть такая штука ,что контроллер дисплея не готов принимать данные пока он их не проявит на экране или чтото типа того..? То есть допустим еслиб скажем изначально я загнал данные всех пикселей в какойто буфер дисплея,а потом послал ему команду все это вывести на экран, получилось бы гораздо быстрее.Но такой команды я в даташите не нашел что то..И опять же,верно или нет мое опасение не понятно..
Добавлено after 34 minutes 39 seconds: Хотя нет, инициализация с маленькими паузами тоже не происходит,так что вывод пикселей тут не причем
Медлительность связана с тем, что вначале передаются 10 байт координат окна вывода размером в 1 пиксель, затем передается байт команды записи данных и только потом два байта пиксельного цвета. Фактически, в 11 раз медленнее. А если установите окно вывода размерами хотябы в 50х50 пикселей (команда установки начального и конечного столбца и команда установки начальной и конечной строки), затем передатите команду записи пиксельных данных и потом из буфера SRAM последовательно передадите 2500 пикселей, то скорость будет гораздо выше.
Из буфера стм32 вы имеете в виду?Если да,то я практически так и делаю,не совсем так,а вот так
Код:
for(v=0;v<10000;v++)LCD_Write(170,1);
Добавлено after 10 minutes 5 seconds: Все,вопрос разрешился! Странно конечно,но в итоге заработало так,что я для вывода команд оставил туже самую длину пауз,а для данных более короткую ,и оно заработало...Не понятно почему так конечно..но вот при паузе на данные в 5 микросек изображение выводит почти мгновенно..может и меньше можно поставить паузу..
Японский городовой! Ну если нет сил на DMA по таймеру, уж неужели нет сил использовать цикл? Кстати, советую обратить внимание на последнюю строчку. Там точка вместо запятой. Не может оно скомпиляться!
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Ну у меня другой код просто в среде написан,там у меня 2 функции есть ,1 команды,другая данные,этот тут для форума скомпоновал в одну.. Да ладно уже,сейчас очень быстро отрисовываеться и так сойдет.Я паузы на данные вообще убрал,изображение выводит почти мгновенно
выводит почти мгновенно..может и меньше можно поставить паузу..
И всё-же посмотри как у меня сделано. Под новый экран и мк требуется переписать несколько строк. Буквально указать порт данных, порт управления, и пины управления. А дальше оно само. При записи в BSRR - сброс имеет более высокий приоритет чем установка единицы. Это позволяет использовать макрос на автомате. В программном коде будет прямая запись в регистр готовой константы. F103 успевает рисовать 30 кадров в таком режиме. Следующий уровень - это использование дма и таймера. Там намного веселей рисуется. Но привязка к мк очень жёсткая, на новом проекте нужно переписывать слишком много. Зато стабильные 60 кадров анимации на дохлом F030.
возможно Вы в ините дисплея не отрабатываете необходимые паузы, и он просто не инитится если дело в этом - подкорректируйте по паузам инит (пара мест где нужно подождать там бывает), и в LCD_Write задержек не потребуется.
При записи в BSRR - сброс имеет более высокий приоритет чем установка единицы. Это позволяет использовать макрос на автомате.
Ну вы хоть читайте что ТС пишет. У него 8 бит данных на GPIOA подключены и самым быстрым вариантом будет *(volatile uint8_t*)&GPIOA->ODR = data; Через BSRR ему надо только сигналы CS, WR и RS. А так как, судя по всему, и они у ТС монопольно на GPIOB висят, то уж извините, но код ТС таки быстрее вашего макроса будет. Единственное, надо позаботиться, чтобы LCD_Write заинлайнилась.
СпойлерВообще, запись в порт выглядит как-то так. У ТС реализован первый вариант. Я предлагаю второй - он такой же по скорости и высвободит 8 старших бит порта. Вы же предлагаете 4-й - самый медленный.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения