Драйвер ЖКИ на базе контроллера HD44780 для STM32


Контроллер HD44780 фирмы Hitachi фактически является промышленным стандартом и широко применяется при производстве алфавитно-цифровых ЖКИ модулей. Аналоги этого контроллера или совместимые с ним по интерфейсу и командному языку микросхемы, выпускают множество фирм, среди которых: Epson, Toshiba, Sanyo, Samsung, Philips. Еще большее число фирм производят ЖКИ-модули на базе данных контроллеров. Эти модули можно встретить в самых разнообразных устройствах: измерительных приборах, медицинском оборудовании, промышленнном и технологическом оборудовании, офисной технике, телефонах, факсимильных и копировальных аппаратах.

Алфавитно-цифровые ЖКИ-модули представляют собой недорогое и удобное решение, позволяющее сэкономить время и ресурсы при разработке новых изделий, при этом обеспечивают отображение большого объема информации при хорошей различимости и низком энергопотреблении. Возможность оснащения ЖКИ-модулей задней подсветкой позволяет эксплуатировать их в условиях с пониженной или нулевой освещенностью, а исполнение с расширенным диапазоном температур (-20°С ... +70°С) в сложных эксплуатационных условиях, в том числе в переносной, полевой и даже, иногда, в бортовой аппаратуре.

Контроллер HD44780 потенциально может управлять 2-мя строками по 40 символов в каждой (для модулей с 4-мя строками по 40 символов используются два однотипных контроллера), при матрице символа 5 х 7 точек. Контроллера также поддерживает символы с матрицей 5 х 10 точек.

Осознавая широкую популярность таких дисплеев мы приняли решение разработать и открыть для инженерного сообщества драйвер HD44780 для инновационных микроконтроллеров STM32.

Технические подробности

Драйвер написан на языке C++ и требует использование библиотеки STM32 Standard Peripherals Library v3.3.0. Чтобы упростить освоение и сделать код понятным для тех кто программирует на C мы использовали минимум возможностей языка C++.

Мы постарались сделать код максимально компактным и внедрить только самую необходиму функциональность.

Драйвер содержит конвейер задач на базе очереди из статического буфера. Задачи представляют собой команду печати символа либо команду чтения BF и AC. Функциональность по чтению и определению собственных символов в версии 1.0 не реализована.

Для подключения используется интерфейс шириной 4 бита.

Драйвер распространяется бесплатно по лицензии GNU Lesser General Public License v3.

Как использовать

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

1. Проверьте соответствие настроек в файле stm32f10x.h используемому вами семейству микроконтроллеров STM32

/* Uncomment the line below according to the target STM32 device used in your
 application */
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
/* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
/* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */
/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
/* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
/* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
/* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
#define STM32F10X_CL /*!< STM32F10X_CL: STM32 Connectivity line devices */
 #endif

Семейство Connectivity line определено по умолчанию.

2. Проверьте базовые настройки драйвера в файле HD44780.cpp

/* Basic LCD Driver settings */
#define LCD_PROCESS_IO_FREQ 10000
#define FIFO_SIZE 100
/* Define for boot from Flash */
#define FLASH_BOOT

LCD_PROCESS_IO_FREQ обозначает количество вызовов метода для обработки сигналов ввода-вывода. Для вывода на дисплей одного символа необходимо 11 вызовов. Соответственно если необходимо печатать, например, 10 экранов в секунду и размер ЖКИ составляет 20x4 символа то LCD_PROCESS_IO_FREQ = 11 x 10 x 20 x 4 = 8800 вызовов/секунду или более. Если использованное вами значение приводит к прекращению прерываний, проверьте вычисляемое значение счетчика в TIM_Config(), оно должно находится впределах от  0 до 65535, используйте пред. делитель если вычисляемое значение выходит за пределы допустимого.

FIFO_SIZE для такого примера должен составить не меньше 20 x 4 + 10 для избежания ошибок при выводе полного экрана за один раз.

3. Проверьте определение экземпляра HD44780 в main.h

HD44780 lcd(GPIOE, GPIO_Pin_9, GPIOE, GPIO_Pin_8,
                      GPIOE, GPIO_Pin_11, GPIOE, GPIO_Pin_10,
                      GPIOE, GPIO_Pin_13, GPIOE, GPIO_Pin_12,
                      GPIOE, GPIO_Pin_15, 20, 0x00, 0x40, 0x14, 0x54);

Укажите выводы, ширину строки и адреса первых символов в соответствии с вашим аппаратным решением.

4. Мы использовали TIM2 для вызова функции обработки ввода вывода. Вы можете изменить NVIC_Config(), TIM_Config() в файле HD44780.cpp и обработчик прерывания в файле stm32f10x_it.c для использования другого таймера

5. Наслаждайтесь!

Здраствуйте. Тестировал ваш драйвер на отладочной плате TE-STM32F107. Первое для работы драйвера потребовалось реконфигурорвать выходы ( В функции HD44780::outConfig сменить  GPIO_Mode_Out_OD на GPIO_Mode_Out_PP). При циклическом выводе, на 32-м выводе  возникает ошибка HardFault.

Добрый день,

Безусловно входы и выходы драйвера необходимо сначала сконфигурировать в соответствии с вашей платой и схемой подключения дисплея.

К сожалению не ясно какой именно вывод вы имеете в виду и какой контроллер используете. Но необходимо заметить, что мы использовали этот драйвер в ряде устройств с разными схемами включения и на различных чипах (в т.ч. и NXP LPC1xxx), ошибки подобной вашей у нас не возникало, релиз драйвера считается стабильным.

Добавить в Закладки

Bookmark Website 
Bookmark Page