Forum: Mikrocontroller und Digitale Elektronik ARM Cortex-M3 – Mehrere Output-Pins gleichzeitig ansprechen


von Lars (Gast)


Lesenswert?

Hallo,

wenn ich bei den herkömmlichen 8bit-AVRs etwas parallel auf einen Port 
ausgeben (also z.B. mehrere LEDs ansteuern) möchte, mache ich das ja 
z.B. so:

PORTC = 0x03;

Da die Portstruktur bei den ARM Cortex-M3 etwas komplexer ist, ist mir 
bisher nur die Möglichkeit über das BSRR in den Sinn gekommen. (Ausgänge 
auf Push-Pull geschaltet.) Der Lower Teil des Registers also zum Setzen 
auf „1“ und der Higher Teil des Registers zum Rücksetzen auf „1“  Also 
würde ich das so machen.

GPIOC->BSRR = 0xFFFC0003

Das funktioniert auch soweit.
Würdet ihr das auch so machen und gibt’s eventuell auch noch eine andere 
oder einfachere Variante mehrere Output-Pins (LEDs) gleichzeitig 
anzusteuern.

von kyrel (Gast)


Lesenswert?

Hallo Lars,

verstehe ich das richtig, du Setzt und Rücksetzt die Pins, spirch 
Toggeln indem du

GPIOC->BSRR = 0xFFFC0003

in einer Zeile schreibst? Das funktioniert?

Ich arbeite mit dem STM32, da kann ich Pegel Setzen bzw. Rücksetzen, 
indem entweder high- bzw. low-halfword setze.

Hast Du das so gemeint, oder geht das wirklich in einer Zeile?

Gruß

kyrel

von (prx) A. K. (prx)


Lesenswert?

Das BSRR ist der richtige Weg. Beachte, das die unteren 16 Bits Vorrang 
vor den oberen 16 Bits haben, d.h. wenn du Bits 4..11 auf einen 
bestimmten Wert setzen willst ohne die übrigens Bits zu ändern:
   port->BSRR = 0x0FF00000 | (value & 0x0FF0);

von (prx) A. K. (prx)


Lesenswert?

kyrel schrieb:

> verstehe ich das richtig, du Setzt und Rücksetzt die Pins, spirch
> Toggeln indem du

Nein. Er setzt Pins 2..15 auf 0 und Pins 0..1 auf 1.

> indem entweder high- bzw. low-halfword setze.

"Entweder oder" muss nicht sein. Auch
  port->BSRR = 0x00010001;
setzt Pin 0 auf 1.

von (prx) A. K. (prx)


Lesenswert?

Apropos Cortex-M3: Das BSRR Register bezieht sich auf dem STM32. Mit dem 
Cortex-M3 Core hat das nichts zu tun, die Ports wurden von ST designed, 
nicht vom ARM.

von MArtin (Gast)


Lesenswert?

Du kannst einfach das output data register nehmen. Also GPIOC->ODR = 
0x0003

von kyrel (Gast)


Lesenswert?

ahh richtig,

nur der "Kern" ist ja von ARM, restliches designen ja die Firmen...

danke für den kleinen Schubser :)

Gruß

kyrel

von Lars (Gast)


Lesenswert?

Ich habe noch mal ein wenig experimentiert. Danke auch für die vielen 
Hinweise. Ich denke die Nutzung des vorgeschlagenen ODR-Registers eignet 
sich wirklich am besten um mehrere Port-Pins anzusteuern. :)

von (prx) A. K. (prx)


Lesenswert?

Lars schrieb:

> Hinweise. Ich denke die Nutzung des vorgeschlagenen ODR-Registers eignet
> sich wirklich am besten um mehrere Port-Pins anzusteuern. :)

Nur wenn du wirklich alle 16 Pins manipulieren willst. Wenn es weniger 
sind, dann ist BSRR besser geeignet.

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.