Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » STM32: Вопросы » STM32F429 + EXTI


STM32F429 + EXTI

Сообщений 1 страница 18 из 18

1

Привет всем. Помогите, пожалуйста, разобраться с этим 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 (2017-10-17 20:41:10)

2

AlexWonder Все нормальные люди опрашивают кнопки через таймер. Если для примера они там висят то другое дело. GPIO_InitStruct.Pull = GPIO_NOPULL; вот твоя проблема. Там на CMSIS несколько регистров зачем там HAL.

Отредактировано MasterElectric (2017-10-17 21:45:59)

3

Там HAL т.к. это часть проекта в котором есть еще и LTDC, SDRAM, SDIO, ETHERNET. про ADC, SPI и USART вообще молчу. На данный момент возникло желание более плотно разобраться с внешними прерываниями. Кнопка - это самый простой вариант. В другом проекте, вместо кнопки, может висеть любая другая периферия, которая генерирует прерывания по событию (гироскопы, акселерометры, разные датчики и прочее). А при таком глюке становится не комфортно за достоверность срабатываний. GPIO_NOPULL специально поставил, т.к. Pull  реализован в виде резистора на 4.7к на +3.3в плюс параллельно кнопке стоит кондер на 0.1мкф. Я уже думал что через GPIO_PULLUP идет какая-то помеха по питанию внутри кристалла (по одному порту) и она наводится на вторую кнопку.

4

AlexWonder, посмотри здесь - http://www.emcu.it/STM32/STM32Discovery … sTick.html

5

AlexWonder написал(а):

Там HAL т.к. это часть проекта в котором есть еще и LTDC, SDRAM, SDIO, ETHERNET. про ADC, SPI и USART вообще молчу.

Все это легко делается без калокуба.
А вешать кнопки на внешнее прерывание было моветоном еще на 8ми битках.
И кнопки это не "простой вариант" ...

6

Вопрос не в том, стоит ли кнопки вешать на прерывания или нет, а в том, почему при формировании импульса только на одном EXTIx, переодически устанавливаются флаги на других EXTI (если они разрешены) ?

Сначала косил на флюс между ногами. Промывка и просушка не помогли. Далее предположил что идет помеха по питанию и проц на большой частоте на нее реагирует. Занижение частоты не помогло. Эффект не исчез.

Пока выяснил следующее: Если в момент срабатывания прерывания по EXTIx и до выхода из него, на вход этого EXTI идут импульсы (помеха или период меньше чем время обработки прерывания) то возможна установка флагов на соседних каналах EXTI

Отредактировано AlexWonder (2017-10-18 13:02:31)

7

AlexWonder,  у меня лично, нет никакого желания ковыряться в дебрях калокуба и исправлять его косяки.
На 429 дискаверине EXTI , лично у меня, работает вменяемо...

8

dosikus написал(а):

Все это легко делается без калокуба.
А вешать кнопки на внешнее прерывание было моветоном еще на 8ми битках.
И кнопки это не "простой вариант" ...

а почему это плохо ?  ( я не спорю, а просто хочу разобраться)

у меня кнопки тоже в одном проекте висят на внешних прерываниях. работают вроде нормально.  Достался такой код в наследство.  Его пока не правил, потому что работает и другие более спорные моменты переписываю.

9

Это  достаточно плотно перетирали, лень искать -попадется кину ссылку.

10

Да что Вы прицепились к этой кнопке. Я вовсе не про нее спрашивал. Я могу привести кучу примеров где необходимо обработать какое-то событие от внешнего источника за как можно быстрее (вплоть до 1мкс или еще быстрее). Прерывание тут самое то. Но если кого-то передергивает слово "КНОПКА" перефразирую свой вопрос:

Есть 3 ноги PD4, PD5 и PA15. Они определены в контроллере как внешние источники прерывания Согласно специфике контроллера, они получаются как EXTI4, EXTI5 и EXTI15 соответственно. При появлении импульса на ноге PD4, PD5 или PA15 устанавливаются флаги EXTI->PR(4), EXTI->PR(5) или EXTI->PR(15) соответственно. Я генерирую импульсы только на ноге PD5. В результате примерно 1 раз из 10 устанавливаются флаги EXTI->PR(5) и EXTI->PR(4) и примерно 1 раз из 20 устанавливаются флаги EXTI->PR(5) и EXTI->PR(4) и EXTI->PR(15). Вопрос: КАК и Почему?

Напомню: Все ноги подтянуты к плюсу резистом на 4.7к. Плата промыта от флюса и просушена.

11

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

12

Что там HAL делает внутри одному богу известно ))

13

AlexWonder написал(а):

Вопрос: КАК и Почему?


Ответ на вопрос -"Как устанавливаются флаги EXTI" смотрите в RM .
А на вопрос "почему" у вас лажа , мы поможем вам только, если вы переделаете в вменяемый исходник (без г. либ) и подтвердится наличие косяков.
Так понятно?
Да и следует почитать о механизме NVIC(о вложенных/отложенных прерываниях, о  interrupt latency и приоритетах) в свете ваших жестких условий - следование импульсов 1 мкс.
И еще раз - разбираться со всем этим в исходниках писанных на г.либах, геморрой еще тот ...
см.
http://s015.radikal.ru/i333/1710/cb/ace43bdaa008.png

14

В общем вот - https://www.nxp.com/docs/en/application … N10414.pdf
Не про STM. но по теме. Может кому еще пригодится

В общем, ответ на свой вопрос я нашел.
Всем спасибо

Отредактировано AlexWonder (2017-10-19 20:22:49)

15

А то же самое но именно о периферии стм , вам не читалось?
Ну и о "птичках", только недавно в прерывании таймера решали подобное - в хэндлере состоящем из двух сишный строк  строб пина и сброса флага прерывания , решилось переносом сброса в начало хэндлере.
Теперь внимание вопрос - как вы собираетесь исправлять подобное в сраном хале? Где  куча вложенных колбэков и прочей ереси?
Впрочем это ваш выбор, сознательный (надеюсь) , скакать по заботливо расставленным граблям ...

16

Если Вы не любите кошек, возможно Вы просто их не умеете готовить!
Лично мне куб с халом очень помог в первом знакомстве с ARM. Я довольно таки долго програмил на асме и считал что лучше среды для разработки нет. Все изменилось когда пришлось участвовать в команде по разработке установки. Возможно в HALе и есть грабли, но лично мне они пока не попадались. А вот на грабли от умников, которые считают что знают все на свете, а наступал не раз. Причем не только в контроллерах. К КУБу у меня тоже претензий нет, хотя генерируемый им код у меня заработал только в IARе. Но я же с пеной у рта не доказываю что ECLIPS со всеми побрякушками полный отстой. Рано или поздно я может и освою ECLIPS или другие среды разработок, если от этого будет зависеть моя зарплата.

В общем на вкус и цвет, все фломастеры разные.

17

AlexWonder написал(а):

В общем вот - https://www.nxp.com/docs/en/application … N10414.pdf
Не про STM. но по теме. Может кому еще пригодится

В общем, ответ на свой вопрос я нашел.
Всем спасибо

Отредактировано AlexWonder (Вчера 20:22:49)

Насколько я понял, там рассказывается как arm7tdmi уходит в прерывание, и если в этот момент какая-то зараза сбрасывает флаг этого прерывания, то тогда arm7tdmi теряется и переходит по дефолтному вектору вместо нужного.
Но слово spurious красивое и подходящее по смыслу твоего вопроса, это да )

18

AlexWonder, вы точно знаете зачем сюда пришли? Ресурсов с воплями -"помогите калокуб не работает" и так полно в сети.
Вам уже не раз объясняли - калокубами не занимаемся.
И нам не надо доказывать чем "хороши" г.либы ...
Да и причем здесь клипсина? Самая отстойная IDE...


Вы здесь » Микроконтроллеры » STM32: Вопросы » STM32F429 + EXTI