пятница, 17 декабря 2021 г.

Работа с кнопкой на STM32, языке Си и библиотеке CMSIS

 Работа с кнопкой подключенной к выводу микроконтроллера обычно является вторым этапом в его изучении, после мигалки. Умея работать с портами ввода-вывода общего назначения уже можно программно реализовывать связь по разным интерфейсам вроде SPI, UART и т.д (аппаратная реализация их возможно лучше и проще но это не исключает возможность их программной реализации) с внешними устройствами а также реализовывать ШИМ и ещё много чего. Проблемы могут быть с реализацией например АЦП, (т.к. для него нужен как минимум компаратор поэтому определенно лучше использовать встроенный АЦП) ЦАП и возможно некоторых других периферийных устройств но в целом, порты ввода-вывода общего назначения это основной способ взаимодействия микроконтроллера с "внешним миром". Кнопку можно подключить к любому свободному пину ввода-вывода общего назначения микроконтроллера STM32:

При этом не обязательно "подтягивать" этот пин к плюсу или минусу питания внешним резистором т.к. cделать это можно программно в коде. За основу можно взять например код из предыдущего урока ->https://electe.blogspot.com/2021/12/stm32f103c8t6-cmsis.html. Т.к. умения мигать светодиодом уже имеются то можно например реализовать мигания с разной частотой при нажатой и отпущенной кнопке. Чтобы настроить пин на выход, как обычно для данного семейства микроконтроллеров, сначала надо включить тактирование порта связанного с этим пином. Т.к. на схеме выше, кнопка подключена к пину порта B то взяв код из предыдущего урока, можно ничего не добавлять. Если кнопку подключить к пину другого порта то надо будет включить тактирование соответствующего порта. Чтобы пин PB8 был входом нужно чтобы в бите 0 и бите 1 регистра GPIOB_CHR были нули. Т.к. там нули по умолчанию то для настройки данного пина на вход можно не делать ничего. Аналогичная ситуация и с другими пинами. Обычно по умолчанию они все настроены на вход и это стандартная ситуация для большинства микроконтроллеров. Чтобы можно было сделать пину программную "подтяжку" и не подключать внешний резистор нужно в бит 3 записать единицы и не забыть убрать единицу из бита 2 т.к. там она по умолчанию и если её не убрать то получим ситуацию при которой пин не работает как было запланировано изначально:

В коде это может выглядеть например так:


Для "подтяжки" к плюсу можно использовать, уже знакомую, команду установки единицы на пине:


Только на этот раз единицу надо записать в бит 8:

Чтобы проверять нажата кнопка или нет, используется регистр IDR:
Логическими операторами языка си можно получать ноль или не ноль в зависимости от напряжения на пине и использовать ветвления чтобы в зависимости от этого напряжения выполнялись разные участки кода. Так например можно реализовать мигалку с разной частотой в зависимости от того нажата кнопка или нет:
Полный код можно скопипастить из текстового поля:



Видео по данной теме:


КАРТА БЛОГА (содержание)


Комментариев нет:

Отправить комментарий