2013-09-09 08:04 AM
Hi,
I try to set a software interrupt. I set it as follows: &sharpdefine HZ500_EXT_INT_LINE EXTI_Line1 &sharpdefine HZ500_EXT_INT_IRQ EXTI1_IRQn &sharpdefine HZ500_EXT_INT_PREEMPTION 1 &sharpdefine HZ500_EXT_INT_SUB 2 void init_500hz_event_interrupt(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Configure EXTI Line1 */ EXTI_InitStructure.EXTI_Line = HZ500_EXT_INT_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable and set EXTI1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = HZ500_EXT_INT_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = HZ500_EXT_INT_PREEMPTION; NVIC_InitStructure.NVIC_IRQChannelSubPriority = HZ500_EXT_INT_SUB; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } I have an ISR routine that is triggered by an external interrupt and it should trigger the software interrupt, I use the following command in order to trigger the software interrupt: EXTI_GenerateSWInterrupt(HZ500_EXT_INT_LINE); Unfortunately the software interrupt is not trigered. Am I missing something? The ISR for the interrupt routine is defined as follows: &sharpdefine HZ500_EXT_INT_HANDLER EXTI1_IRQHandler void HZ500_EXT_INT_HANDLER(void) { static uint8_t hz_100_creation; EXTI_ClearITPendingBit(HZ500_EXT_INT_LINE); TOGGLE_TP23; read_ppg_led_registers(); hz_100_creation++; if(hz_100_creation >= HZ_100_COUNT) { hz_100_creation = 0; &sharpifdef RAW_DATA_MODE dls_dicmation(); &sharpelse dls_100hz_section(); &sharpendif /* RAW_DATA_MODE */ } } Thank you for your help #exti #event #stm32-exti-software-interrupt" #software-interrupt"2013-09-09 01:26 PM
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
2013-09-09 11:29 PM
But since SYSCFG_EXTICR1 = 0; transitions on PA1 will cause interrupt too, I don't want the external port to cause interrupt
2013-09-10 01:17 AM
I found a solution
I cancelled the lines: EXTI_InitStructure.EXTI_Line = HZ500_EXT_INT_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); instead of using EXTI_GenerateSWInterrupt I use NVIC->STIR = HZ500_EXT_INT_IRQ; Clive's solution works but it also causes external interrupt from the port and not only software interrupts, so it's not good for my purposes. I though setting the type to event will disable external interrupts but will enable software interrupts using EXTI_GenerateSWInterrupt. I was wrong. If anyone has a better way of doing it or if my solution is not a healthy one I will be extremely happy to hear about it Thank you2013-10-16 04:32 AM
Hi
I have had the same problem and found another solution: EXTI->RTSR = 0x0000;EXTI->FTSR = 0x0000; This will disable rising and falling edge trigger detection. There will be no trigger from external pin. I recommend updating the library to have this option, doing the above:EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Software_Only; I am open to other suggestions.