Hallo, habe bei den 8-Bittern schon oft delay_us(), atomic_block(){} verwendet. Für den SAM-4S finde ich die Bibliotheken nicht (verwende auch ASF). - Gibt es irgendwo Ersatz für delay_us()? - Wo finde ich atomic_block(RESTORESTATE){}? Das muss es doch auch für den SAM geben?
Das hier sollte für alle Cortex-M funktionieren: Beitrag "atomic-lib für stm32" Ein delay_us-Ersatz müsste mit Timern arbeiten und wäre daher stark von deiner Anwendung abhängig.
Alexxx schrieb: > Für den SAM-4S finde ich die Bibliotheken nicht (verwende auch ASF). > - Gibt es irgendwo Ersatz für delay_us()? Ich hatte mal einen Ersatz für die Cortex-M0+ geschrieben (SAMD21 etc.), aber ich denke, auf einem Cortex-M3 hat das kaum noch Sinn. Nimm lieber einen Timer. > - Wo finde ich atomic_block(RESTORESTATE){}? Das muss es doch auch für > den SAM geben? Hat niemand als Bibliothek gebaut und geliefert, aber die Ideen kannst du dir natürlich aus der avr-libc klauen. Den Interruptstatus ermittelst du mit __get_PRIMASK(), die Interrupts werden mit __disable_irq() ausgeschaltet. Den von __get_PRIMASK() erhaltenen Wert übergibst du am Ende dann einem __set_PRIMASK(). Also etwa so:
1 | int intstatus = __get_PRIMASK(); |
2 | __disable_irq(); |
3 | // interrupt-protected code goes here
|
4 | __set_PRIMASK(intstatus); |
Allerdings bist du natürlich hier dahingehend komfortabler als auf einem 8-Bitter, dass du bereits 32-bit-Integers ohnehin "atomic" im Zugriff hast.
So in der Art kann man ein "taktgenaues" Delay bauen: https://github.com/Erlkoenig90/stm32delay/blob/master/src/mysleep.S Das muss man aber auf die konkrete Anwendung "kalibrieren", d.h. die gewünschte Taktzahl auf die zugehörigen Iterationen umrechnen. Je nach Flash/RAM-Anbindung, Prescalern usw. kann das variieren, und 100% genau ist es nie. Im Beispiel wird gerechnet: Iterationen = (Takte - 29) / 8 Der Code wird aus dem RAM ausgeführt um Flash-Caches zu umgehen.
@Jörg W
Vielen Dank für den Hinweis auf ...PRIMASK()!
>> ...Nimm lieber einen Timer.
Ich brauche 1-2 µs. 8-(
Alexxx schrieb: >>> ...Nimm lieber einen Timer. > Ich brauche 1-2 µs. 8-( Auch dafür eignen sich Timer. Haben den Vorteil, dass du ohne irgendwelche Verrenkungen problemlos ein exaktes Delay bekommen kannst.
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.