Byte-Reihenfolge (Endianness) / Bit-Fields | Byte-Reihenfolge (Endianness) / Bit-Fields

Sowohl die ARM-Cortex-M3- (STM32F103) als auch die ARM-Cortex-M4-Prozessoren (STM32F4) verwenden die Little-Endian-Byte-Reihenfolge.

Code-Beispiele:

Zerlegung einer 32-Bit-Variablen in Bytes:

union UINT32STRUCT {
   struct {
      uint32_t b0 : 8; // LSB
      uint32_t b1 : 8;
      uint32_t b2 : 8;
      uint32_t b3 : 8; // MSB
   };
   uint32_t var;
} q;

...

q.var = 0x12345678;
Serial.printf("q: %x %x %x %x\n", q.b0, q.b1, q.b2, q.b3);

Ergibt:

q: 78 56 34 12

Zerlegung einer 32-Bit-Variablen in byte-übergreifend:

union UINT32STRUCT {
   struct {
      uint32_t b0 : 12; // LSB
      uint32_t b1 : 4;
      uint32_t b2 : 4;
      uint32_t b3 : 12; // MSB
   };
   uint32_t var;
} q;

...

q.var = 0x12345678;
Serial.printf("q: %x %x %x %x\n", q.b0, q.b1, q.b2, q.b3);

Ergibt:

q: 678 5 4 123

Die niederwertigen Bit-Felder werden an den niedrigen Adressen abgelegt. Der Compiler sorgt dafür, dass byte-übergreifende Strukturen an den passenden Stellen abgelegt werden.

Eine Register-Struktur wie diese

lässt sich in dieser Struktur darstellen:
union {
    struct {
        uint32_t mem_pd:             1;
        uint32_t reserved1:          1;
        uint32_t reserved2:          1;
        uint32_t rx_size:            4;
        uint32_t tx_size:            4;
        uint32_t reserved11:         4;
        uint32_t rx_flow_thrhd_h3:   3;
        uint32_t rx_tout_thrhd_h3:   3;
        uint32_t xon_threshold_h2:   2;
        uint32_t xoff_threshold_h2:  2;
        uint32_t rx_mem_full_thrhd:  3;
        uint32_t tx_mem_empty_thrhd: 3;
        uint32_t reserved31:         1;
    };
    uint32_t val;
} mem_conf;

Die niederwertigen Felder sind zuerst zu nennen.

Siehe auch ESP8266-Byte-Reihenfolge.


Serielle USB-Schnittstelle (Serial) | Serielle USB-Schnittstelle (Serial)

Bei Verwendung der Arduino-Board-Library von STMicroelectronics muss, damit die serielle Schnittstelle (Serial) funktioniert, das Signal DTR gesetzt werden. Ansonsten sendet die Schnittstelle nicht.

C++14 | C++14

Die Arduino-Board-Library von STMicroelectronics (Stand Version 2.2.0) installiert einen C++-Compiler (GCC), der die C++-Version C++14 unterstützt. Eine interessantes Feature dieser Version ist die optionale Einbindung einer Datei. D.h. das Einbinden führt nicht zu einem Fehler, wenn die Datei nicht vorhanden ist. Dadurch ergibt sich z.B. die Möglichkeit in Arduino-Bibliotheken projektspezifische lokale Konfigurationsdateien einzubinden.

#if __has_include( "Config.h" ) // Der STM-Compliler unterstützt C++14
#include "Config.h"
#endif

Beispielsweise kann man in der Datei Makros definieren, die dann im Code mit #ifdef oder #ifndef abfragen kann.


STM32-Boards Details | STM32-Boards Details

Informationen zu verschiedenen STM32-Boards und vielen weiteren Informationen findet man bei STM32-base.

Blue Pill STM32F103C8T6

WeAct Black Pill V3.0 STM32F411CEU6 (Die Angabe "STM32F401CEU6" im Text ist falsch. Meine Boards besitzen einen STM32F411CEU6, wie auch auf den Fotos zu erkennen ist). Der CPU-Takt beträgt 96 MHZ.

: