Многих новичков в программировании микроконтроллеров 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.
Прикрепленные файлы:
- New_Library_LCD.rar (3024 Кб)
Комментарии (13) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
[Автор]
[Автор]
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
[Автор]
Создаем массив типа 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