STM32 TIM_ICPolarity nachträglich ermitteln?

Gast #3888409
Lesenswert?

Timer Input capture kann m.W. auf "TIM_ICPolarity_Rising", 
"TIM_ICPolarity_Falling", "TIM_ICPolarity_BothEdge" eingestellt werden. 
Ist es bei "TIM_ICPolarity_BothEdge" möglich, im Interrupt 
herauszufinden, welche Flanke ihn ausgelöst hat? Gibt es evtl. ein 
Zwischenregister oder bleibt nur, den Pinstatus einzulesen?
(Firma: matzetronics) #3888495
Lesenswert?

Hans schrieb:
> Es ist zwar unwahrscheinlich anders, aber: man kann nicht sicher sein,
> dass der eingelesene Zustand der auslösenden Flanke entspricht.

Wie meinst du das? In der o.a. Sensorplausibilitätsprüfung klappt das 
immer, denn die Flanke hat ja auf jeden Fall den Interrupt ausgelöst, 
muss also da gewesen sein.
Der STM32F100 jedenfalls findet daran nichts ungewöhnlich:
1
// es gibt noch 2 andere IRQ Lines, hier mal nur eine
2
void EXTI0_IRQHandler(void)
3
{
4
  if(EXTI_GetITStatus(HALL1_EXTI_LINE) != RESET)
5
  {
6
    /* Clear the EXTI line pending bit */
7
    EXTI_ClearITPendingBit(HALL1_EXTI_LINE);
8
     HallIRQ();
9
  }
10
}
11
// hier werden Events aller 3 Sensoren behandelt
12
void HallIRQ() {
13
  EXTI_ClearFlag(EXTI_Line0 | EXTI_Line1 | EXTI_Line2);
14
volatile uint16_t hall = GetHall();
15
    // spurious trap - this routine should only be fired if we have a
16
    // valid sensor change
17
if (lastHall != hall ) {
18
// hier passieren motorspezifische Dinge
19
}
20
// und hier das nochmalige Abfragen der IRQ Lines
21
uint16_t GetHall(void) {
22
volatile uint16_t hall;
23
        hall = HALL_GPIO_PORT->IDR & HALLMASK;
24
// wieder die tollen Dinge meiner Motorcontrol
25
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren