Урок 24
HAL. SPI. LED Статическая индикация
На прошлом уроке мы подключили посредством шины SPI микросхему 74HC595, являющуюся сдвиговым регистром.
Сегодня мы с помощью данной микросхемы попробуем уже поуправлять семисегментным светодиодным индикатором с общим анодом.
Вот распиновка данного индикатора
А вот это схема подключения (нажмите на картинку для увеличения изображения)
Точно также всё подключено, как и светодиоды, Только сегменты уже подключены не на общий провод, а на провод питания, а к контроллеру они уже обращены наоборот катодами.
А вот так у нас подключено всё на практике
Также замечу, что мы уже с помощью такого же сдвигового регистра уже подключали индикатор к контроллеру 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()
Собираем, прошиваем, смотрим
На следующем уроке мы попробуем поработать с динамической индикацией, подключив сразу два сдвиговых регистра.
Предыдущий урок Программирование МК STM32 Следующий урок
Техническая документация на микросхему 747HC595
Отладочную плату можно приобрести здесь STM32F4-DISCOVERY
Сдвиговые регистры 74HC595N 10 шт
Семисегментный одноразрядный индикатор красный (с общим анодом или катодом на выбор) 10 шт
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий