STM32F103 RTC Flag Reset

#5809479
Lesenswert?

Hallo,

ich generiere mit der RTC den Second Interrupt und muss laut RM0008 dann 
das SECF Flag in RTC_CRL löschen.
Leider macht der µC das aber nicht, weshalb der Interrupt dauernd 
hintereinader aufgerufen wird.
Code im Anhang.

Grüße
Angehängte Dateien:
Persönliche Seite #5809482
Lesenswert?

Dein Code enthält ziemlich wenige allgemein bekannte C-Elemente 
(extern,void,while) und ziemlich viele geheime Bezeichner 
"bit_is_clear", "RTC_CRL", "sbi", "cbi", "bit_is_clear", ohne deren 
Definition keiner weiß, was da passiert.

Das "extern" ist an Funktionen überflüssig, und an einer 
Funktions-Definition widersinnig.
#5809486
Lesenswert?

Niklas G. schrieb:
> Dein Code enthält ziemlich wenige allgemein bekannte C-Elemente
> (extern,void,while) und ziemlich viele geheime Bezeichner
> "bit_is_clear", "RTC_CRL", "sbi", "cbi", "bit_is_clear", ohne deren
> Definition keiner weiß, was da passiert.
>
> Das "extern" ist an Funktionen überflüssig, und an einer
> Funktions-Definition widersinnig.

Das extern ist nicht überflüssig, da die ISR in der Vectortable mit 
pubweak definiert ist. Habs ausprobiert, glaub mir...

bit_is_clear ist eine Mnemonik - sollte klar sein was das macht, falls 
nicht - siehe Anhang. Gleiches für sbi und cbi.
Angehängte Dateien:
Persönliche Seite #5809497
Lesenswert?

Leopold N. schrieb:
> Das extern ist nicht überflüssig, da die ISR in der Vectortable mit
> pubweak definiert ist. Habs ausprobiert, glaub mir...

Ah, IAR-spezifisch? "extern" bedeutet bei Variablen "diese Variable 
ist hier nicht definiert, kommt aber später". Diese Logik wäre bei 
einer Funktions-Definition etwas komisch, wenn extern bei Funktionen 
denn überhaupt eine Wirkung hätte, was bei Standard-C nicht der Fall 
ist. Ziemlich sicher nicht funktionieren würde es allerdings mit 
"static".

Leopold N. schrieb:
> bit_is_clear ist eine Mnemonik

Mnemoniks gibt's nur in Assembler, nicht in C.

Leopold N. schrieb:
> sollte klar sein was das macht
Woher? Nur weil es in AVR-Assembler zufällig ein paar Instruktionen gibt 
die genau so heißen?

Leopold N. schrieb:
> falls
> nicht - siehe Anhang. Gleiches für sbi und cbi.
Da sehe ich nur Makros, keine "Mnemoniks".

Deine Makros machen mehrere sinnlose Read-Modify-Write-Zyklen. Mache 
doch mal ganz schlicht:
1
void ISR_RTC(void) {
2
  if (RTC_CRL & RTC_CRL_SECF) {
3
    RTC_CRL = 0;
4
    while(bit_is_clear(RTC_CRL, RTC_CRL_RTOFF));
5
  }
6
}
#5809512
Lesenswert?

Niklas G. schrieb:
> Leopold N. schrieb:
>> Dein Vorschlag mit einfach Null setzen funzt auch net.
>
> Kannst du im Debugger sehen, ob das "SECF" Flag kurz auf 0 geht?
>
> Leopold N. schrieb:
>> Mag mich jetzt net über solch unwichtige Sachen streiten.
> Die unwichtigen Makro-Definitionen verhindern halt, dass man den Code
> lesen kann.

Ich habe jetzt einfach mal nen Pin togglen lassen, um die wirkliche 
Frequenz zu sehen und sie stimmt haargenau... vielleicht wird das Bit 
erst gelöscht, wenn man die ISR verlässt. Löschen muss man es trotzdem 
in Software, sonst klappts net.

Danke für die Hilfe
Grüße
Persönliche Seite #5809523
Lesenswert?

Leopold N. schrieb:
> vielleicht wird das Bit
> erst gelöscht, wenn man die ISR verlässt.

Unwahrscheinlich, die RTC-Peripherie weiß nichts davon ob sich der 
Prozessorkern in einer ISR befindet oder nicht. Das Schreiben auf 
RTC-Register ist aber verzögert.

Leopold N. schrieb:
> Ich habe jetzt einfach mal nen Pin togglen lassen, um die wirkliche
> Frequenz zu sehen und sie stimmt haargenau...
Woran lag's jetzt? War's von Anfang an richtig?
#5809529
Lesenswert?

Niklas G. schrieb:
> Leopold N. schrieb:
>> vielleicht wird das Bit
>> erst gelöscht, wenn man die ISR verlässt.
>
> Unwahrscheinlich, die RTC-Peripherie weiß nichts davon ob sich der
> Prozessorkern in einer ISR befindet oder nicht. Das Schreiben auf
> RTC-Register ist aber verzögert.
>
> Leopold N. schrieb:
>> Ich habe jetzt einfach mal nen Pin togglen lassen, um die wirkliche
>> Frequenz zu sehen und sie stimmt haargenau...
> Woran lag's jetzt? War's von Anfang an richtig?

Ja sieht so aus.
Aber wenn ich das Bit lösche, sehe ich das in der ISR nicht. Gelöscht 
wirds aber scheinbar trotzdem

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