
Быстро конечно не получилось, определенное погружение было. Индикатор выбирал с минимумом интерфейсных цепей, после чего на AliExpress заказал вот такой. Дисплей работает по последовательному интерфейсу по двум цепям: данные DIO и синхронизация CLK. Ну и соответственно ему нужно 5V.
Чтобы не вникать в особенности протокола обмена (как и что на нем зажигается), поискал и готовые исходники программы (драйвера, назовем ее так) для работы с TM1637. Именно этот чип стоит на платке индикатора и делает всю работу.
Дальше сама процедура.
Подключаем DIO и CLK индикатора к любым GPIO выводам STM32: да-да, именно так, никакой UART здесь не нужен. Всю временную последовательность обеспечивают функции драйвера. Подаем на индикатор питание 5V. На этом аппаратное сопряжение завершено.
Теперь, в драйвере ищем строчки
#define CLK_PORT GPIOA #define DIO_PORT GPIOA #define CLK_PIN GPIO_PIN_2 #define DIO_PIN GPIO_PIN_3
и прописываем там свои обозначения выводов GPIO, к которым вы подключили индикатор.
В настройках проекта STM32 (я пользуюсь STM32CubeMX) нужно подправить параметры для портов GPIO: пометить порты как выходные, установить подтяжку Pull Up и скорость обмена High. Кроме этого, поскольку инициализация HAL у меня и так идет в основной программе, я сократил функцию инициализации драйвера, которая теперь выглядит так:
void tm1637Init(void) { tm1637SetBrightness(8); }
Кстати, яркостью индикатора тоже можно управлять.
Зажечь цифирки на дисплее достигается вызовом функции
tm1637DisplayDecimal(int v, int displaySeparator)
где v это само собственное число которое будет отображено, displaySeparator — включать или нет двоеточие в середине дисплея.
Если чисел вам мало и нужно индицировать кракозябры, добавляете их в шаблон segmentMap.
Вот и все. Теперь как мне кажется все точно выглядит достаточно просто.
(c) 2017 Источник материала