Forum: Mikrocontroller und Digitale Elektronik STM32F4 Flags


von Florian K. (f-kae)


Lesenswert?

Hallo zusammen,

mal wieder eine Frage zum STM32F4, diesmal geht es um die Flags.

Ich möchte mit einem Timer die Dauer zwischen einer rising-edge und 
falling-edge bestimmen. Hierfür habe ich zwei inputcaptures angelegt.

Wenn ich nun in dem Interrupthandler TIM3_IRQHandler auf die 
entsprechenden Ereignisse reagieren möchte benötige ich die 
entsprechenden Flags.

Wo liegt da der Unterschied zwischen:

•TIM_FLAG_Update     &     •TIM_IT_Update
bzw.
•TIM_FLAG_CC1        &     •TIM_IT_CC1

Muss ich unbedingt beide behandeln oder reicht es nur die IT-Flags 
abzufragen und zurückzusetzen?

Viele Grüße,
Florian

von Florian K. (f-kae)


Lesenswert?

Kann mir niemand den Unterschied zwischen den Flags erklären, bzw. wofür 
ich welche Flags benutze...

von Dr. Sommer (Gast)


Lesenswert?

Florian K. schrieb:
> Kann mir niemand den Unterschied zwischen den Flags erklären, bzw. wofür
> ich welche Flags benutze...
TIM_IT_Update ist das Update-Flag, und TIM_IT_CC1 ist das 
Capture/Compare flag. Siehe Reference Manual S. 423, die gezackten 
Pfeile im Diagramm.

von Florian K. (f-kae)


Lesenswert?

Dr. Sommer schrieb:
> Florian K. schrieb:
>> Kann mir niemand den Unterschied zwischen den Flags erklären, bzw. wofür
>> ich welche Flags benutze...
> TIM_IT_Update ist das Update-Flag, und TIM_IT_CC1 ist das
> Capture/Compare flag. Siehe Reference Manual S. 423, die gezackten
> Pfeile im Diagramm.

Vielen Dank für die Antwort, mich interessierte aber eher der 
Unterschied zwischen:

TIM_FLAG_Update     &     TIM_IT_Update

Also mir ist schon klar, dass das IT für Interrupt steht, aber was fange 
ich dann mit dem TIM_FLAG_Update an?

Also das TIM_IT_Update kommt wenn ich Interrupts aktiviert habe und der 
Timer überläuft und TIM_FLAG_Update ist gesetzt wenn der Timer überlauft 
unabhängig vom Interrupt.
Wenn ich eins zurücksetze, wird dann automatisch auch das andere Flag 
zurückgesetzt und der Timer resettet?

Bzw. meine eigentliche Frage bezieht sich vielleicht eher auf diese 
Frage:
Wenn ich Interrupts aktiviert habe für den entsprechenden Timer, kann 
ich dann komplett alle abfragen und "FLAG-resets" auf das TIM_IT_Update 
beschränken oder muss ich auch das TIM_FLAG_Update handeln?

von Uwe B. (derexponent)


Lesenswert?

schau doch einfach im Quellcode nach wie es programmiert ist


hier das reseten vom "TIM_FLAG_Update"
1
#define TIM_FLAG_Update                    ((uint16_t)0x0001) 
2
3
* @brief  Clears the TIMx's pending flags.
4
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
5
{  
6
  /* Check the parameters */
7
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
8
   
9
  /* Clear the flags */
10
  TIMx->SR = (uint16_t)~TIM_FLAG;
11
}

und hier das reseten vom "TIM_IT_Update"
1
#define TIM_IT_Update                      ((uint16_t)0x0001)
2
3
* @brief  Clears the TIMx's interrupt pending bits.
4
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
5
{
6
  /* Check the parameters */
7
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
8
9
  /* Clear the IT pending Bit */
10
  TIMx->SR = (uint16_t)~TIM_IT;
11
}

wie man sieht machen beide Funktionen das gleiche
es gibt nämlich nur ein einzelnes Flag für "TIM_UPDATE"

die Funktion "TIM_GetFlagStatus" ließt direkt dieses Bit aus
die Funktion "TIM_GetITStatus" prüft noch zusätzlich
ob der Interrupt aktiviert war

es reicht also in der ISR
das Flag zu prüfen per "TIM_GetITStatus"
und falls gesetzt per "TIM_ClearITPendingBit" zu reseten

Gruss Uwe

von Florian K. (f-kae)


Lesenswert?

Oh,
damit hätte ich jetzt nicht gerechnet. Vielen Dank für die Information 
hierzu!
Gruß,
Florian

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
Noch kein Account? Hier anmelden.