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
Es ist gen au so, wie du beobachtet hast. Nur auf das High-Byte Zugreifen geht nicht.
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?
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.
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)); |
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.