Найти тему
Владимир Радченко

Панель DWIN. Связываем STM32 Nucleo и дисплей.

Оглавление

Наиболее интересное применение дисплеев получается в связке с микроконтроллером, позволяющее расширить возможности устройств. Сегодня настроим UART для связи и дисплеем и напишем простенькую библиотеку для общения по встроенному протоколу и посветим светодиодом.

Прошлые статьи:

DWIN человеко-машинный интерфейс. Введение

DWIN. Подготовка дисплея к работе и загрузка демо-проекта

DWIN. Знакомство с программным обеспечением DWIN Graphic Utilized Software. Hello World

DWIN. Протокол Modbus. Slave и Master режимы.

Использовать будем дисплей DMG80480C050_03WTC.

DMG80480C050_03WTC
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 пока что не будем.

Рассмотрим несколько примеров пакетов:

T5L_DGUSII Application Development Guide 20210929 52/146
T5L_DGUSII Application Development Guide 20210929 52/146

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 - подтверждение выполнения команды.

T5L_DGUSII Application Development Guide 20210929 53/146
T5L_DGUSII Application Development Guide 20210929 53/146

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 - считанное значение.

T5L_DGUSII Application Development Guide 20210929 53/146
T5L_DGUSII Application Development Guide 20210929 53/146

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 - подтверждение выполнения команды.

T5L_DGUSII Application Development Guide 20210929 54/146
T5L_DGUSII Application Development Guide 20210929 54/146

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 и сгенерируем проект.

-8

Создадим в проекте папку 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:

-10

В файле DWIN.c необходимо описать необходимые функции и объявить структуру данных.

Прописываем константы и объявляем структуру

-11

Прием данных через DMA будет работать следующим образом:
1. Объявление массива в который будут сохраняться данные и заполнения всех ячеек 0xFFFF.
2. При получении байта ячейка меняет своё значение на 0x00XX где XX полученный байт данных.
3. Происходит считывание байта, считанная ячейка заполняется 0xFFFF к счетчику принятых байтов прибавляется 1 до тех пор, пока буфер не дойдёт до конечного значения, после этого значения счетчика обнуляется и происходит считывание с 0 байта. Таким образом Получается кольцевой буфер для приема.
4. Если считаный байт совпадает с стартовым байтом пакета происходит парсинг данных, то тех пор пока весь пакет не будет считан или не выйдет время, отведенное на прием пакета.

Инициализация DMA

-12

Функция запускает прием данные UART через DMA. Полученные данные сохраняются в readDataDWIN.uartBuffer.

Считывание байта с буфера DMA

-13

Проверяем не считан ли пакет данных, если ещё нет начинаем проверять буфер DMA. Если обнаружили стартовый байт, то складываем в буфер rxData принятый пакет данных.

Считывание принятого пакета данных

-14

Разбор пакета согласно протоколу

-15

Также нам понадобятся функции считывания и записи переменных.

Считывание переменной с заданного адреса

-16

Ранее в проектах было видно, что дисплей оперирует переменными размерностью 16, 32 и 64 бита, напишем функции для них, а также функцию произвольного количества записи байт массива.

Также добавим функции для перехода по страницам дисплея и изменения яркости.

Не забудем добавить функции в заголовочный файл DWIN.h.

-19

Добавляем в файл main.c функции parsingDWIN() и dwinUartDmaInit(), а также не забываем подключить написанную библиотеку include "DWIN.h"

-20

Загрузим в дисплей проект Hello Word с первой статьи, попробуем получить данные с полей 5000 и 5006 и увидеть их отображение в контроллере.

Начинаем отладку в среде CubeIDE, подключив USB кабель с Nucleo и нажав на кнопку F11.

Отладка в CubeIDE
Отладка в CubeIDE

Запустив отладку, добавим в область Live expression структуру readDataDWIN.

Нажмем на дисплее кнопку Send. После чего в порт должно отправиться значение переменной из области памяти с адресом 5006. По умолчанию это значение равно 50.

-22

Как видно в окне отладки, пришёл пакет 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.

-23

Если всё написано правильно, то на дисплее в полях 5002 и 5004 будут изменяться значения.

Считывание данных по прикосновению проверено, запись данных проверена, осталось считать данные из произвольной ячейки памяти.

Считывать будем переменную по адресу 5006 и в зависимости от значения, изменять яркость встроенного в Nucleo светодиода, при чем если значение будет меньше 50, то светодиод будет отключаться совместно с исчезающей иконкой лампочкой на дисплее.

Добавим функции в DWIN_APP.c и DWIN_APP.h

-25

Добавим функции в заголовочный файл:

-26

Также внесем изменения функцию main:

-27

Начинаем отладку, в результате должен получиться эффект, показанный на видео, а именно изменении переменной в ячейки памяти 5006 изменяется яркость светодиода:

В данной статье более детально разобраны команды необходимые для взаимодействия микроконтроллера и дисплея, проверено считывание и запись данных.

Ссылка на GitHub: https://github.com/VB-Radchenko/DWIN-Project/

По вопросам закупок, технической поддержкой и общим вопросам обращайтесь на электронную почту: Info_dwin@mail.ru

Скидочный купон для официального магазина AliExpress - DWVLPRO

#dwin #hmi #dgus #iot #diy #сенсорная панель