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



 

Урок 24

 

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

 

На прошлом уроке мы подключили посредством шины SPI микросхему 74HC595, являющуюся сдвиговым регистром.

Сегодня мы с помощью данной микросхемы попробуем уже поуправлять семисегментным светодиодным индикатором с общим анодом.

Вот распиновка данного индикатора

 

Image00

 

А вот это схема подключения (нажмите на картинку для увеличения изображения)

 

Image01_500

 

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

 

 

А вот так у нас подключено всё на практике

 

Image02

 

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

Проект создаём из предыдущего проекта SPI595, называем его SPI_595_LED.

Из проекта LED_STAT скопируем файлы led.c и led.h в соответствующие директории.

Запускаем Cube. Вообще ничего там не делаем, генерируем и открываем проект в Keil.

Переходим в проект. Подключаем файл led.c и настраиваем программатор.

Соберём проект.

Подключим led.h в main.h

 

#include «stm32f4xx_hal.h»

#include «led.h»

 

В функции main() исправим строчки следующим образом, так как у нас всё перевёрнуто, и чтобы погасить светодиоды, нам нужно наоборот подать на все выходы единицы

 

        cs_set();

        aTxBuffer[0]=0x01;

        HAL_SPI_Transmit (&hspi3, (uint8_t*)aTxBuffer, 1, 5000);

        cs_strob();

        HAL_Delay(1000);

        aTxBuffer[0]=0xFF;

        HAL_SPI_Transmit (&hspi3, (uint8_t*)aTxBuffer, 1, 5000);

        cs_strob();

        HAL_Delay(200);

 

 

В бесконечном цикле следующим образом исправляем цикл

 

  /* USER CODE BEGIN WHILE */

  while (1)

  {

                for(i=0;i<=9;i++)

                {

                        segchar(i);

                        HAL_Delay(1000);

                }

  /* USER CODE END WHILE */

 

Основные исправления коснутся библиотеки led. Поэтому перейдём в файл led.h

Вот это убираем совсем

 

#include «main.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);

 

Из следующих 16 строчек уберём первым делом точку с запятой, мы её ставить будем в вызовах.

В файл led.c добавим следующие переменные (первые две можно скопировать из файла main.c)

 

#include «led.h»

 

extern uint8_t aTxBuffer[1];

extern SPI_HandleTypeDef hspi3;

uint8_t portseg=0;

 

Переменная portseg нам нужна для хранения состояния выходного порта нашей микросхемы, которое мы никак не отслеживаем, а будем просто запоминать.

Также копируем из файла main.c вот эти строчки и всатвляем их в led.c

 

uint8_t portseg=0;

 

#define cs_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET)

#define cs_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_SET)

#define cs_strob() cs_reset();cs_set()

 

void segchar (uint8_t seg)

 

Вернёмся в led.h.

Исправим сначала первую строку, часть кода можно взять из main.c

 

#define SA_SET aTxBuffer[0]=portseg&=~0x01;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SA_RESET HAL_GPIO_WritePin(GPIOE, SA, GPIO_PIN_SET);

 

Теперь сделаем вторую строку, скопировав код из первой, слегка его преобразовав

 

#define SA_RESET aTxBuffer[0]=portseg|=0x01;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

Теперь код из данных строчек перенесём в остальные 14 строчек, изменив только бит в portseg

#define SB_SET aTxBuffer[0]=portseg&=~0x02;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SB_RESET aTxBuffer[0]=portseg|=0x02;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SC_SET aTxBuffer[0]=portseg&=~0x04;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SC_RESET aTxBuffer[0]=portseg|=0x04;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SD_SET aTxBuffer[0]=portseg&=~0x08;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SD_RESET aTxBuffer[0]=portseg|=0x08;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SE_SET aTxBuffer[0]=portseg&=~0x10;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SE_RESET aTxBuffer[0]=portseg|=0x10;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SF_SET aTxBuffer[0]=portseg&=~0x20;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SF_RESET aTxBuffer[0]=portseg|=0x20;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SG_SET aTxBuffer[0]=portseg&=~0x40;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SG_RESET aTxBuffer[0]=portseg|=0x40;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SH_SET aTxBuffer[0]=portseg&=~0x80;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

#define SH_RESET aTxBuffer[0]=portseg|=0x80;HAL_SPI_Transmit(&hspi3,(uint8_t*)aTxBuffer,1,5000);cs_strob()

 

Собираем, прошиваем, смотрим

 

Image03

 

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

 

 

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

 

Исходный код

 

Техническая документация на микросхему 747HC595

 

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

STM32F4-DISCOVERY

Сдвиговые регистры 74HC595N 10 шт

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

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

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

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

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

*