1.1x STM32 GPIO Ports

Hier eine vereinfachte Betrachtung, für Details Doku lesen: rm0038 S183ff. stm32l152re S92

STM32 GPIO Blockschaltbild
STM32 GPIO Blockschaltbild

Veranschaulichung I/O Pin Funktion mit Digital

GPIO I/O Pin
GPIO I/O Pin

GPIO Register

NameBeschreibungSubadresseZuordnung
MODERMode Register
Die Funktion des Pins einstellen
0x0000: Input (Reset Status)
01: GPIO (ODR-Ausgabe)
10: Alternative Funktion
11: Analog Modus
OTYPEROutput Type Register
Ausgabemodus des Pins
0x040: Output push-pull
1: Output open-drain
OSPEEDROutput Speed Register
Ausgabegeschwindigkeit
schneller braucht mehr Strom
0x0800: Low speed
01: Medium speed
10: High speed
11: Very high speed
PUPDRPullUp PullDown Register
Eingebaute Widerstände einschalten
0x0C00: No PullUp, PullDown
01: PullUp
10: PullDown
11: Reserviert
IDRInput Data Register
Eingänge lesen
0x10
ODROutput Data Register
Ausgangswerte
0x14
BSRRBit Set/Reset Register
Einzelne Bits an- bzw. ausschalten
0x180..15 Setzen (hat Priorität)
16..31 Rücksetzen
LCKRConfiguration Lock Register
Einstellung der Pins sperren
0x1c
GPIO Register und ihre Funktion


pinMode setzt den Clock und OSPEEDR auf 0b11 für den Port bei OUTPUT

void setup(){   // Einmalige Ausführung => Initialisierungen...
    uint test = (1<<10);
    Serial.begin(115200);
    //pinMode(PA5, OUTPUT);  // PA5 (D13) als Ausgang
    RCC->AHBENR |= (1<<0);  // Enable the GPIOA clock
    GPIOA->MODER |= (1<<10);
    GPIOA->OSPEEDR |= test;
    Serial.printf("test: %4x\n",test);
    Serial.printf("GPIOA->OSPEEDR: %4x\n",GPIOA->OSPEEDR);
}
    
void loop(){
  //Serial.printf("GPIOC->OSPEEDR: %4x\n",GPIOC->OSPEEDR);
  while(1){
    GPIOA->BSRR = (1<<5);    // PA5 <-1 mit BSRR können Bits gesetzt werden
    delay(1);
    GPIOA->BSRR = (1<<16+5); // PA5 <-0 die oberen 16Bit sind fürs Rücksetzen
    delay(1);
  }  
}