1.1x STM32 GPIO Ports
Hier eine vereinfachte Betrachtung, für Details Doku lesen: rm0038 S183ff. stm32l152re S92

Veranschaulichung I/O Pin Funktion mit Digital

GPIO Register
Name | Beschreibung | Subadresse | Zuordnung |
---|---|---|---|
MODER | Mode Register Die Funktion des Pins einstellen | 0x00 | 00: Input (Reset Status) 01: GPIO (ODR-Ausgabe) 10: Alternative Funktion 11: Analog Modus |
OTYPER | Output Type Register Ausgabemodus des Pins | 0x04 | 0: Output push-pull 1: Output open-drain |
OSPEEDR | Output Speed Register Ausgabegeschwindigkeit schneller braucht mehr Strom | 0x08 | 00: Low speed 01: Medium speed 10: High speed 11: Very high speed |
PUPDR | PullUp PullDown Register Eingebaute Widerstände einschalten | 0x0C | 00: No PullUp, PullDown 01: PullUp 10: PullDown 11: Reserviert |
IDR | Input Data Register Eingänge lesen | 0x10 | |
ODR | Output Data Register Ausgangswerte | 0x14 | |
BSRR | Bit Set/Reset Register Einzelne Bits an- bzw. ausschalten | 0x18 | 0..15 Setzen (hat Priorität) 16..31 Rücksetzen |
LCKR | Configuration Lock Register Einstellung der Pins sperren | 0x1c |
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);
}
}