Підключення дисплея 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.c у нас є функція затримки в мікросекундах:

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.

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

Top