Урок 11
HAL. Статическая индикация
Сегодня мы попробуем подключить семисегментный светодиодный индикатор к контроллеру STM32 с помощью библиотеки HAL. Мы уже подключали такой индикатор к микроконтроллеру AVR, пришло время попробовать проделать такое и с контроллером STM. Я думаю, сложностей у нас в этом никаких не возникнет.
Семисегментный светодиодный индикатор — это свокупность светодиодных сегментов, расположенных в определённом порядке
Как мы видим, индикатор данный вовсе и не семисегментный, а восьми. Сегменты принято обозначать латинскими буквами в алфавитном порядке, а точку — символами dp.
Подключать мы будем наш индикатор вот таким вот образом (нажмите на кнопку для увеличения изображения)
Не забываем также использовать резисторы для обеспечения ограничения тока через ножки портов. Так как у меня индикатор с общим анодом, то общий провод был подключен к ножке питания 3,3 вольта.
А вот как всё это выглядит практически
Назначение ножек на моём индикаторе, то есть на том, который я подключал следующее
Также как и раньше проект создаем из самого первого (TEST001), называем его LED_STAT
Запускаем куб, отключаем все порты, включаем на выход порты PE7-PE15.
В настройках в Configuration вообще ничего не трогаем.
Генерируем проект.
Создаем и добавляем файлы main.h, led.h, led.c
В main.h и led.c подключаем
#include «led.h»
в main.c
#include «main.h»
в led.h
#include «stm32f4xx_hal.h»
#include «main.h»
В файл led.h пишем дефайны (или макросы) для сегментов, чтобы затем было удобнее с ними работать в коде
#define SA GPIO_PIN_7
#define SB GPIO_PIN_8
#define SC GPIO_PIN_9
#define SD GPIO_PIN_10
#define SE GPIO_PIN_11
#define SF GPIO_PIN_12
#define SG GPIO_PIN_13
#define SH GPIO_PIN_14
#define SA_SET HAL_GPIO_WritePin(GPIOE, SA, GPIO_PIN_RESET)
#define SA_RESET HAL_GPIO_WritePin(GPIOE, SA, GPIO_PIN_SET)
#define SB_SET HAL_GPIO_WritePin(GPIOE, SB, GPIO_PIN_RESET)
#define SB_RESET HAL_GPIO_WritePin(GPIOE, SB, GPIO_PIN_SET)
#define SC_SET HAL_GPIO_WritePin(GPIOE, SC, GPIO_PIN_RESET)
#define SC_RESET HAL_GPIO_WritePin(GPIOE, SC, GPIO_PIN_SET)
#define SD_SET HAL_GPIO_WritePin(GPIOE, SD, GPIO_PIN_RESET)
#define SD_RESET HAL_GPIO_WritePin(GPIOE, SD, GPIO_PIN_SET)
#define SE_SET HAL_GPIO_WritePin(GPIOE, SE, GPIO_PIN_RESET)
#define SE_RESET HAL_GPIO_WritePin(GPIOE, SE, GPIO_PIN_SET)
#define SF_SET HAL_GPIO_WritePin(GPIOE, SF, GPIO_PIN_RESET)
#define SF_RESET HAL_GPIO_WritePin(GPIOE, SF, GPIO_PIN_SET)
#define SG_SET HAL_GPIO_WritePin(GPIOE, SG, GPIO_PIN_RESET)
#define SG_RESET HAL_GPIO_WritePin(GPIOE, SG, GPIO_PIN_SET)
#define SH_SET HAL_GPIO_WritePin(GPIOE, SH, GPIO_PIN_RESET)
#define SH_RESET HAL_GPIO_WritePin(GPIOE, SH, GPIO_PIN_SET)
В led.c пишем функцию для вывода цифр на индикатор.
Код для каждой ножки пишется с тем условием, что сегмент будет светиться в том случае, если на данной ножке будет низкий уровень, а если будет высокий — то не будет
void segchar (uint8_t seg)
{
switch (seg)
{
case 1:
SA_RESET;SB_SET;SC_SET;SD_RESET;SE_RESET;SF_RESET;SG_RESET;SH_RESET;
break;
case 2:
SA_SET;SB_SET;SC_RESET;SD_SET;SE_SET;SF_RESET;SG_SET;SH_RESET;
break;
case 3:
SA_SET;SB_SET;SC_SET;SD_SET;SE_RESET;SF_RESET;SG_SET;SH_RESET;
break;
case 4:
SA_RESET;SB_SET;SC_SET;SD_RESET;SE_RESET;SF_SET;SG_SET;SH_RESET;
break;
case 5:
SA_SET;SB_RESET;SC_SET;SD_SET;SE_RESET;SF_SET;SG_SET;SH_RESET;
break;
case 6:
SA_SET;SB_RESET;SC_SET;SD_SET;SE_SET;SF_SET;SG_SET;SH_RESET;
break;
case 7:
SA_SET;SB_SET;SC_SET;SD_RESET;SE_RESET;SF_RESET;SG_RESET;SH_RESET;
break;
case 8:
SA_SET;SB_SET;SC_SET;SD_SET;SE_SET;SF_SET;SG_SET;SH_RESET;
break;
case 9:
SA_SET;SB_SET;SC_SET;SD_SET;SE_RESET;SF_SET;SG_SET;SH_RESET;
break;
case 0:
SA_SET;SB_SET;SC_SET;SD_SET;SE_SET;SF_SET;SG_RESET;SH_RESET;
break;
}
}
Пишем для нее прототип в led.h
void segchar (uint8_t seg);
В главный модуль main.c в функцию main() добавляем код для того чтобы на старте индикатор не светился
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14,
GPIO_PIN_SET);
/* USER CODE END 2 */
Также в main() добавим переменную для счёта
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t i=0;
/* USER CODE END 1 */
Также добавив код для счёта в бесконечный цикл
while (1)
{
for(i=0;i<10;i++)
{
segchar(i);
HAL_Delay(1000);
}
/* USER CODE END WHILE */
Соберём код, прошьём контроллер и посмотрим результат (в видеоверсии конечно это смотрится намного динамичнее)
Предыдущий урок Программирование МК STM32 Следующий урок
Отладочную плату можно приобрести здесь STM32F4-DISCOVERY
Семисегментный одноразрядный индикатор красный (с общим анодом или катодом на выбор) 10 шт
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий