Когда в проекте появляется небольшая периферия, не хочется сильно погружаться в логику ее работы. Хорошо было бы сделать так: подключил и все работает. В данном случае, речь о 7-сегментном индикаторе из четырех цифр, который нужно было использовать в некоем приборчике с контроллером STM32F103C8T6 на борту.
Быстро конечно не получилось, определенное погружение было. Индикатор выбирал с минимумом интерфейсных цепей, после чего на 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.
Вот и все. Теперь как мне кажется все точно выглядит достаточно просто.