STM Урок 11. HAL. Статическая индикация

 

 

 

 

Урок 11

HAL. Статическая индикация

 

 

Сегодня мы попробуем подключить семисегментный светодиодный индикатор к контроллеру STM32 с помощью библиотеки HAL. Мы уже подключали такой индикатор к микроконтроллеру AVR, пришло время попробовать проделать такое и с контроллером STM. Я думаю, сложностей у нас в этом никаких не возникнет.

Семисегментный светодиодный индикатор — это свокупность светодиодных сегментов, расположенных в определённом порядке

 

image06-3

 

Как мы видим, индикатор данный вовсе и не семисегментный, а восьми. Сегменты принято обозначать латинскими буквами в алфавитном порядке, а точку — символами dp.

Подключать мы будем наш индикатор вот таким вот образом (нажмите на кнопку для увеличения изображения)

 

image03_0500

 

Не забываем также использовать резисторы для обеспечения ограничения тока через ножки портов. Так как у меня индикатор с общим анодом, то общий провод был подключен к ножке питания 3,3 вольта.

А вот как всё это выглядит практически

 

image04

 

Назначение ножек на моём индикаторе, то есть на том, который я подключал следующее

 

image02

 

Также как и раньше проект создаем из самого первого (TEST001), называем его LED_STAT

Запускаем куб, отключаем все порты, включаем на выход порты PE7-PE15.

 

image01

 

В настройках в 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 */

 

Соберём код, прошьём контроллер и посмотрим результат (в видеоверсии конечно это смотрится намного динамичнее)

 

image05

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

Отладочную плату и индикаторы можно приобрести здесь:

STM32F4-DISCOVERY

Семисегментный одноразрядный индикатор красный с общим анодом 10 шт

 

 

STM32 HAL. Статическая индикация

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*