реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> как на одно прерывание посадить ножки GPIO ?, На STM32
inventor
сообщение Feb 14 2012, 13:24
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Подключаю к плате 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 посадить.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Feb 14 2012, 19:13
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Мне кажется, общий подход не верен: напротив, надо использовать различные EXTI линии, чтобы не прозевать сигналы (например a1, a2 и a3), если они взведутся одновременно. Уж потом свести обработку в одну процедуру, передав ей в качестве параметра номер сигнала.
Go to the top of the page
 
+Quote Post
sevastianovd
сообщение Feb 15 2012, 02:09
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 8-04-08
Из: Омск
Пользователь №: 36 562



архитектура 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)
  {
...

но тут надо придумать как снять нужный флаг...
Go to the top of the page
 
+Quote Post
inventor
сообщение Feb 15 2012, 15:53
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



спасибо.
именно так и сделал (EINT от 5-го до 9-го)
я смотрел на дадашит там каждый номер ноги объединяется на один источник и я поэтому подумал что могут быть на одном прерываннии 1-е ноги всех портов так и 2-е и 3-и.
сейчас работают 6 7 и 8 порты.

Сообщение отредактировал IgorKossak - Feb 15 2012, 17:56
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 22:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01368 секунд с 7
ELECTRONIX ©2004-2016