Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на май 2024 г.
1. 1000 руб
Сайт Паяльник

Реклама ⓘ

Подключение дисплея HD44780 к STM32 в CubeIDE (HAL)

Многих новичков в программировании микроконтроллеров STM32 отпугивает огромное разнообразие регистров и настроек периферии. Поэтому они продолжают довольствоваться платформой Arduino. Для исправления этой ситуации компания ST Microelectronics создала библиотеку HAL, которая позволяет абстрагироваться от уровня регистров и тратить на настройку периферии минимальное время. Изначально HAL работала с таким генератором кода как CubeMX. И вот недавно компания выпустила свою собственную полноценную среду разработки CubeIDE. Она является объединением генератора кода CubeMX и среды разработки Atollic TrueStudio. Теперь мы можем быстро сконфигурировать проект, настроить тактирование, выполнить начальную инициализацию требуемой периферии и уже заниматься разработкой проекта. В ходе работы мы можем изменять начальные настройки проекта сколько угодно раз, и при этом не затрагивать написанный вами код. 

И в данной статье мы рассмотрим, как подключить к нашему проекту в CubeIDE популярный у радиолюбителей символьный дисплей HD44780. Для написания библиотеки за основу была взята библиотека на основе SPL из этой статьи. Стоит отметить, что библиотека получилась кросс-платформенной, ее легко можно портировать под любые микроконтроллеры, необходимо только настроить порты ввода\вывода на выход и в директивах #define файла hd44780.h прописать функции сброса/установки пинов, к которым подключен дисплей.

Давайте создадим наш новый проект и настроим его. Работаю я с микроконтроллером STM32F103R6, программатором ST-Link, кварц у меня на 16 МГц. В первую очередь включим на пинах интерфейс SWD, если этого не сделать, программатор ST-Link не будет виден после прошивки. Во вкладке System Core->SYS->Debug выберем Serial Wire.

Подключим к микроконтроллеру наш кварц. Во вкладке System Core->RCC->HSE выбираем Crystal/Ceramic Resonator.

Теперь можно и тактирование настроить, частота кварца умножается на 4 и раздается по остальным шинам.

Теперь добавим в проект два файла библиотеки hd44780.h и hd44780.c . Перетаскиваем эти файлы в папки Core->Inc и Core->Src, таким образом они подключатся к проекту. И не забываем в main.c прописать #include "hd44780.h"

В файле hd44780.с у нас имеется функция задержки в микросекундах:

void _delay_us(int us)
{

	HAL_TIM_Base_Start(&htim2);
	__HAL_TIM_SET_COUNTER(&htim2,0);
	while(__HAL_TIM_GET_COUNTER(&htim2) < us);
	HAL_TIM_Base_Stop(&htim2);
}

Она завязана с работой таймера. Для её функционирования необходимо настроить таймер на частоту 1 МГц. У нас в проекте частота шины, на которой находится таймер, 64 МГц, в настройке нужно выбрать делитель 64. Во вкладке Timer->TIM2->Clock Source выбираем Internal Clock. В поле Prescaler вводим 64 (на скриншоте ошибка), в Counter Period 65000.

Теперь нам остается только настроить пины, к которым мы хотим подключить дисплей. Заходим в hd44780.h и переопределяем наши пины.

#define PORT_SIG GPIOB

#define RS GPIO_PIN_0
#define RW GPIO_PIN_1
#define EN GPIO_PIN_2

#define PORT_DATA GPIOC

#define DB4 GPIO_PIN_6
#define DB5 GPIO_PIN_7
#define DB6 GPIO_PIN_8
#define DB7 GPIO_PIN_9

В генераторе кода те же самые пины настраиваем на выход и нажимаем на значок генерации кода(Device Configuration Tool Code Generation).

Функции библиотеки остались точно такие же, как и в статье, на которую я ссылался. Добавлена поддержка кириллицы. Для корректной работы кириллицы нужно изменить кодировку в самой IDE. Во вкладке Window->Preferences->General->Workspace необходимо выбрать кодировку CP1251. Напечатать необходимо вручную, по другому настройка сбивается.

Напишем что-нибудь в main.c и проверим работу дисплея:

  /* USER CODE BEGIN 2 */
  lcd_init();
  lcd_clear();
  lcd_set_xy(0, 0);
  lcd_out("Привет");
  /* USER CODE END 2 */

Как видите, всё работает.

На этом у меня всё. К статье прилагается проект для STM32CubeIDE.

Прикрепленные файлы:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (13) | Я собрал (0) | Подписаться

+1
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
влад #
Прикольный дисплей, кириллицу нативно поддерживает. Мне вот чтобы кириллические символы выводит, надо их коды из таблицы символов подставлять.
Ответить
0

[Автор]
RioDeJaneiro #
Как раз таки и попался дисплей, где коды русских символов из таблицы брать надо. Пришлось нагородить в этой библиотеке конструкцию switch...case, чтобы выводить кириллицу
Ответить
0
ashelehov #
Можете скинуть ссылку на дисплей с поддержкой кириллицы?
Ответить
+1

[Автор]
RioDeJaneiro #
Не я покупал его, на работе уже предоставили. Российский дисплей mt-20s4m-2ylg-3v0
Ответить
0
Shahter #
Какая конфигурация пинов дисплея?
Ответить
0

[Автор]
RioDeJaneiro #
Output Push Pull, скорость самая низкая, на выходах нули изначально выставлены
Отредактирован 04.06.2020 08:07
Ответить
0
Shahter #
А как вывести переменную?
Ответить
0

[Автор]
RioDeJaneiro #
Дисплей выводит символы, в функцию lcd out нужно подставлять массив символов(она же строка). Чтобы вывести int или float нужно преобразовать их в строку. Делается это функцией sprintf. Это функция из стандартных библиотек СИ. Например:
int a=15;
char buff[]; // строка куда мы закинем переменную
****
lcd_init();
lcd_clear();
lcd_set_xy(0, 0);
sprintf(buff,"%d",a); // заносим переменную a в строку buff
lcd_out(buff);
Подробнее вот статья: http://we.easyelectronics.ru/Soft/formatnyy-vyvod-na-si-dlya-mikrokontrollerov.html
Отредактирован 06.06.2020 12:18
Ответить
0
Shahter #
Спасибо большое!
Ответить
0
Юрий #
А как вывести свой символ?
Ответить
0

[Автор]
RioDeJaneiro #
Если посмотреть на таблицу символов у дисплея, то у моего дисплея оказалось выделено 8 ячеек для пользовательских символов по адресам с 0 по 7.
Создаем массив типа uint8_t user[8]={255,255,255,255,255,255,255,255};
И загружаем в дисплей по адресу 0 например:
lcd_set_user_char(0, &user);
Теперь по адресу 0 в дисплее у нас свой символ и можем выводить его:
lcd_send(0, DATA);
И для создания символа можно пользоваться генераторами символов вроде такого https://radioaktiv.ru/custom_character_generator_for_hd44780.html
Ответить
0
Даниил #
Здравствуйте, спасибо большое, всё работает. А как выводить данные на вторую строку?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Макетная плата для пайки (10 шт) Мини гравер 125 Ватт
вверх