Всем привет! Сегодня напишем код для микроконтроллера stm32, который будет обрабатывать нажатия на тактовую кнопку. Приступим.
Что необходимо
1) Микроконтроллер stm32f103c8t6.
2) пара светодиодов
3) тактовая кнопка
4) программатор st-link
Настройка проекта и написание кода
Писать его будем в среде cube ide. Настроим порты А8 и А10 как выходы, порт А7 на обработку внешних прерываний. Частоту ставим 72МГц. Для антидребезга нам понадобится таймер, выберем TIM2.
Настройки таймера:
Mode: internal clock.
Prescaler: 7199.
Counter period: 999.
Включить в NVIC TIM2 global interrupt.
В настройках прерывания у пина A7 выбрать прерывание по спадающему фронту. Также установить этому пину pull-up подтяжку.
Настройку завершили. Генерируем проект и переходим к коду.
Строки 30-40 - это необходимые для работы кода переменные. Строки 41-48 - это перечисление состояний для finite state machine, или же конечного автомата, или машины состояний. В строке 48 создаётся непосредственно переменная, отвечающая за состояние.
Строки 77-84. Это функция внешнего прерывания. В нем мы:
1) Проверяем, на каком пине сработало прерывание
2) Поднимаем флаг таймера
3) Отключаем прерывание на данной линии
4) Сбрасываем счетчик таймера
5) Запускаем прерывание таймера
Далее переходим к функции обработчика прерывания таймера.
Это строки 85-94. В этой функции мы:
1) Проверяем, по нашему ли таймеру пришло прерывание
2) Останавливаем прерывание таймера
3) Сбрасываем флаг таймера
4) Проверяем состояние пина. Если оно 0 (так как подтяжка у нас к 3.3В), то поднимаем флаг переключения состояния.
5) включаем обратно внешние прерывания на линии.
Осталась только функция машины состояний.
В данной функции мы собственно реализовываем fsm, с помощью switch. В качестве проверяемой переменной ставим нашу переменную state. В каждом case есть условие, которое проверяет флаг состояния. Если он равен 1, то происходит переключение на следующее состояние. При этом флаг обратно сбрасывается.
Продолжение функции fsm:
Я реализовал в данной машине состояний переключение режимов светодиодов.
Остается лишь вызвать функцию fsm() в основном цикле и прошить контроллер (ну и спаять схему).
Видео:
У метода антидребезга, представленном в данном коде, есть один недостаток. Он требует для себя отдельного таймера. Возможно, в условиях stm32 это не так существенно, но если бы у меня был контроллер попроще, например atmega 8, какие либо attiny или PIC, то это было бы существенное ограничение. Поэтому, в будущем рассмотрим другой метод антидребезга.
Ну а на этом у меня всë. Всем до скорого!