Hallo zusammen,
ich steige (seit Monaten) vom AVR auf STM32 um. Was ich beim AVR toll
finde ist, wie einfach man beim GPIO-Pins zwischen Ein- und Ausgang
umschalten kann (Datenrichtungsregister DDR). Beim STM32F10x ist es ja
etwas komplizierter, da die Konfiguration von Ein- und Ausgängen etwas
unhandlich in den Registern GPIOx_CRL und GPIOx_CRH verteilt ist. Die
CMSIS-Library führt diese Berechnungen zur Laufzeit durch, was mir nicht
gefällt, weil ich eigentlich nur zwei Pins ständig umschalten will, um
Statusflags zu lesen.
Hat sich schon jemand die Mühe gemacht, Präprozessormagie mit Bitbanding
zu betreiben, daß das ähnlich einfach wie beim AVR geht?
Ich weiß: "Selbst ist der Mann". Aber insbesondere in Präprozessormagie
bin ich nicht besonders fit und es dauert lange zu testen.
Viele Grüße
W.T.
Wozu brauchst du die Umschaltung? Die wird beim STM32 nicht annähernd so
oft benötigt, weil die Pins von Haus aus über eine Open Drain
Konfiguration verfügen. Während AVRs für O.D. die Richtungsumschaltung
bemühen müssen, z.B. bei 1-Wire.
Soll heissen: Ein Open Drain Output auf 1 ist effektiv ein Input.
Hallo A.K.,
open drain kann der kleine AVR auch prima, für meinen Anwendungsfall
(bidirektionaler Datenbus) wäre mir allerdings ein schnelles Umschalten
zwischen push-pull und floating input lieber
Open drain wäre hier allenfalls eine Notlösung - bevor ich das
akzeptiere, schließe ich mich lieber das ganze nächste Wochenende mit
einem C-Buch und einem karierten Block im Badezimmer ein :-)
Viele Grüße
W.T.
Ja, den habe ich schon gelesen. Insbesonder "__builtin_clz(mask)" sieht
so aus, als könnte es das Wochenende etwas verkürzen.
Aber noch gebe ich die Hoffnung nicht auf, daß es das schon in fertig
gibt - seltenheitswert hat die Problemstellung ja vermutlich eher nicht.
Walter Tarpan schrieb:> Ja, den habe ich schon gelesen. Insbesonder "__builtin_clz(mask)" sieht> so aus, als könnte es das Wochenende etwas verkürzen.
Nur wenn du die Nummer des Pins nicht kennst und mit der Maske arbeiten
musst. Bei I/O-Pins wäre das etwas merkwürdig.
A. K. schrieb:> [...] und mit der Maske arbeiten> musst [...]
Mit der Maske werde ich arbeiten müssen - schließlich will ich ja nicht
nur einen Pin umschalten. Aber nicht mehr heute. Erst nächstes
Wochenende.
Bitbanding wird dir beim F10x auch nicht so arg viel helfen, da die
CNF/MODE Bits das nicht in einem einzelnen Bit hergeben. Bei den etwas
sinnigere definierten Ports vom F4xx hingegen geht das.
Aber wenn du damit trotzdem rumspielen willst: Die Aufteilung der CNF
Register in Lo/Hi braucht dich beim Bitbanding nicht zu stören. Denn mit
BBPeriphBit(GPIOA->CRL, 11*4) /* Pin 11 */
erreichst du automatisch das eigentlich zuständige CRH.
Walter Tarpan schrieb:> Mit der Maske werde ich arbeiten müssen - schließlich will ich ja nicht> nur einen Pin umschalten.
Das geht mit Bitbanding nicht. Damit kannst du nur 1 Bit ansprechen.
PS: Viel Spass im Bad. Also dann bis Montag. ;-)
A. K. schrieb:> Das geht mit Bitbanding nicht. Damit kannst du nur 1 Bit ansprechen.
Oh, der STM32 ist aber eine Mimose.
Naja, was solls. Ganz so knifflig war es dann doch nicht, einen ganzen
(8-Bit) Port umzuschalten, wobei ich mich allerdings auch nicht auf
Präprozessormagie verlassen habe:
Aber ich wüßte auch nicht, daß es noch schneller gehen könnte (?)
Wahlfrei einen ganzen Port umschalten geht noch nicht, aber fürs erste
reicht's.
Viele Grüße
W.T.
Walter Tarpan schrieb:> Oh, der STM32 ist aber eine Mimose.
Für Bitbanding ist ARM verantwortlich, nicht ST. Du bräuchtest
Bitfeld-Operationen im Speicher und das bieten ARM Prozessoren nicht
(MCUA: dein Einsatz ;-).
> Naja, was solls. Ganz so knifflig war es dann doch nicht, einen ganzen> (8-Bit) Port umzuschalten
Davon war bisher ja auch nicht die Rede. Die unteren oder oberen 8 Bit
geschlossen umzuschalten ist trivial.
Walter Tarpan schrieb:> #warning "not tested yet"
Es scheint mir sinnvoller, CRL/CRH in Vars zu laden, dort zu verändern
und dann zurück zu speichern. Das wird einerseits etwas effizienter
sein. Insbesondere vermeidet es aber jene falschen Zwischenzustände bei
der Portkonfiguration, die bei dir auftreten werden.