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

 
 
> NVIC прерывание от EXTI в момент NVIC_Init, Почему!?
Basilij
сообщение Oct 22 2012, 10:35
Сообщение #1


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

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Здравствуйте господа.

Давно терзает меня вопрос, почему в момент инициализации 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);
};
};


Перед Инициализацией NVIC пробовал очищать регистр прерываний EXTI командой
EXTI_ClearITPendingBit(EXTI_Line12 | EXTI_Line13 | EXTI_Line14);
После этого вроде как всё нормально.
Но почему так!?

Пины настраивал и внутренней и с внешней подтяжкой, но это не влияет. Внешняя подтяжка достаточная. Еще на STM32L152 такое явление замечал.
Go to the top of the page
 
+Quote Post



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

 


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


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