Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как на одно прерывание посадить ножки GPIO ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
inventor
Подключаю к плате 3 АЦП и мне нужно чтобы одно прерывание обслуживало все три.
хочу проверить как ведут себя входы DRDY.
пытаюсь их конфигурировать и просто (пока не подключил АЦП) соединить вход с землей.
если их по очереди конфигурить - то все они работают, но не все одновременно.
если конфигурируешь 3 сразу то возникает лишь одно прерывание.
в чем загвоздка, подскажите!

CODE

RCC_APB2PeriphClockCmd(ADS1210_DRDY1_GPIO_CLK | ADS1210_DRDY2_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);


/*!< Configure ADS1210_DRDY1_PIN pin: DRDY1 pin */
GPIO_InitStructure.GPIO_Pin = ADS1210_DRDY1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // или GPIO_Mode_IPU ?
GPIO_Init(ADS1210_DRDY1_GPIO_PORT, &GPIO_InitStructure);

/* Свяжем GPIO DRDY1 с линией EXTI1 */
GPIO_EXTILineConfig(ADS1210_DRDY1_EXTI_PORT_SOURCE, ADS1210_DRDY1_EXTI_PIN_SOURCE);
EXTI_InitStructure.EXTI_Line = ADS1210_DRDY1_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

/*!< Configure ADS1210_DRDY2_PIN pin: DRDY2 pin */
GPIO_InitStructure.GPIO_Pin = ADS1210_DRDY2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // или GPIO_Mode_IPU ?
GPIO_Init(ADS1210_DRDY2_GPIO_PORT, &GPIO_InitStructure);

/* Свяжем GPIO DRDY2 с линией EXTI1 */
GPIO_EXTILineConfig(ADS1210_DRDY2_EXTI_PORT_SOURCE, ADS1210_DRDY2_EXTI_PIN_SOURCE);
EXTI_InitStructure.EXTI_Line = ADS1210_DRDY2_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);



обработчик выглядит примерно так:

CODE

void EXTI1_IRQHandler(void)
{
#if 0
if(EXTI_GetITStatus(ADS1210_DRDY1_EXTI_LINE) != RESET)
{
/* Toggle LED3 */
STM32vldiscovery_LEDToggle(LED3);

/* Clear EXTI line pending bit */
EXTI_ClearITPendingBit(ADS1210_DRDY1_EXTI_LINE);
}
#endif

if(EXTI_GetITStatus(ADS1210_DRDY2_EXTI_LINE) != RESET)
{
/* Toggle LED4 */
STM32vldiscovery_LEDToggle(LED4);

/* Clear EXTI line pending bit */
EXTI_ClearITPendingBit(ADS1210_DRDY2_EXTI_LINE);
}

}


ну и нвик я настраивал примерно так:

CODE

/* Enable and set Button EXTI Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = ADS1210_DRDY1_EXTI_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0f;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;



NVIC_InitStructure.NVIC_IRQChannel = ADS1210_DRDY2_EXTI_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0f;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


может у меня в настройке нвика ошибка, как мне EXTI поместить в обин обработчик?

входы DRDY a1 b1 c1 - типа чтоб на одно exti посадить.
KnightIgor
Мне кажется, общий подход не верен: напротив, надо использовать различные EXTI линии, чтобы не прозевать сигналы (например a1, a2 и a3), если они взведутся одновременно. Уж потом свести обработку в одну процедуру, передав ей в качестве параметра номер сигнала.
sevastianovd
архитектура stm32 построена так, что вы не сможете "объединить по или" exti где-либо внутри процессора,
единственно, что линии 5-9 и 10-15 объединены на один вектор в nvic, обработчик может выглядеть так:
Код
void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line5) != RESET)
  {
    EXTI_ClearITPendingBit(EXTI_Line5);
  }
  if(EXTI_GetITStatus(EXTI_Line6) != RESET)
  {
    EXTI_ClearITPendingBit(EXTI_Line6);
  }
}

или как-то так
Код
void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line5) != RESET | EXTI_GetITStatus(EXTI_Line6) != RESET)
  {
...

но тут надо придумать как снять нужный флаг...
inventor
спасибо.
именно так и сделал (EINT от 5-го до 9-го)
я смотрел на дадашит там каждый номер ноги объединяется на один источник и я поэтому подумал что могут быть на одном прерываннии 1-е ноги всех портов так и 2-е и 3-и.
сейчас работают 6 7 и 8 порты.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.