И снова про внешние прерывания.
Задача - сделать простой в использовании драйвер. В идеале - указываем вывод, который хотим слушать, тип регистрируемого фронта и обработчик. Типа такого:
читать дальшеВ таком случае использование внешних прерываний будет выглядеть примерно так:
По-моему, круто. Очень лаконично и всё платформозависимое скрыто внутри драйвера - пусть он сам определяет, что и как надо настраивать, чтоб получить этот эффект. Пусть хоть программно состояние линии проверяет постоянно, это его личные проблемы.
Настройка внутри данной функции незамысловата:
1. Настраиваем регистры SYSCFG->EXTICR, вычислив и номер регистра, и положение поля в регистре на основе номера вывода (Pin->Pin), запишем в это поле номер порта (Pin->Port);
2. Настраиваем детектор фронтов на основании параметра Edge с помощью регистров EXTI->RTSR и EXTI->FTSR;
3. Разрешаем прерывания на данной линии (и NVIC, и EXTI->IMR);
4. Запоминаем в таблице адрес обработчика.
При наступлении события по номеру вывода (используя все вектора EXTI) ищем обработчик и вызываем его. Всё.
Интересные файлы:
exti.c
exti.h
test.c
В проекте моргает быстро зелёный светодиод. По нажатию на кнопку (детектирование фронта) моргание на секунду прекращается.
Проект.<< Предыдущее Следующее >>