Forum: Mikrocontroller und Digitale Elektronik STM32F103 RTC Flag Reset


von Leopold N. (leo_n)


Angehängte Dateien:

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

von Niklas G. (erlkoenig) Benutzerseite


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.

von Leopold N. (leo_n)


Angehängte Dateien:

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.

von Niklas G. (erlkoenig) Benutzerseite


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
}

von Leopold N. (leo_n)


Lesenswert?

Mag mich jetzt net über solch unwichtige Sachen streiten.

Dein Vorschlag mit einfach Null setzen funzt auch net.

Sonst noch Ideen?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Leopold N. (leo_n)


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

von Niklas G. (erlkoenig) Benutzerseite


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?

von Leopold N. (leo_n)


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

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Leopold N. schrieb:
> Aber wenn ich das Bit lösche, sehe ich das in der ISR nicht.

Nicht sofort, erst nachdem der Zugriff über die Taktgrenzen 
synchronisiert wurde, d.h. nach der Schleife am Ende. Die ist aber 
vermutlich gar nicht nötig, wenn du sonst nichts mit der RTC machst.

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.