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
Kann mir niemand den Unterschied zwischen den Flags erklären, bzw. wofür ich welche Flags benutze...
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.
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.