Forum: Mikrocontroller und Digitale Elektronik STM32F103 Zugriff auf Port -> nur Hi-Byte


von Rainer S. (rsonline)


Lesenswert?

Ist es möglich nur auf das Hi-Byte eines Ports (bzw. generell eines 
Registers) vom STM32F103 zuzugreifen?
Habe es probiert. Es scheint nicht zu gehen.
Nur Lo-Byte geht aber.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Es ist gen au so, wie du beobachtet hast. Nur auf das High-Byte 
Zugreifen geht nicht.

von Bauform B. (bauformb)


Lesenswert?

Stefan ⛄ F. schrieb:
> Es ist gen au so, wie du beobachtet hast. Nur auf das High-Byte
> Zugreifen geht nicht.

? Muss ich das jetzt ausprobieren? Was meint denn dann mein Reference 
Manual damit:
1
Each I/O port bit is freely programmable, however the I/O port
2
registers have to be accessed as 32-bit words, half-words or bytes.
Da geht's um die GPIOs, andere Register erlauben nur 32-Bit-Zugriffe, da 
funktioniert es natürlich nicht. Aber viele erlauben auch Byte-Zugriffe 
und warum sollten die nicht mit jedem Byte funktionieren?

von Peter D. (peda)


Lesenswert?

Rainer S. schrieb:
> Ist es möglich nur auf das Hi-Byte eines Ports (bzw. generell eines
> Registers) vom STM32F103 zuzugreifen?
> Habe es probiert. Es scheint nicht zu gehen.

Es geht ganz profan mit AND/OR Maskierung wie bei jedem C-Compiler. 
Natürlich sind solche Zugriffe nicht atomar.

Viele 32Bitter haben auch spezielle Maskenbefehle, wo man auswählen 
kann, welche Bits beeinflußt und welche erhalten werden sollen. Es gibt 
bestimmt auch HAL-Funktionen dafür.
Eine andere häufige Methode sind Set- und Clearregister für jeden Port.
Ein Blick ins Datenblatt des konkreten MCs hilft.

Beitrag #6333603 wurde vom Autor gelöscht.
von Walter T. (nicolas)


Lesenswert?

Peter D. schrieb:
> Eine andere häufige Methode sind Set- und Clearregister für jeden Port.
> Ein Blick ins Datenblatt des konkreten MCs hilft.

Beim STM32F103 nutzt man für atomares byteweises Beschreiben von Port 
die Prävalenz setzen gegenüber löschen im BSRR-Register aus. Für das 
High-Byte sieht das dann einfach so aus:
1
const uint8_t offset = 8;
2
const GPIO_t *GPIOx = GPIOA;
3
const uint8_t byte = 0x5; 
4
GPIOx->BSRR = (uint32_t) (((uint16_t) byte)<<offset) | (0x00FFU<<(offset+0x10U));

von temp (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Es ist gen au so, wie du beobachtet hast. Nur auf das High-Byte
> Zugreifen geht nicht.

Stimmt. Jedenfalls fast. In einem aktuellen Projekt benötigte ich 2 
Ausgänge für die Generierung von Signalen zur Ansteuerung von 
Funksteckdosen, einen für 433MHz und einen für die 868MHz Transmitter 
(nie gleichzeitig). Das ganze sollte nach Möglichkeit ohne einen Sack 
voll Interrupts oder Delay-Schleifen laufen. Deshalb habe ich das per 
DMA auf das gesamten High-Byte des Port C eines BluePill Boards gemacht. 
Die 3 Leitungen die da zur Verfügung stehen sind sowieso limitiert und 
dass die On-Board Led mit wackelt oder aus bleibt kann ich verkraften. 
Fakt ist jedenfalls mit einer 8-Bit DMA kann man nur auf das High-Byte 
des Ports zugreifen, als DMA-Zieladresse habe ich

  DMA1_Channel5->CPAR=((uint32_t)&GPIOC->ODR)+1;

eingetragen. Gut, der Port C hat im unteren Byte keine Leitungen nach 
draussen, aber vom Prinzip her sollte das auch bei Port A und B genauso 
gehen.

von Stefan F. (Gast)


Lesenswert?

Bauform B. schrieb:
> Aber viele erlauben auch Byte-Zugriffe
> und warum sollten die nicht mit jedem Byte funktionieren?

Um die obere Hälfte eines 32 Registers anzusprechen muss man +2 zur 
Adresse addieren. Aber viele (alle?) Register lassen sich nur über ihre 
Basis-Adresse ansprechen. Bei RAM ist das anders.

Die gleiche Einschränkungen haben auch einige andere Prozessoren, siehe 
https://reverseengineering.stackexchange.com/questions/18735/is-it-possible-to-access-the-higher-part-of-the-32-bit-and-64-bit-registers-if

von Andreas B. (abm)


Lesenswert?

Bauform B. schrieb:
> Manual damit:
1
Each I/O port bit is freely programmable, however the 
2
> I/O port
3
> registers have to be accessed as 32-bit words, half-words or 
4
> bytes.

Ähm, ich lese da im RM0008 aber:

"9.2 GPIO registers
... The peripheral registers have to be accessed by words (32-bit). ..."

Nix von "half-words" oder "bytes" ... Dass man auf das unterste Byte
scheinbar allein zu greifen kann, liegt an der APB-Bridge, s. 3.1:

"Note: When a 16- or 8-bit access is performed on an APB register, the 
access is transformed into a 32-bit access: the bridge duplicates the 
16- or 8-bit data to feed the 32-bit vector."

Beim Lesen ist das kein Problem, beim Schreiben ist das aber weniger 
nett.
Und geht natürlich nur bei Zugriff unter einer word Adresse.

von Bauform B. (bauformb)


Lesenswert?

Andreas B. schrieb:
> Bauform B. schrieb:
>> Manual damit:Each I/O port bit is freely programmable, however the
>> I/O port
>> registers have to be accessed as 32-bit words, half-words or
>> bytes.
> Ähm, ich lese da im RM0008 aber:
>
> "9.2 GPIO registers
> ... The peripheral registers have to be accessed by words (32-bit). ..."
>
> Nix von "half-words" oder "bytes" ...

Un. glaub. lich. Dann entschuldigen Sie bitte die Störung. Mein Zitat 
war von einem STM32L4, wahrscheinlich RM0394. Von wegen "alle STM32 sind 
kompatibel". Anscheinend gibt es auch bei ST technischen Fortschritt...

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.