Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

STM32F439 + EXTI

Непрочитано 16.10.2017, 20:20  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию STM32F439 + EXTI

Привет всем. Помогите, пожалуйста, разобраться с этим EXTI. Ситуация такая - есть 2 кнопки (button2 и button3). Висят они на порту D
Процедура инициализации такая:
Код:
#define Button_2_Pin GPIO_PIN_4
#define Button_2_GPIO_Port GPIOD
#define Button_3_Pin GPIO_PIN_5
#define Button_3_GPIO_Port GPIOD

  GPIO_InitStruct.Pin = Button_2_Pin|Button_3_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* EXTI interrupt init Button3 */ 
  HAL_NVIC_SetPriority(EXTI4_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(EXTI4_IRQn);

  /* EXTI interrupt init Button2 */ 
  HAL_NVIC_SetPriority(EXTI9_5_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
Есть обработчики прерываний:
Код:
// Button2 (Send/Save)
void EXTI4_IRQHandler(void)
{
  HAL_NVIC_ClearPendingIRQ(EXTI4_IRQn);
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  CLEAR_BIT(EXTI-›RTSR, EXTI_IMR_IM4);
  HAL_NVIC_DisableIRQ(EXTI4_IRQn);

  Button2Tick = HAL_GetTick();
  if(Pausa)
  {
    SaveFile = 1;
  }
}

// Button3 (Start/Stop)
void EXTI9_5_IRQHandler(void)
{
  HAL_NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  CLEAR_BIT(EXTI-›RTSR, EXTI_IMR_IM5);
  HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
  Button3Tick = HAL_GetTick();

  Pausa = !Pausa;
}
в основном (main) коде в цикле:
Код:
    if((HAL_GetTick() - Button3Tick) ›= 200)
    {
      if(READ_BIT(EXTI-›RTSR, EXTI_IMR_IM5) == 0)
      {
        SET_BIT(EXTI-›RTSR, EXTI_IMR_IM5);
        HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
      }
    }
    if((HAL_GetTick() - Button2Tick) ›= 200)
    {
      if(READ_BIT(EXTI-›RTSR, EXTI_IMR_IM4) == 0)
      {
        SET_BIT(EXTI-›RTSR, EXTI_IMR_IM4);
        HAL_NVIC_EnableIRQ(EXTI4_IRQn);
      }
    }
Ситуация такая:
1. Хоть и указываю что надо срабатывать по фронту, но в железе прерывания срабатывают и по фронту и по спаду.
2. Если нажать на Button3 иногда срабатывает и прерывание EXTI4_IRQHandler. Если нажать на Button2, почти всегда в регистре EXTI-›PR устанавливаются флаги PR4, PR5 и как следствие по очереди попадаю сначала в EXTI4_IRQHandler а потом в EXTI9_5_IRQHandler

Я уже не знаю куда копать. Может кто сталкивался с подобным?

P.S. в проекте используется HAL
Реклама:
AlexWonder вне форума  
Непрочитано 16.10.2017, 20:53  
DanilinSA
Почётный гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,800
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
DanilinSA на пути к лучшему
По умолчанию Re: STM32F439 + EXTI

1) В момент срабатывания и отпускания идет дребезг. Так что в момент нажатия и отпускания у тебя куча "фронтов" и "спадов." Нужно давить програмно или аппаратно. Или совместно.
2) Как реализована цепь кнопок? Подтяжка к "+" а кнопка на землю? Или просто кнопка на порт? Обычно я делаю так: Резистор на 10 К к "+", кнопка на землю. И конденсатор в сотню пик параллельно кнопке.
DanilinSA вне форума  
Непрочитано 16.10.2017, 21:01  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию Re: STM32F439 + EXTI

Кнопка реализована аналогично - Резюк 10к на + и кнопка на землю. Параллельно кнопке стоит кондер на 0.1мкф. Антидребезг реализован программно : в прерывании есть процедуры
Код:
  HAL_NVIC_ClearPendingIRQ(EXTI4_IRQn);
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  CLEAR_BIT(EXTI-›RTSR, EXTI_IMR_IM4);
  HAL_NVIC_DisableIRQ(EXTI4_IRQn);
это отключение прерывания на ноге.
далее в основном цикле:
Код:
if((HAL_GetTick() - Button3Tick) ›= 200)
    {
      if(READ_BIT(EXTI-›RTSR, EXTI_IMR_IM5) == 0)
      {
        SET_BIT(EXTI-›RTSR, EXTI_IMR_IM5);
        HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
      }
    }
разрешает прерывания через 200мс после запрета, а следовательно реакция на нажатие кнопки 5раз в секунду
AlexWonder вне форума  
Непрочитано 17.10.2017, 15:37  
DanilinSA
Почётный гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,800
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
DanilinSA на пути к лучшему
По умолчанию Re: STM32F439 + EXTI

Ну ... да. Тут проще программно дребезг подавить. Особенно если основной цикл не сильно загружен.
Хотя я например дребезг с энкодера давил с использованием 2-х счетчииков и прерываний. Но у меня основной цикл был "плотно" забит, так-что пришлось упор делать на "хардварную" обработку.
Алгоритм такой: По приходу фронта - старт таймера. По спаду - стоп таймера (он при этом обнуляется). Таймер на 200-300 мс. Таймер сработал - обработчик прерываний таймера дал сигнал о нажатой кнопке. Правда реальная процедура гораздо сложнее и отслеживает нажатие и отпускание.
DanilinSA вне форума  
Непрочитано 17.10.2017, 16:58  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию Re: STM32F439 + EXTI

Сообщение от Hives Посмотреть сообщение
(о*уевший смайлик) ну песец ты индус... и все ради 2 кнопок?
Попрошу без оскорблений....

Вопрос был не в том "как победить дребезг", а в том, почему при нажатии только на Button2 (или Button3) одновременно устанавливаются флаги на прерывание EXTI4_IRQ и EXTI9_5_IRQ? И второй вопрос: Почему при параметре "GPIO_MODE_IT_RISING" (я так понимаю - прерывания по нарастающему фронту) прерывания происходят как при нажатии кнопки, так и при отпускании.

Я допускаю что контроллер очень шустрый и способен отловить те помехи, которые не фильтрует кондер и готов пересмотреть алгоритм опроса кнопок для текущей задачи. Но на первый вопрос это никак не влияет и возможно в следующем проекте вместо кнопок будет висеть какие-то внешние модули (есть много периферии которые генерируют прерывания по событию).
AlexWonder вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
EXTI on STM32F030c8t6 miwutka ARM 14 17.10.2016 13:18
Какие процессоры\контроллеры изучать с нулевыми навыками? RMH1989 Песочница (вопросы новичков) 43 06.04.2016 13:58


Часовой пояс GMT +4, время: 17:13.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.