Давно терзает меня вопрос, почему в момент инициализации NVIC_Init(&NVIC_InitStructure); может возникнуть прерывание?
Выглядит это так, как будто в момент запуска МК, в регистре EXTI->PR уже заранее что то есть, и когда включаем NVIC произсходит прерывание.
Микроконтроллер STM32F100C4
Вот код:
CODE
void InitButton()
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitTypeDefStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*Включили тактирование AFIO на шине APB2. Этот блок отвечает за внешние прерывания как AF*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// Configure PB.13/13/14 as Input
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//Подключаем порт к прерыванию
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
EXTI_InitTypeDefStructure.EXTI_Line = EXTI_Line12 | EXTI_Line13 | EXTI_Line14;
EXTI_InitTypeDefStructure.EXTI_LineCmd = ENABLE;
EXTI_InitTypeDefStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitTypeDefStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitTypeDefStructure);
//EXTI_ClearITPendingBit(EXTI_Line12 | EXTI_Line13 | EXTI_Line14);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
};
void EXTI15_10_IRQHandler()
{
if (EXTI_GetITStatus(EXTI_Line12) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line12);
}
else if (EXTI_GetITStatus(EXTI_Line13) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line13);
}
else if (EXTI_GetITStatus(EXTI_Line14) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line14);
};
};
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitTypeDefStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*Включили тактирование AFIO на шине APB2. Этот блок отвечает за внешние прерывания как AF*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// Configure PB.13/13/14 as Input
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//Подключаем порт к прерыванию
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
EXTI_InitTypeDefStructure.EXTI_Line = EXTI_Line12 | EXTI_Line13 | EXTI_Line14;
EXTI_InitTypeDefStructure.EXTI_LineCmd = ENABLE;
EXTI_InitTypeDefStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitTypeDefStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitTypeDefStructure);
//EXTI_ClearITPendingBit(EXTI_Line12 | EXTI_Line13 | EXTI_Line14);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
};
void EXTI15_10_IRQHandler()
{
if (EXTI_GetITStatus(EXTI_Line12) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line12);
}
else if (EXTI_GetITStatus(EXTI_Line13) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line13);
}
else if (EXTI_GetITStatus(EXTI_Line14) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line14);
};
};
Перед Инициализацией NVIC пробовал очищать регистр прерываний EXTI командой
EXTI_ClearITPendingBit(EXTI_Line12 | EXTI_Line13 | EXTI_Line14);
После этого вроде как всё нормально.
Но почему так!?
Пины настраивал и внутренней и с внешней подтяжкой, но это не влияет. Внешняя подтяжка достаточная. Еще на STM32L152 такое явление замечал.