Hello,
I write firmware for STM32F10x microcontroller.
I use IAR evaluation board and Workbench for developing and debugging.
Problem Description:
--
I tried to use one of the evaluation board buttons as a source for external interrupt.
I used EXTI example as a reference for writing the code.
Press on the button really causes corresponding interrupt generation.
The only problem is that I get an interrupt right after I enable it in NVIC module (I don't press on the button at this time)
My code:
int main()
{
u32 i,j;
GPIO_TypeDef* GPIOx;
u8 bitVal;
#ifdef DEBUG
debug();
#endif
/* System clocks configuration */
RCC_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
NVIC_Configuration();
GPIO_Configuration();
EXTI_Configuration();
while(1)
{
}
}
where
void GPIO_Configuration(void)
{
GPIO_InitStruct->GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct->GPIO_Speed = 0;
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStruct); // Port C bit 4
}
void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the EXTI4_IRQChannel */
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_ClearIRQChannelPendingBit(EXTI4_IRQChannel);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource4); // Port C Bit 4
EXTI_InitStruct.EXTI_Line = EXTI_Line4;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
EXTI_ClearITPendingBit(EXTI_Line4);
}
How can I prevent the redundant interrupt generation?
Please help.
Last edited by delphin (2008-11-23 08:55:20)