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

 
 
> STM32F407 внешние прерывания на линии 5_9
Mister_DSP
сообщение Dec 17 2016, 09:38
Сообщение #1


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

Группа: Участник
Сообщений: 133
Регистрация: 5-11-16
Пользователь №: 94 050



Доброе время суток!

Так уж получилось, что приходится использовать Port C8 для ножки внешнего прерывания с устройства.
Я чуть не пророс, когда увидел, что порты с номерами 5,6,7,8,9 объединены в один обработчик прерывания - в Keil это функция EXTI9_5_IRQHandler().
Ранее на макете были линии 0 и 4 (на них линии и обработчики прерываний по-отдельности и о подвохах не догадывался).

Пока код использую такой (он рабочий).

Инициализация(здесь в тексте много опущено для упрощения):
CODE
GPIO_InitTypeDef gpio;
EXTI_InitTypeDef exti;
NVIC_InitTypeDef nvic;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

GPIO_StructInit(&gpio);

//INPUT
//C8=>IRQ !!!
gpio.GPIO_Pin=GPIO_Pin_8;
gpio.GPIO_Mode=GPIO_Mode_IN;
gpio.GPIO_Speed=GPIO_Speed_25MHz; //!!!
gpio.GPIO_OType=GPIO_OType_PP;
gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC,&gpio);

//IRQ C8
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource8);

exti.EXTI_Line=EXTI_Line8;
exti.EXTI_LineCmd=ENABLE;
exti.EXTI_Mode=EXTI_Mode_Interrupt;
exti.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&exti);

nvic.NVIC_IRQChannel=EXTI9_5_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority=0;
nvic.NVIC_IRQChannelSubPriority=0;
nvic.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&nvic);


Сам обработчик:
Код
void EXTI9_5_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line8)!=RESET) //Make sure that interrupt flag is set
{

  //Тут код полезной нагрузки.......


  EXTI_ClearITPendingBit(EXTI_Line8); //Clear interrupt flag
  
  return; //для надёжности - на одном сайте говорили что лучше так принудительно выходить :)
}
}


За CMSIS и SPL не пинайте, так как не являюсь фанатом КУБа и его HAL.

Вопрос вот в чём:
Я использую одну из ножек порта C - линию 8 для прерывания (настроена на ввод). Этот же порт C я использую для аппаратного SPI + ещё другие линии отдельно как GPIO на вывод.

Можно ли в обработчике не делать проверку:
Код
if(EXTI_GetITStatus(EXTI_Line8)!=RESET)......


а сразу приступать к полезной нагрузке? При условии что более нет прерываний на C5,6,7,9 ? И линия 8 также не используется по прерываниям.

И когда правильнее сбрасывать бит прерывания - ДО или ПОСЛЕ полезной нагрузки?
Код
EXTI_ClearITPendingBit(EXTI_Line8); //Clear interrupt flag


Сообщение отредактировал IgorKossak - Dec 17 2016, 12:14
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!


--------------------
SPY vs. SPY
Хорошо там, где нет ничего...
Go to the top of the page
 
+Quote Post



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

 


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


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