Наиболее интересное применение дисплеев получается в связке с микроконтроллером, позволяющее расширить возможности устройств. Сегодня настроим UART для связи и дисплеем и напишем простенькую библиотеку для общения по встроенному протоколу и посветим светодиодом.
Прошлые статьи:
DWIN человеко-машинный интерфейс. Введение
DWIN. Подготовка дисплея к работе и загрузка демо-проекта
DWIN. Знакомство с программным обеспечением DWIN Graphic Utilized Software. Hello World
DWIN. Протокол Modbus. Slave и Master режимы.
Использовать будем дисплей DMG80480C050_03WTC.
В качестве контроллера будем использовать плату STM32-NUCLEO-L476RG, в качестве среды разработки CubeIDE.
Питание на дисплей подаётся с внешнего источника 5В. Контакт GND на дисплее должен быть соединен с контактом GND на плате Nucleo. A0 Nucleo - RX DWIN, A1 Nucleo - TX DWIN.
Протокол передачи данных
Перед соединением STM32 с дисплеем DWIN хорошо бы понять, как именно будет происходить общение между ними, рассмотрим протокол обмена ещё раз.
Существует 5 типов команд:
0x80 - Write Control Register;
0x81 - Read Control Register;
0x82 - Write VPs (RAM);
0x83 - Read VPs (RAM);
0x83 - Touch Upload.
Пакет имеет следующий формат:
<Frame Header H><Frame Header L><Byte Count><Command>[<Data>][<CRC H><CRC L>]
Где:
<> - один байт;
[] - опциональные поля.
<Frame Header H><Frame Header L> - 5A A5 стартовые байты.
<Byte Count> - количество передаваемых байт информации включая команду;
<Command> - одна из вышеуказанных команд;
[<Data>] - Включает адрес, длину и значения переменной (или переменных при пакетной отправке), максимум 249 байт;
[<CRC H><CRC L>] - контрольная сумма.
Использовать CRC пока что не будем.
Рассмотрим несколько примеров пакетов:
5A A5 04 80 00 01 03 - запись значения 03 в регистр 01
5A A5 - заголовочные байты;
04 - длинна пакета;
80 - команда на запись регистра управления;
00 01 - адрес регистра управления;
03 - значение переменной записываемой в регистр управления 00 01.
Ответ:
5A A5 03 80 4F 4B
5A A5 - заголовочные байты;
03 - длинна пакета;
80 - команда на запись регистра управления;
4F 4B - подтверждение выполнения команды.
5A A5 04 81 00 01 01 - считывание одного байта с регистра 00 01
5A A5 - заголовочные байты;
04 - длинна пакета;
81 - команда на чтение регистра управления;
00 01 - адрес регистра управления;
01 - количество регистров, считанных начиная с адреса 00 01.
Ответ:
5A A5 05 81 00 01 01 3F
5A A5 - заголовочные байты;
05 - длинна пакета;
81 - команда на запись регистра управления;
00 01 - адрес регистра;
01 - количество считанных байт данных;
3F - считанное значение.
5A A5 05 82 10 00 04 D2 - запись значения 1234 в переменную по адресу 0x1000
5A A5 - заголовочные байты;
05 - длинна пакета;
82 - команда на запись переменной;
10 00 - адрес хранения переменной;
04 D2 - значение переменной 0x04D2 = 1234.
Ответ:
5A A5 03 82 4F 4B
5A A5 - заголовочные байты;
03 - длинна пакета;
82 - команда на запись переменной;
4F 4B - подтверждение выполнения команды.
5A A5 04 83 10 00 01 - считывание переменной с адреса 0x1000
5A A5 - заголовочные байты;
04 - длинна пакета;
83 - команда на чтение переменной;
10 00 - адрес хранения переменной;
01 - количество считываемых байт.
Ответ:
5A A5 06 83 10 00 01 00 02
5A A5 - заголовочные байты;
06 - длинна пакета;
83 - команда на запись переменной;
10 00 - адрес хранения переменной;
01 - количество считанных слов (2 байта);
00 02 - считанное значение переменной.
Настройка проекта STM32 в CubeIDE
Определимся с необходимым функционалом и настроим периферию контроллера, для этого запускаем CubeIDE, создаём новый проект *.ioc, выбираем контроллер STM32L476RGTx и приступаем к настройке:
Настроим UART4 на скорость 115200 8N1. Включим DMA UART4_RX, mode Circular и Data Width Half Word. В вкладке прерываний NVIC Settings включим глобальное прерывание UART4.
Настроим TIM2 Channel 1 на генерацию ШИМ сигнала для встроенного в Nucleo светодиода. Будем управлять яркостью диода через дисплей. Также включим RTC в Binary формате. Также для RTC включим LSE генератор в вкладке RCC.
Настроим частоту работы контроллера на 16MHz и сгенерируем проект.
Создадим в проекте папку DWIN_LIB, в неё добавим файлы DWIN.c, DWIN.h, DWIN_APP.c и DWIN_APP.h.
Также укажем место расположения папки в которой находятся файлы, чтобы компилятор смог их найти:
Все исходники можно взять на GitHub, Дзен не очень приспособлен для вставки кода, поэтому будут изображения
В DWIN.h добавим:
Константы
Перечисление команд
Структуру пакета согласно документации <Frame Header H><Frame Header L><Byte Count><Command>[<data>]
Общую структуру для обработки и парсинга принимаемого пакета по DMA UART:
В файле DWIN.c необходимо описать необходимые функции и объявить структуру данных.
Прописываем константы и объявляем структуру
Прием данных через DMA будет работать следующим образом:
1. Объявление массива в который будут сохраняться данные и заполнения всех ячеек 0xFFFF.
2. При получении байта ячейка меняет своё значение на 0x00XX где XX полученный байт данных.
3. Происходит считывание байта, считанная ячейка заполняется 0xFFFF к счетчику принятых байтов прибавляется 1 до тех пор, пока буфер не дойдёт до конечного значения, после этого значения счетчика обнуляется и происходит считывание с 0 байта. Таким образом Получается кольцевой буфер для приема.
4. Если считаный байт совпадает с стартовым байтом пакета происходит парсинг данных, то тех пор пока весь пакет не будет считан или не выйдет время, отведенное на прием пакета.
Инициализация DMA
Функция запускает прием данные UART через DMA. Полученные данные сохраняются в readDataDWIN.uartBuffer.
Считывание байта с буфера DMA
Проверяем не считан ли пакет данных, если ещё нет начинаем проверять буфер DMA. Если обнаружили стартовый байт, то складываем в буфер rxData принятый пакет данных.
Считывание принятого пакета данных
Разбор пакета согласно протоколу
Также нам понадобятся функции считывания и записи переменных.
Считывание переменной с заданного адреса
Ранее в проектах было видно, что дисплей оперирует переменными размерностью 16, 32 и 64 бита, напишем функции для них, а также функцию произвольного количества записи байт массива.
Также добавим функции для перехода по страницам дисплея и изменения яркости.
Не забудем добавить функции в заголовочный файл DWIN.h.
Добавляем в файл main.c функции parsingDWIN() и dwinUartDmaInit(), а также не забываем подключить написанную библиотеку include "DWIN.h"
Загрузим в дисплей проект Hello Word с первой статьи, попробуем получить данные с полей 5000 и 5006 и увидеть их отображение в контроллере.
Начинаем отладку в среде CubeIDE, подключив USB кабель с Nucleo и нажав на кнопку F11.
Запустив отладку, добавим в область Live expression структуру readDataDWIN.
Нажмем на дисплее кнопку Send. После чего в порт должно отправиться значение переменной из области памяти с адресом 5006. По умолчанию это значение равно 50.
Как видно в окне отладки, пришёл пакет 5A A5 06 83 50 06 01 00 32 являющийся событием Touch Upload.
Расшифруем:
5A A5 06 83 50 06 01 00 32
5A A5 - заголовочные байты;
06 - длинна пакета;
83 - команда на запись переменной;
50 06 - адрес хранения переменной;
01 - количество считанных слов (2 байта);
00 32 - считанное значение переменной, 0x32 = 50.
Убедились, что библиотека работает на прием, теперь протестируем отправку данных на дисплей. Для этого допишем код в функцию main.
Если всё написано правильно, то на дисплее в полях 5002 и 5004 будут изменяться значения.
Считывание данных по прикосновению проверено, запись данных проверена, осталось считать данные из произвольной ячейки памяти.
Считывать будем переменную по адресу 5006 и в зависимости от значения, изменять яркость встроенного в Nucleo светодиода, при чем если значение будет меньше 50, то светодиод будет отключаться совместно с исчезающей иконкой лампочкой на дисплее.
Добавим функции в DWIN_APP.c и DWIN_APP.h
Добавим функции в заголовочный файл:
Также внесем изменения функцию main:
Начинаем отладку, в результате должен получиться эффект, показанный на видео, а именно изменении переменной в ячейки памяти 5006 изменяется яркость светодиода:
В данной статье более детально разобраны команды необходимые для взаимодействия микроконтроллера и дисплея, проверено считывание и запись данных.
Ссылка на GitHub: https://github.com/VB-Radchenko/DWIN-Project/
По вопросам закупок, технической поддержкой и общим вопросам обращайтесь на электронную почту: Info_dwin@mail.ru
Скидочный купон для официального магазина AliExpress - DWVLPRO
#dwin #hmi #dgus #iot #diy #сенсорная панель