Hey, ich habe ein kleines problem mit den interrupts bei meinem discovery. ich habe auf 2 pins einen interrupt auf toggle gesetzt. wenn ich jetzt mit einem kabel GND verbinde, ändert eine LED die beim interrupt ausgelöst wird, leider nicht jedes mal den zustand. es scheint als würden die flanken nicht registriert werden. hier mal der code: void Configure_PB15_PB14(void) { /* Set variables used */ GPIO_InitTypeDef GPIO_InitStruct; EXTI_InitTypeDef EXTI_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; /* Enable clock for GPIOD */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /* Enable clock for SYSCFG */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Set pin as input */ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource15); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14); EXTI_InitStruct.EXTI_Line = EXTI_Line15 | EXTI_Line14; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStruct); /* Add IRQ vector to NVIC */ /* PD0 is connected to EXTI_Line0, which has EXTI0_IRQn vector */ NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn; /* Set priority */ NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; /* Set sub priority */ NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; /* Enable interrupt */ NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; /* Add to NVIC */ NVIC_Init(&NVIC_InitStruct); } void EXTI15_10_IRQHandler(void) { /* Make sure that interrupt flag is set */ if (EXTI_GetITStatus(EXTI_Line15) != RESET) { /* Do your stuff when PD0 is changed */ if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)) { GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_SET); //orange } else { GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_RESET); } /* Clear interrupt flag */ EXTI_ClearITPendingBit(EXTI_Line15); } if (EXTI_GetITStatus(EXTI_Line14) != RESET) { /* Do your stuff when PD0 is changed */ if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)) { GPIO_WriteBit(GPIOD,GPIO_Pin_14,Bit_SET); //rot } else { GPIO_WriteBit(GPIOD,GPIO_Pin_14,Bit_RESET); } /* Clear interrupt flag */ EXTI_ClearITPendingBit(EXTI_Line14); } }
Vermutlich werden die Flanken durchaus registriert, sogar viel mehr, als dir lieb ist. Wenn z.B. 41 Flanken registriert werden, wechselt die LED den Zustand, bei 42 Flanken scheinbar nicht, weil sie am Ende wieder im gleichen Zustand ist. Mit "Kabel gegen GND" erzeugt man unfreiwillig viel mehr als eine Flanke. Und die EXTI Interrupts werden überhaupt nicht gefiltert (zumindest nicht von der STM32F2xx-Hardware).
Alex schrieb: > ich habe auf 2 pins einen interrupt auf toggle gesetzt. Nö. Wenigstens nicht wenn ich das hier richtig interpretiere: > EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; Also kein Interrupt auf der fallende Flanke.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.