LAS9891 0 March 1 Posted March 1 · Report post Есть stm32. На пин PA0 и на пин PB0 установлены кнопки. На оба пина настроено и включено прерывание NVIC_EnableIRQ(EXTI0_IRQn). Согласно документации PA0 и PB0 приходятся на линию EXTI0. При нажатии одной из кнопок возникает прерывание EXTI0_IRQHandler. Как в обработчике прерывания определить с какого пина возникло прерывание? Вариант 1: в обработчике прерывания проверить уровень на пинах PA0 и PB. Есть ещё варианты? Quote Share this post Link to post Share on other sites More sharing options...
AndyBig 1 March 1 Posted March 1 · Report post А чем вариант 1 плох? Quote Share this post Link to post Share on other sites More sharing options...
engel65536 5 March 1 Posted March 1 · Report post Если мне не изменяет память, то никак. 1 minute ago, AndyBig said: А чем вариант 1 плох? Тем, что к моменту, когда мы дойдём до опроса, там уже может не быть того уровня, который вызвал срабатывание. Quote Share this post Link to post Share on other sites More sharing options...
mitya1698 7 March 1 Posted March 1 · Report post кажется нельзя такую конфигурацию сделать. То-есть 0 бит может быть на любом порту но только на одном. Как и все остальные прерывания. Итого 16 шт. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 83 March 1 Posted March 1 · Report post 7 минут назад, LAS9891 сказал: Как в обработчике прерывания определить с какого пина возникло прерывание? В общем случае - никак. 1 Quote Share this post Link to post Share on other sites More sharing options...
AndyBig 1 March 1 Posted March 1 · Report post 3 minutes ago, engel65536 said: Тем, что к моменту, когда мы дойдём до опроса, там уже может не быть того уровня, который вызвал срабатывание. Но это же кнопки. Они не могут быть нажаты в течении всего лишь пары микросекунд 🙂 Quote Share this post Link to post Share on other sites More sharing options...
jcxz 83 March 1 Posted March 1 · Report post 8 минут назад, LAS9891 сказал: Вариант 1: в обработчике прерывания проверить уровень на пинах PA0 и PB. По нему вы никак не сможете ответить на поставленный вопрос. Quote Share this post Link to post Share on other sites More sharing options...
LAS9891 0 March 1 Posted March 1 · Report post 1 minute ago, jcxz said: По нему вы никак не сможете ответить на поставленный вопрос. Как же ответить на поставленный вопрос? Quote Share this post Link to post Share on other sites More sharing options...
jcxz 83 March 1 Posted March 1 · Report post 3 минуты назад, AndyBig сказал: Но это же кнопки. Они не могут быть нажаты в течении всего лишь пары микросекунд 🙂 Причём тут пара мкс? Вы уверены, что ISR гарантированно получит управление и успеет опросить входы в течение пары мкс? 1) Они могут быть нажаты одновременно. 2) Помеха может прийти одновременно. 3 минуты назад, LAS9891 сказал: Как же ответить на поставленный вопрос? Чтобы определять с какой ноги пришло прерывание - вешайте на разные EXTIx. 1 Quote Share this post Link to post Share on other sites More sharing options...
LAS9891 0 March 1 Posted March 1 (edited) · Report post 6 minutes ago, jcxz said: В общем случае - никак. Я думал, что я что-то не дочитал про External interrupt. Надеялся, что есть какой-то регистр (который относится к External interrupt), в котором это отражается. Edited March 1 by LAS9891 Quote Share this post Link to post Share on other sites More sharing options...
mitya1698 7 March 1 Posted March 1 · Report post Вам же дали 16 внешних прерываний, вот и раздайте на разные. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 83 March 1 Posted March 1 · Report post Если немного подумать, то для опроса кнопок совешенно не нужно определять = "с какой ноги пришло прерывание". Если вам нужен именно опрос кнопок, а не что-то иное. Quote Share this post Link to post Share on other sites More sharing options...
AndyBig 1 March 1 Posted March 1 · Report post 4 minutes ago, jcxz said: 1) Они могут быть нажаты одновременно. 2) Помеха может прийти одновременно. Значит и увидите обе нажатые кнопки. Не пойму в чем проблема 🙂 Quote Share this post Link to post Share on other sites More sharing options...
mitya1698 7 March 1 Posted March 1 · Report post В 01.03.2023 в 16:33, jcxz сказал: совешенно не нужно определять = "с какой ноги пришло прерывание". ну так это и есть 1 вариант проверки уровня на порту. На мой взгляд если опрашивать кнопки, то по таймеру, всеравно антидребезг делать нужно. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 83 March 1 Posted March 1 · Report post 5 минут назад, AndyBig сказал: Значит и увидите обе нажатые кнопки. Не пойму в чем проблема 🙂 Проблема в том, что вы не читаете исходный вопрос, на который пытаетесь отвечать. Подумайте что будет если активный уровень (генерящий прерывание) появился на ноге1, а через 1мкс - такой же уровень появился на ноге2. Как определите с какой ноги пришло прерывание, при условии того, что нет гарантии что вход в ISR займёт менее 1мкс? Quote Share this post Link to post Share on other sites More sharing options...