Подключение дисплея 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.