8-900-374-94-44
[email protected]
Slide Image
Меню

Stm32 lcd 1602: Дружим STM32 с LCD дисплеем 1604 по I2C шине (библиотека HAL) / Хабр

LCD display 1602 (16×02) with yellow backlight for connection to Arduino, Stm32, PIC, Esp8266.

  • Microcontrollers
  • LCD display 1602 (16×02) with yellow backlight

Popular

118.90 грн

  • Description
  • Reviews (2)

Description LCD display 1602 (16×02) with yellow backlight

LCD display for connecting to Arduino. Has two lines of 16 characters each. Works with the LiquidCrystal standard library from the Arduino IDE.

Characteristics:
Dimensions 80 x 36mm
Operating temperature 0 ~ 50°C
Backlight yellow
Symbol color black
Symbol size 4. 35 x 2.95mm
Format 16 x 2
Dot size 0.5 x 0.5mm
HD44780 interface

Viewable area 64.5 x 13.8mm
Power supply 5V

Reviews LCD display 1602 (16×02) with yellow backlight

Купил данный дисплей в магазине, дисплей дополнительно упакован в пакетик струну. Что приятней чем когда он весь пыльный. Дисплей проверил, все работает как положено.

Заказывал для зарядного устройства imaxB6 подошёл идеально. Менеджер быстро ответил на заказ с сайта, отправили моментально. Большое спасибо!)

Write a review

Your Name

Rating

Your Review

Related Products

-4% Sale

Popular

-2% Sale

Popular

Popular

Popular

Popular

Popular

Popular

Popular

Popular

Popular

Popular

Popular

Popular

Popular

Heart rate sensor

93. 00 грн

Product Code: Heart rate sensor

Popular

Popular

Popular

Popular

Дисплеи » Хабстаб

Инициализация TFT дисплея OTM8009A.

Ровно пять лет прошло с того момента, как на сайте появилась первая статья, описывавшая инициализацию дисплея. В своих проектах я использовал его не один год и за это время, в продаже появились дисплеи, обладающие лучшими характеристиками. Например, IPS дисплей размером 3.97 дюйма, с разрешением 800×480 пикселей….

Подключение резистивной сенсорной панели c драйвером XPT2046 к STM32 и её калибровка по четырём точкам.

Статей про резистивные сенсорные панели на сайте уже несколько, тут можно почитать как они работают, а тут как подключить её к AVR и произвести калибровку. Поэтому далее рассказ пойдёт лишь о тонкостях работы с такой панелью. Как известно, обмен данными c XPT2046 происходит по SPI, поэтому надо просто найти свободный и подключится к нему. Обычно чтобы посмотреть под какой SPI какие выводы. ..

XPT2046 STM32 TFT

Подключение TFT дисплея по FSMC к STM32, на примере SSD1963 .

Дело было так, один из посетителей сайта выслал мне, в качестве подарка, 5 дюймовый TFT дисплей, который управляется драйвером SSD1963. Дней через десять посылка прибыла, но на коробке, в которую он был упакован, была вмятина, а сам дисплей был разбит. Написал об этом отправителю и он сразу же заказал на моё имя такой же дисплей на ebay, за что ему спасибо. Прошло не более двух недель с момента…

TFT STM32 FSMC SSD1963

Рисование геометрических фигур на TFT дисплее, на примере ILI9341.

Алгоритмы, которые позволяют рисовать геометрические фигуры на TFT дисплее были рассмотрены ранее тут, поэтому в этой стать лишь приведу реализацию функций для ILI9341. Для того чтобы закрасить экран нужным цветом в прошлой статье мы использовали функцию TFT_Fill_Screen(), с помощью этой же функции можно закрасить прямоугольник или квадрат нужного размера, правильно задав координаты рабочей. ..

AVR TFT ILI9341 Atmega16

Вывод символов и строк на TFT дисплей, на примере ILI9341.

В прошлой статье мы рассмотрели как инициализировать TFT дисплей, под управлением драйвера ILI9341, в этой будем учиться выводить символы и строки. Но для начала надо разобраться с одним моментом, если у SSD1289 для вывода точки на дисплей необходимо указать две её координаты и цвет точки, то у ILI9341 указывается 4 координаты, которые ограничивают рабочую область, затем указывается цвет вновь…

ILI9341 AVR Atmega16 TFT

Инициализация TFT дисплея на примере ILI9341 для AVR.

Около года тому назад на сайте появилась статья о том как инициализировать TFT дисплей, под управлением SSD1289, а где-то около месяца назад мне написал один из посетителей сайта. Суть письма была в том, что он заказал дисплей по указанной в статье ссылке, но запустить его не получалось и он предложил этот дисплей и ещё несколько других выслать мне, а я, в свою очередь, должен буду выложить код. ..

TFT ILI9341 AVR Atmega16

Рисуем свой символ на LCD дисплее 1602А.

В прошлых статьях мы рассмотрели как инициализировать и выводить символы на LCD дисплей, пользуясь таблицей знакогенератора(CGROM). Также в прошлых статьях упоминалось про такой вид памяти, как CGRAM, в которой можно хранить собственные символы. Надо сказать, что размер её ограничен и может вмещать до 8 символов. Один из символов, который может пригодиться и которого нет в стандартной таблице…

LCD 1602A CGRAM Atmega16 AVR

Вывод символов и строк на LCD дисплей 1602A, с управляющим контроллером KS0066U.

В прошлой статье мы рассмотрели как произвести инициализацию LCD дисплея по 4-битной шине, но вместо проверки флага занятости, мы использовали задержку. Давайте с его реализации и начнём….

LCD 1602A Atmega16 AVR

Инициализация LCD дисплея 1602A, с управляющим контроллером ks0066U.

Некоторое время лежал без дела вот такой дисплей. И вот появилось желание прикрутить его к одному из проектов на, можно, конечно, постараться найти библиотеку с готовыми функциями, но в таком случае картина, о том как работает дисплей, будет неполная, а нас это не устраивает. Один раз, разобравшись с принципом работы LCD дисплея, не составит большого труда написать свою библиотеку под нужный…

LCD 1602A инициализация Atmega16

Подключение TFT дисплея по FSMC к STM32F103VET6 на примере SSD1289.

Недавно пришла плата с STM32VET6, заказанная на али, и в этой статье мы попробуем подключить к ней TFT дисплей, кстати, на плате предусмотрена отдельная колодка для него. В отличие от Atmega у STM32 для подключения дисплея предусмотрен специальный интерфейс и называется он FSMC, его также называют контроллером внешней памяти.Смысл работы FSMC заключается в следующем, при подключении по FSMC…

TFT SSD1289 FSMC

Вывод картинки на TFT дисплей с SD карты на примере SSD1289.

В прошлой статье мы преобразовали картинку в массив и записали этот массив на SD карточку, теперь давайте попробуем вывести её на TFT дисплей. Для работы с SD карточкой воспользуемся библиотекой Petit FatFs, эта библиотека предназначена для 8-битных микроконтроллеров с малым размером памяти.   Библиотека состоит из 5 файлов: integer.h — заголовочный файл в котором описаны основные типы данных. …

TFT sd card AVR SSD1289

Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

В прошлых статьях мы разбирались с TFT дисплеем и резистивной панелью, для того чтобы освоить все возможности, которые предоставляет модуль, давайте попробуем подключить карту памяти. А именно записать на SD карту картинку и вывести её на дисплей. Забегая немного вперёд, скажу, что размер бинарника картинки(320х240) получился 150К, размер флэша Atmega16 – 16K, а размер оперативки 1K, поэтому как…

TFT sd card lcd-image-converter SSD1289

Как получить координаты точки касания и произвести калибровку резистивной сенсорной панели на примере XPT2046.

В прошлой статье мы рассмотрели как инициализировать контроллер в этой будем разбираться как получить координаты касания и откалибровать сенсорную панель. Перед тем как определять координаты касания его надо зафиксировать, для этой цели воспользуемся специально предназначенным выводом T_IRQ, при касании на этом выводе появляется логический ноль. Хорошо было бы его повесить на ножку, отвечающую за…

XPT2046 SPI калибровка AVR Atmega16 TFT

Как работает резистивный сенсорный экран на примере контроллера XPT2046.

Как известно, на сегодняшний день сенсорные экраны делятся на 2 вида, резистивные и ёмкостные. Главное их отличие для пользователя состоит в том, что резистивный экраны чувствителен к нажатию, а ёмкостной к касанию. Давайте рассмотрим как устроен каждый из них. Резистивный экран представляет собой стеклянный жидкокристаллический дисплей, на который наложена гибкая мембрана. На соприкасающиеся…

XPT2046 SPI инициализация TFT

Рисование геометрических фигур на TFT дисплее, на примере SSD1289.

В прошлой статье мы научились выводить на TFT дисплей символы и строки, в этой будем учиться рисовать геометрические фигуры. Геометрических фигур, которые могут пригодиться при создании графического интерфейса, не так уж много, основные из них, это прямоугольник и круг именно их мы и будем учиться рисовать, в двух вариантах закрашенные и не закрашенные. Скажу сразу, что в статье подробно будут…

SSD1289 геометрические фигуры Atmega16 AVR i8080 TFT

Вывод символов и строк на TFT дисплей, на примере SSD1289.

Первым делом хотелось бы сказать, что у дисплея меньшая сторона — Х, большая сторона — У. В прошлой статье мы рассмотрели как, как произвести инициализацию дисплея, в этой будем учиться выводить на дисплеи символы и строки. Начнём с символов. Символы представляют собой набор точек, закрашенных в определённом порядке. Для вывода на экран точки необходимо выполнить следующую последовательность…

SSD1289 Atmega16 AVR i8080 TFT

Инициализация TFT дисплея на примере SSD1289 для AVR.

На днях пришёл TFT дисплей, управляемый контроллером SSD1289, c резистивной сенсорной панелью на XPT2046 и разъёмом для SD карты, в общем такой. В качестве управляющего микроконтроллера возьмем Atmeg16. Готовые примеры инициализации искать не стал, решил разобраться как он работает и написать свою. Для начала разберёмся с интерфейсом подключения. Общение с контроллером SSD1289 может происходить…

SSD1289 i8080 M6800 Atmega16 AVR TFT

Прыжок#443

Использование ЖК-дисплея 16×2 с платой ARM Cortex-M3 STM32F103C8T6 Blue Pill и программирование Arduino IDE.

Этот проект был подготовлен Наманом Чауханом.

Примечания

Важную роль в обеспечении хорошей связи между человеческим миром и миром машин играют устройства отображения. И поэтому они являются важной частью встраиваемых систем. Блоки отображения — большие или маленькие, работают по одному и тому же основному принципу. Помимо сложных блоков отображения, таких как графические дисплеи и 3D-дисплеи, необходимо уметь работать с простыми дисплеями, такими как блоки 16×1 и 16×2. Блок дисплея 16×1 будет иметь 16 символов и находиться в одной строке. ЖК-дисплей 16×2 будет иметь всего 32 символа, 16 символов в 1-й строке и еще 16 во 2-й строке. Здесь нужно понимать, что в каждом символе 5×10=50 пикселей, поэтому для отображения одного символа все 50 пикселей должны работать вместе.

Но нам не нужно об этом беспокоиться, потому что в блоке дисплея есть еще один контроллер (HD44780), который выполняет работу по управлению пикселями.

В отличие от обычных макетных плат, подключение ЖК-дисплея к ARDUINO довольно просто. Здесь нам не нужно беспокоиться об отправке и получении данных. Нам просто нужно определить номера контактов, и он будет готов к отображению данных на ЖК-дисплее.

Принципиальная схема и объяснение

В LCD 16×2 всего 16 контактов, если есть подсветка, если нет подсветки, то будет 14 контактов. Можно включить или оставить контакты задней подсветки. Теперь в 14 контактах есть 8 контактов данных (7-14 или D0-D7), 2 контакта питания (1 и 2 или VSS и VDD или GND и + 5v), 3-й контакт для управления контрастом (VEE-управляет толщиной символов). ) и 3 контакта управления (RS&RW&E).

В схеме, как вы можете видеть, я взял только два контакта управления, это дает гибкость. Бит контраста и READ/WRITE используются редко, поэтому их можно замкнуть на землю. Это переводит ЖК-дисплей в режим максимальной контрастности и чтения. Нам просто нужно управлять контактами ENABLE и RS, чтобы отправлять символы и данные соответственно.

В LCD 16×2 всего 16 контактов, если есть подсветка, если нет подсветки, то будет 14 контактов. Можно включить или оставить контакты задней подсветки. Теперь в 14 контактах есть 8 контактов данных (7-14 или D0-D7), 2 контакта питания (1 и 2 или VSS и VDD или GND и + 5v), 3-й контакт для управления контрастом (VEE-управляет толщиной символов). ) и 3 контакта управления (RS&RW&E).

В схеме, как вы можете видеть, я взял только два контакта управления, это дает гибкость. Бит контраста и READ/WRITE используются редко, поэтому их можно замкнуть на землю. Это переводит ЖК-дисплей в режим максимальной контрастности и чтения. Нам просто нужно управлять выводами ENABLE и RS для отправки символов и данных соответственно. Как вы можете заметить, в схеме я взял только два управляющих контакта, это дает гибкость. Бит контраста и READ/WRITE используются редко, поэтому их можно замкнуть на землю.

Это переводит ЖК-дисплей в режим максимальной контрастности и чтения. Нам просто нужно управлять контактами ENABLE и RS, чтобы отправлять символы и данные соответственно.

Номер контакта ЖК-дисплея Имя контакта ЖК-дисплея Имя контакта STM32
1 Земля (земля) Заземление (G)
2 ВКЦ
3 ВЭЭ Заземление (G)
4 Выбор регистра (RS) ПБ11
5 ЧТЕНИЕ/ЗАПИСЬ (RW) Заземление (G)
6 Включить (EN) ПБ10
7 Бит данных 0 (DB0) Нет соединения (NC)
8 Бит данных 1 (DB1) Нет соединения (NC)
9 Бит данных 2 (DB2) Нет соединения (NC)
10 Бит данных 3 (DB3) Нет соединения (NC)
11 Бит данных 4 (DB4) ПБ0
12 Бит данных 5 (DB5) ПБ1
13 Бит данных 6 (DB6) ПК13
14 Бит данных 7 (DB7) ПК14
15 Положительный светодиод
16 Светодиод отрицательный Грунт (G)

Загрузка программы на плату STM32F103C8T6

Выполните соединения, как показано на принципиальной схеме, и используйте приведенный ниже код в Arduino IDE.

Перейдите к инструментам и убедитесь, что выбрана правильная доска, как это сделано в руководстве по началу работы. Также перед загрузкой программы убедитесь, что перемычка загрузки 0 установлена ​​на 1 , как показано на рисунке ниже, и нажмите кнопку сброса. При нажатии кнопки загрузки код должен быть загружен, и на ЖК-дисплее отобразится сообщение, как показано на изображении ниже.

Проверка вывода в рабочем режиме

Как обсуждалось в предыдущем абзаце, вы должны заметить вывод, как только код будет загружен. Но эта программа не будет работать при следующем включении платы, так как плата все еще находится в режиме программирования. Таким образом, как только программа загружена, перемычка при загрузке 0 должна быть возвращена в положение 0 , как показано ниже. Также теперь, поскольку программа уже загружена на плату STM32, нам не нужна плата FTDI, и вся установка может питаться от порта micro-USB платы STM32, как показано ниже.

Это просто простой проект сопряжения, который помогает использовать ЖК-дисплей с платой STM32, но в дальнейшем вы можете использовать его для создания интересных проектов. Надеюсь, вы поняли урок и узнали из него что-то полезное. Если вы столкнулись с какой-либо проблемой при его работе, пожалуйста, используйте раздел комментариев, чтобы опубликовать проблему или используйте форумы для других технических вопросов.

Проверочная сборка

Вторая сборка с несколькими вариациями:

  • с использованием Ch440G вместо последовательного интерфейса FTDI
  • Токоограничивающий резистор 220 Ом добавлен к линиям питания светодиодов

Все хорошо:

Кредиты и ссылки

  • ARM Cortex-M3 STM32F103C8T6 Минимальная системная отладочная плата STM32 — пример у продавца на aliexpress
  • STM32F103C8 Информация о продукте и техническое описание

Библиотека HD44780 для STM32 — AdAstra-Soft

Как эффективно использовать дисплей на основе HD44780 с микроконтроллером STM32?

ЖК-дисплеи 1602 очень распространены и недороги. Они основаны на контроллере, совместимом с почтенным HD44780, который очень прост в использовании.
Как эффективно использовать дисплей на базе HD44780 с микроконтроллером STM32, например Blue Pill или Black Pill?

Дисплей на базе HD44780 имеет ряд преимуществ:

  • Очень дешевый
  • Очень прост в использовании

Он также имеет некоторые недостатки:

  • Использует много контактов: от 7 до 11
  • Медленно

Как свести к минимуму эти недостатки, используя особенности микроконтроллеров STM32?


Медлительность

Инструкции, выполняемые контроллером, имеют переменную длительность, и в это время к контроллеру обращаться не следует. Во многих реализациях после каждой команды добавляется фиксированная задержка, чтобы учесть это.
Однако контроллер имеет флаг BUSY на контакте D7, который можно прочитать, чтобы свести время ожидания к минимуму. С другой стороны, STM32 позволяет легко переключать режим ввода/вывода вывода. Поэтому мы будем использовать эту функцию для чтения флага BUSY контроллера после каждой команды, чтобы минимизировать время между двумя командами.

Прямой доступ к регистрам GPIO прост на STM32, поэтому используется прямой доступ к регистрам MCU. Это позволяет избежать использования тяжелых и медленных библиотек, таких как HAL.


Контакты, используемые дисплеем

Сначала количество контактов

Контроллер позволяет использовать 6, 7 или 11 контактов. Использование 11 контактов (с 8-битной шиной данных) более эффективно, чем использование 4-битной шины данных. Однако выигрыш минимален по сравнению со временем обработки каждой команды контроллером: примерно 37 мкс. Кроме того, количество контактов, доступных на MCU, ограничено. Таким образом, мы будем использовать 7 контактов:

  • RS: данные/команда
  • WR: чтение флага BUSY
  • E : Строб
  • D4-D7 : Шина данных

Какие контакты STM32 использовать?

Для команд (RS, WR, E) нет проблем: они используются независимо и поэтому могут быть назначены любому GPIO MCU.

Для шины данных может возникнуть соблазн использовать 4 смежных контакта на одном и том же порту GPIO. Но это очень ограничительно:
1) все контакты MCU имеют несколько функций, и редко можно иметь 4 смежных свободных контакта.
2) Вы должны иметь возможность размещать данные на этих выводах атомарно.

Последний пункт относится к многозадачным приложениям или процедурам прерывания. Вы не можете читать/изменять/записывать порты GPIO. Вот почему порты GPIO имеют регистры BSRR и BRR, которые позволяют атомарно устанавливать 1 или 0 пин.

Поскольку было согласовано установить контакты в 0 или 1 независимо друг от друга с помощью регистров BSRR и BRR, больше нет ограничений на расположение битов данных в GPIO.

Таким образом, все контакты на дисплее могут быть подключены к любым неиспользуемым контактам на MCU.


Как это сделать?

Вы должны указать используемые контакты, например:

// Определите выводы, измените эти определения в соответствии с вашей проводкой
#define RS_PORT GPIOA
# определить RS_PIN 10
#define RW_PORT GPIOC
# определить RW_PIN 4
#define E_PORT GPIOB
# определить E_PIN 5
#define D4_PORT GPIOB
# определить D4_PIN 13
#define D5_PORT GPIOB
# определить D5_PIN 15
#define D6_PORT GPIOB
# определить D6_PIN 14
#define D7_PORT GPIOB
# определить D7_PIN 10
 


Затем вы должны объявить макросы, которые будут позиционировать контакты в 0 или 1.
Макросы используются для генерации встроенного кода, и они слишком просты, чтобы оправдать встроенные функции. Эти объявления не зависят от используемой модели STM32.

На самом деле эти объявления немного сложнее для STM32F4. В этом семействе нет регистра BRR. Реальная история: BRR и BSRR — 16-битные регистры, но stm32f4xx.h определяет их как один 32-битный регистр. Вздох…

#define rsSet() RS_PORT->BSRR = (1u << RS_PIN)
#define rsClear() RS_PORT->BRR = (1u << RS_PIN)
#define rwSet() RW_PORT->BSRR = (1u << RW_PIN)
#define rwClear() RW_PORT->BRR = (1u << RW_PIN)
#define eSet() E_PORT->BSRR = (1u << E_PIN)
#define eClear() E_PORT->BRR = (1u << E_PIN)
#define d4Set() D4_PORT->BSRR = (1u << D4_PIN)
#define d4Clear() D4_PORT->BRR = (1u << D4_PIN)
#define d5Set() D5_PORT->BSRR = (1u << D5_PIN)
#define d5Clear() D5_PORT->BRR = (1u << D5_PIN)
#define d6Set() D6_PORT->BSRR = (1u << D6_PIN)
#define d6Clear() D6_PORT->BRR = (1u << D6_PIN)
#define d7Set() D7_PORT->BSRR = (1u << D7_PIN)
#define d7Clear() D7_PORT->BRR = (1u << D7_PIN)
 


С помощью этих определений легко управлять состояниями контактов. Например, чтобы отправить команду контроллеру, которая требует генерации импульса на контакте E:

//------------------------------------------------ ------------
// Генерируем E-импульс
статическая пустота ePulse (пустота)
{
bspDelayUs (1) ; // Для настройки данных
eSet () ;
bspDelayUs (1) ;
eОчистить () ;
}
//------------------------------------------------ ------------
// Отправляем команду на LCD
статическая пустота hdCmd (uint8_t cc)
{
setDataPort (cc >> 4) ; // Получить старший полубайт
rsClear () ; // Установить ЖК-дисплей в режим инструкций
ePulse () ; // Э строб
setDataPort (cc) ; // Получить младший полубайт
ePulse () ; // Э строб
hdWaitForBusy () ;
}
 


Функция setDataPort(), позволяющая записать полубайт в порт данных D7-D4, едва ли сложнее. Функция не такая медленная: около 1 мкс на STM32F103 при 72 МГц.

// Устанавливаем младший полубайт данных в порт вывода данных
static void setDataPort (данные uint32_t)
{
если ((данные и 0x08u) == 0u)
d7Очистить ()
иначе d7Set ()
если ((данные и 0x04u) == 0u)
d6Очистить ()
иначе d6Set ()
если ((данные и 0x02u) == 0u)
d5Очистить ()
иначе d5Set ()
если ((данные и 0x01u) == 0u)
d4Очистить ()
иначе d4Set ()
}
 


Последняя сложная функция — инициализация контактов GPIO и ЖК-дисплея:

// Инициализируем ЖК-устройство
недействительным hdInit (недействительным)
{
// Инициализируем порты GPIO
hdGpioInit (RS_PORT, RS_PIN) ;
hdGpioInit (RW_PORT, RW_PIN) ;
hdGpioInit (E_PORT, E_PIN) ;
hdGpioInit (D4_PORT, D4_PIN) ;
hdGpioInit (D5_PORT, D5_PIN) ;
hdGpioInit (D6_PORT, D6_PIN) ;
hdGpioInit (D7_PORT, D7_PIN) ;
// Сброс HD44780
rsClear () ;
RWClear () ;
bspDelayUs (40000) ; // Мин.  40 мс
setDataPort (0x03u) ;
ePulse () ;
bspDelayUs (6000) ; // Мин. 5 мс
setDataPort (0x03u) ;
ePulse () ;
bspDelayUs (200) ; // Мин. 100 мкс
setDataPort (0x03u) ;
ePulse () ;
bspDelayUs (200) ;
setDataPort (0x02u) ; // Включить 4-битный режим
ePulse () ;
hdWaitForBusy () ;
hdCmd (0x28) ; // Установить длину интерфейса: 4 бита, 2 строки, шрифт 5x7
hdCmd (0x08) ; // Дисплей выключен
hdCmd (0x01) ; // Очистить дисплей
hdCtrl = 0x0Cu ; // Дисплей включен, курсор выключен, не мигает
hdCmd (hdCtrl) ;
hdCmd (0x06) ; // Режим ввода: перемещать курсор после каждого данных
}
 


Уже показанные функции используют функции, характерные для используемой модели STM32. В частности, вы должны иметь возможность настроить D7 как выход, а также как вход, чтобы иметь возможность считывать флаг BUSY HD44780. Для STM32F103 это дает:

//------------------------------------------------ ------------
// Должен быть адаптирован к вашему MCU
// Для микроконтроллера STM32F1xx
#define MODE_IN 0x04u
#define MODE_OUT 0x02u
#define MODE_MASK 0x0Fu
//------------------------------------------------ ------------
// Настраиваем контакты GPIO для вывода
статическая пустота hdGpioInit (GPIO_TypeDef * pGpio, вывод uint32_t)
{
// Включить часы порта (без арифметики указателя. ..)
RCC->APB1ENR |= 1u << ((((uint32_t) pGpio - (uint32_t) GPIOA) / ((uint32_t) GPIOB - (uint32_t) GPIOA)) + RCC_APB2ENR_IOPAEN_Pos) ;
// Инициализировать GPIO как выход
если (вывод <8)
{
pGpio->CRL = (pGpio->CRL & ~(MODE_MASK << (pin * 4))) | (MODE_OUT << (вывод * 4));
}
еще
{
pGpio->CRH = (pGpio->CRH & ~(MODE_MASK << ((pin - 8) * 4))) | (MODE_OUT << ((вывод - 8) * 4)) ;
}
}
//------------------------------------------------ ------------
// Чтобы переключить D7 на вход, позволяет проверить флаг занятости HD44780.
__ALWAYS_STATIC_INLINE недействительным d7IsInput (недействительным)
{
#если (D7_PIN < 8)
{
D7_PORT->CRL = (D7_PORT->CRL & ~(MODE_MASK << (D7_PIN * 4))) | (MODE_IN << (D7_PIN * 4)) ;
}
#еще
{
D7_PORT->CRH = (D7_PORT->CRH & ~(MODE_MASK << ((D7_PIN - 8) * 4))) | (MODE_IN << ((D7_PIN - 8) * 4)) ;
}
#endif
}
//------------------------------------------------ ------------
// Чтобы переключить D7 на выход
__ALWAYS_STATIC_INLINE недействительным d7IsOutput (недействительным)
{
#если (D7_PIN < 8)
{
D7_PORT->CRL = (D7_PORT->CRL & ~(MODE_MASK << (D7_PIN * 4))) | (MODE_OUT << (D7_PIN * 4)) ;
}
#еще
{
D7_PORT->CRH = (D7_PORT->CRH & ~(MODE_MASK << ((D7_PIN - 8) * 4))) | (MODE_OUT << ((D7_PIN - 8) * 4)) ;
}
#endif
}
 

Инициализация GPIO немного сложнее на F4, который использует 5 регистров вместо 1.

Когда все это определено, очень легко реализовать пользовательский API, например:

// очистить ЖК-дисплей
недействительным hdClear (недействительным)
{
hdCmd (1) ;
}
 


Задержки

Мы можем заметить, что некоторые функции используют задержки в несколько микросекунд. Функция AdAstra-RTK BSP для создания таких задержек:

// Позволяет занятому ждать задержки в десятки микросекунд
// Заставить уровень оптимизации быть независимым от общей настройки
// ВНИМАНИЕ: при низкой частоте ядра задержка в 1 мкс может быть невозможна
#если определено(__CC_ARM)
# прагма пуш
#прагма Отиме
#еще
#pragma GCC push_options
#pragma Оптимизация GCC ("O3")
#endif
пустота bspDelayUs (uint32_t нас)
{
volatile uint32_t start = DWT->CYCCNT ;
volatile uint32_t cycles = (bspTsMhzDiv * us) - 42u ; // Удаляем несколько циклов для инструкций
while ((DWT->CYCCNT - начало) < циклы) ;
}
#если определено(__CC_ARM)
#прагма поп
#еще
#pragma GCC pop_options
#endif
 


Заключение

Вот эффективная реализация библиотеки 1602 для stm32 или синей таблеточной доски.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *