Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/62: Рейтинг темы: голосов - 62, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
1

stm32f1 как узнать, на каком порту сработало прерывание.

05.12.2015, 16:34. Показов 11494. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пусть 2-е кнопки висят на pa13 и pc13. Есть внешнее прерывание, срабатывающее по изменению состояния порта т.е. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING . Так вот, узнать в обработчике EXTI15_10_IRQHomdler имя пина можно так: if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != RESIT) , а вот как узнать порт: pa или pc?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2015, 16:34
Ответы с готовыми решениями:

Как узнать какое прерывание сработало в stm32f051?
Я оказываюсь тут. До этого я настраиваю TYM14 - на прерывание при обновление. Но таймер TIMx->CR1...

Как узнать какое прерывание сработало в stm32f051?
Когда я в отладчике дохожу до главного цикла, то меня перебрасывает сюда. /** * @brief This is...

Прерывание потока не сработало
Здравствуйте, возникла такая проблема: пытаюсь поставить поток в состояние "прерван", но почему-то...

Как в ms-dos настроить прерывание аппаратное по lpt порту?
Почему может прерывание не работать не подскажете .MODEL tiny .386 .DATA oldSeg dw 0...

Как узнать, какое конкретно из условий сработало?
if (matrix == answer || matrix == answer || matrix == answer || matrix == answer) имеется блок...

31
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 225
14.12.2015, 20:22 21
Author24 — интернет-сервис помощи студентам
Одинаковые пины можно использовать для опроса энкодера, где один пин вам необходим для прерывания, а второй для определения направления вращения.
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
15.12.2015, 02:02 22
Короч, не работает чтение текущего состояния. Объясняю: пришло прерывание, в нём читаем текущее состояние .... и как раз в этот момент идёт дребезг ... итого запросто можно проморгать изменение состояния. Попробую с регистрами, по другому никак.
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
15.12.2015, 02:12 23
Господа, а как узнать, на пине изменилось состояние с 0 на 1, или с 1 на 0? Учитывая предыдущее сообщение, без чтения текущего состояния через HAL_GPIO_ReadPin ?
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
15.12.2015, 19:12 24
Сработало прерывание(для примера вход стал 0)-> запустили таймер на 10-20мс(для кнопок более чем)-> как таймер дотикал читаете состояние пина-> если там по прежнему 0-> кнопка точно нажата, это не помеха, делаем что-то нужное->если там 1(прилетела помеха)-> ничего не делаем, ждем следующее прерывание. Это в случае если отрабатываем кнопки.
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
15.12.2015, 20:08 25
Если только первый - то можно просто тут же отключить прерывание, и включить его спустя некоторое время. Хотя любая помеха/наводка даст ложные срабатывания. Бывало так, что на 100мгц осцилле я видел условно 10 ложных срабатываний при дребезге, а по факту прерывание насчитывало 12-16 срабатываний. Емкость и прочие аппаратные решения для антидребезга мне кажутся избыточными, т.к. все можно решить программно. Rising/falling решает битовым флагом, который помнит предыдущее состояние.
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
15.12.2015, 20:17 26
Да, дело в кнопках, но над ними нужен полный контроль: когда нажали, когда отпустили, текущее состояние. Сделал так: при прерывании запоминаем время, а в отдельном потоке, через определённый интервал, читаем состояние. Всё работает. Просто я изначально думал, что прерывание на стм32 несёт полный набор информации, но, увы, пришлось "костылять", потратив на это много времени. И чего мешало встроить аппаратный модуль антидребезга, и в прерывание подавать полную информацию - ума не приложу.
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
15.12.2015, 20:24 27
Это ни разу не костыли, а нормальный рабочий процесс написания ПО.Обработка антидребезга так вообще классика. Аппаратная отработка антидребезга внутри контроллера - не слышал ни разу. Прерывания почти во всех МК несет лишь одну информацию - я случилось, вот тебе прерывание, делай что тебе нужно. Вам тогда снаружи надо триггер вешать, вот он точно даст только 1 импульс. И, кстати, кнопки, т.е. человеко-машинный интерфейс - это крайне медленная штука, относительно работы МК. Кнопки можно просто раз в 50мс опрашивать, даже без прерываний.
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
15.12.2015, 20:51 28
Цитата Сообщение от Hotd
Это ни разу не костыли, а нормальный рабочий процесс написания ПО.Обработка антидребезга так вообще классика. Аппаратная отработка антидребезга внутри контроллера - не слышал ни разу. Прерывания почти во всех МК несет лишь одну информацию - я случилось, вот тебе прерывание, делай что тебе нужно. Вам тогда снаружи надо триггер вешать, вот он точно даст только 1 импульс. И, кстати, кнопки, т.е. человеко-машинный интерфейс - это крайне медленная штука, относительно работы МК. Кнопки можно просто раз в 50мс опрашивать, даже без прерываний.
Пока не интересовался, как в стм, но на ардуине только при помощи кнопки на прерывании можно вывести контроллер из сна. Мой девайс тоже большую часть времени будет бездействовать, чтоб зря не кушать батарейку. Так что прерывания необходимы. А аппаратный антидребезг - ну выдай ты прерывание не после 1-ого контакта, а после х тактов неизменного состояния, где х настраивается, вот и весь антидребезг.
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
15.12.2015, 20:52 29
Цитата Сообщение от SGE
Но по сути, ТСу это нафиг не нужно всё, у него просто две кнопки - это не требует таких сущностей вообще.
Я сам-то программист, а не железячник. Мне проще сто строк кода налабать, чем детали распаивать :)
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
15.12.2015, 20:55 30
А зачем для кнопки делать rising/falling? Только для того, чтобы знать время нажатия? Так куда проще по срабатыванию falling (после обработки антидребезга), запустить периодический таймер, пусть каждые 50 мс, и при каждом запуске таймера смотреть, нажата еще кнопка или нет. Как только увидели что кнопку отпустили - смотрим сколько раз таймер запустился, это и есть наша длительность. Мне кажется разрешения 50 мс для измерения длительности нажатия кнопки за глаза, там даже 100 мс скорее всего пойдет, контроллер сильно не нагрузит. У кнопок вообще может по факту лишь 3 состояния - кнопку нажали, кнопку отпустили, кнопку долго держали нажатой. Обычно все действия делаются по отжатию кнопки.
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
15.12.2015, 20:59 31
Цитата Сообщение от SGE
Ktumtus, две кнопки и два входа - в чем проблема ловить под прерыванию на каждом из входов ? я не понимаю вообще что вы хотите.
Да изначально хотел повесить на прерывания оба события(нажатие и отпускание) пары кнопок и пары переключателей. Теперь всё это работает как описано выше.
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
15.12.2015, 21:02 32
Цитата Сообщение от Hotd
А зачем для кнопки делать rising/falling? Только для того, чтобы знать время нажатия? Так куда проще по срабатыванию falling (после обработки антидребезга), запустить периодический таймер, пусть каждые 50 мс, и при каждом запуске таймера смотреть, нажата еще кнопка или нет. Как только увидели что кнопку отпустили - смотрим сколько раз таймер запустился, это и есть наша длительность. Мне кажется разрешения 50 мс для измерения длительности нажатия кнопки за глаза, там даже 100 мс скорее всего пойдет, контроллер сильно не нагрузит. У кнопок вообще может по факту лишь 3 состояния - кнопку нажали, кнопку отпустили, кнопку долго держали нажатой. Обычно все действия делаются по отжатию кнопки.
Лень было грузить контроллер лишними чтениями каждые х мс, ведь есть же прерывания. У меня кнопки работают в 2-х режимах, и мне важно ловить оба фронта.
0
15.12.2015, 21:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2015, 21:02
Помогаю со студенческими работами здесь

Как узнать раскладку клавиатуры? Как её изменить? Как узнать, на каком языке текст в файле?
сабж

Не работает прерывание по порту B в PIC16F887 (MikroC)
Всем привет. Учусь программировать ПИК контроллеры в Си а именно(16f887), для этого выбрал...

Как узнать какой IP на порту
Доброго всем времени суток. Подскажите пожалуйста, как можно быстрым способом выяснять какой IP...

Как узнать работает ли в порту интернет?
Есть сетевая розетка подключенная к свитчу как узнать работает ли на нёй интернет без подключения...

Как програмно узнать к какому com порту подключена ардуина
Как програмно узнать к какому com порту подключена ардуина.

Узнать по какому конкретному условию сработало общее условие
Например, есть условие: a && b && (c || d && e || f) || (a .. && c) Нужно узнать как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru