Перейти к содержанию
    

Как определить пин на котором возникло External interrupt?

Есть stm32. На пин PA0 и на пин PB0 установлены кнопки. На оба пина настроено и включено прерывание NVIC_EnableIRQ(EXTI0_IRQn). Согласно документации PA0 и PB0 приходятся на линию EXTI0. При нажатии одной из кнопок возникает прерывание EXTI0_IRQHandler. Как в обработчике прерывания определить с какого пина возникло прерывание? Вариант 1: в обработчике прерывания проверить уровень на пинах PA0 и PB.

Есть ещё варианты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если мне не изменяет память, то никак.

1 minute ago, AndyBig said:

А чем вариант 1 плох?

Тем, что к моменту, когда мы дойдём до опроса, там уже может не быть того уровня, который вызвал срабатывание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кажется нельзя такую конфигурацию сделать. 

То-есть 0 бит может быть на любом порту но только на одном. Как и все остальные прерывания. Итого 16 шт.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, LAS9891 сказал:

Как в обработчике прерывания определить с какого пина возникло прерывание?

В общем случае - никак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, engel65536 said:

Тем, что к моменту, когда мы дойдём до опроса, там уже может не быть того уровня, который вызвал срабатывание.

Но это же кнопки. Они не могут быть нажаты в течении всего лишь пары микросекунд 🙂

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, LAS9891 сказал:

Вариант 1: в обработчике прерывания проверить уровень на пинах PA0 и PB.

По нему вы никак не сможете ответить на поставленный вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

По нему вы никак не сможете ответить на поставленный вопрос.

Как же ответить на поставленный вопрос?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, AndyBig сказал:

Но это же кнопки. Они не могут быть нажаты в течении всего лишь пары микросекунд 🙂

Причём тут пара мкс? Вы уверены, что ISR гарантированно получит управление и успеет опросить входы в течение пары мкс?

1) Они могут быть нажаты одновременно.

2) Помеха может прийти одновременно.

 

3 минуты назад, LAS9891 сказал:

Как же ответить на поставленный вопрос?

Чтобы определять с какой ноги пришло прерывание - вешайте на разные EXTIx.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, jcxz said:

В общем случае - никак.

Я думал, что я что-то не дочитал про External interrupt. Надеялся, что есть какой-то регистр (который относится к External interrupt), в котором это отражается.

Изменено пользователем LAS9891

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если немного подумать, то для опроса кнопок совешенно не нужно определять = "с какой ноги пришло прерывание". Если вам нужен именно опрос кнопок, а не что-то иное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jcxz said:

1) Они могут быть нажаты одновременно.

2) Помеха может прийти одновременно.

Значит и увидите обе нажатые кнопки. Не пойму в чем проблема 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 01.03.2023 в 16:33, jcxz сказал:

совешенно не нужно определять = "с какой ноги пришло прерывание".

ну так это и есть 1 вариант проверки уровня на порту.

На мой взгляд если опрашивать кнопки, то по таймеру, всеравно антидребезг делать нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, AndyBig сказал:

Значит и увидите обе нажатые кнопки. Не пойму в чем проблема 🙂

Проблема в том, что вы не читаете исходный вопрос, на который пытаетесь отвечать.

Подумайте что будет если активный уровень (генерящий прерывание) появился на ноге1, а через 1мкс - такой же уровень появился на ноге2. Как определите с какой ноги пришло прерывание, при условии того, что нет гарантии что вход в ISR займёт менее 1мкс?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...