Підключення дисплея 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.
Прикріплені файли:
- New_Library_LCD.rar (3024 Кб)