Найти в Дзене

STM32: кнопка и машина состояний

Всем привет! Сегодня напишем код для микроконтроллера stm32, который будет обрабатывать нажатия на тактовую кнопку. Приступим.
1) Микроконтроллер stm32f103c8t6.
2) пара светодиодов
3) тактовая кнопка
Оглавление

Всем привет! Сегодня напишем код для микроконтроллера 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 создаётся непосредственно переменная, отвечающая за состояние.

-2

Строки 77-84. Это функция внешнего прерывания. В нем мы:

1) Проверяем, на каком пине сработало прерывание

2) Поднимаем флаг таймера

3) Отключаем прерывание на данной линии

4) Сбрасываем счетчик таймера

5) Запускаем прерывание таймера

Далее переходим к функции обработчика прерывания таймера.

-3

Это строки 85-94. В этой функции мы:

1) Проверяем, по нашему ли таймеру пришло прерывание

2) Останавливаем прерывание таймера

3) Сбрасываем флаг таймера

4) Проверяем состояние пина. Если оно 0 (так как подтяжка у нас к 3.3В), то поднимаем флаг переключения состояния.

5) включаем обратно внешние прерывания на линии.

Осталась только функция машины состояний.

-4

В данной функции мы собственно реализовываем fsm, с помощью switch. В качестве проверяемой переменной ставим нашу переменную state. В каждом case есть условие, которое проверяет флаг состояния. Если он равен 1, то происходит переключение на следующее состояние. При этом флаг обратно сбрасывается.

Продолжение функции fsm:

-5

Я реализовал в данной машине состояний переключение режимов светодиодов.

Остается лишь вызвать функцию fsm() в основном цикле и прошить контроллер (ну и спаять схему).

Вызов функции
Вызов функции

Видео:

У метода антидребезга, представленном в данном коде, есть один недостаток. Он требует для себя отдельного таймера. Возможно, в условиях stm32 это не так существенно, но если бы у меня был контроллер попроще, например atmega 8, какие либо attiny или PIC, то это было бы существенное ограничение. Поэтому, в будущем рассмотрим другой метод антидребезга.

Ну а на этом у меня всë. Всем до скорого!