Доброе время суток!
Так уж получилось, что приходится использовать 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
Хорошо там, где нет ничего...