STM32F103 Zugriff auf Port -> nur Hi-Byte

#6333469
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?
#6333592
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 von einem Moderator gelöscht.
#6333621
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));
Gast #6333639
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.
Gast #6333847
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
#6333879
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.
#6333929
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren