Forum: Mikrocontroller und Digitale Elektronik STM32F407 Pendant zu PORTD und PD0 für HD44780 Ansteuerung


von Alex (Gast)


Lesenswert?

Hi,

Ich habe vor vieeelen Jahren ein Atmega8 zum Spielen gehabt und das LCD 
HD44780 mittels der LCD Routinen hier im Forum zum Laufen gebracht:
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Die_LCD_Routinen

Nun habe ich ein STM32F407 Discovery Board und würde die LCD Routinen 
gerne abändern.

Allerdings verweifle ich gerade daran, die nötigen #defines anzupassen, 
auch weil das ganze Headerfile ganz anders aufgebaut zu sein scheint im 
Vergleich zum AVR.

Weiß jemand mehr, ob es ein STM32F407 Pendant zu den PORTx und Px0 gibt? 
(Ob nun PortD und PD0 oder PORTB und PB0 ist zweitrangig).

Aus dem STM32F407 Header file kann ich folgendes entnehmen:
1
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
2
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
3
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
4
#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
5
#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)
6
#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
7
#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)
8
#define GPIOH               ((GPIO_TypeDef *) GPIOH_BASE)
9
#define GPIOI               ((GPIO_TypeDef *) GPIOI_BASE)
1
/*!< AHB1 peripherals */
2
#define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000UL)
3
#define GPIOB_BASE            (AHB1PERIPH_BASE + 0x0400UL)
4
#define GPIOC_BASE            (AHB1PERIPH_BASE + 0x0800UL)
5
#define GPIOD_BASE            (AHB1PERIPH_BASE + 0x0C00UL)
6
#define GPIOE_BASE            (AHB1PERIPH_BASE + 0x1000UL)
7
#define GPIOF_BASE            (AHB1PERIPH_BASE + 0x1400UL)
8
#define GPIOG_BASE            (AHB1PERIPH_BASE + 0x1800UL)
9
#define GPIOH_BASE            (AHB1PERIPH_BASE + 0x1C00UL)
10
#define GPIOI_BASE            (AHB1PERIPH_BASE + 0x2000UL)

AHB1PERIPH_BASE ist die Base Addresse des jeweiligen Bus, an dem die 
GPIOs hängen.
Das Setzen und Löschen eines jeweiligen Pins scheint jedoch fundamental 
unterschiedlich zu sein beim STM32, weil es ein Set- und ein Reset 
Register gibt, die mit 1 geschrieben werden müssen, um den jeweiligen 
Pin zu setzen oder zu löschen.

Da ich keinen Atmega8 und kein AVR Studio mehr habe, kann ich nicht 
selbst nachgucken, ob man überhaupt die PORTD und PD0 auf einen STM32 
übertragen kann.

Gibt es hier einen, der sowohl AVR als auch STM32 verwendet und sich mal 
näher mit den Headerfiles auseinandergesetzt hat?

Gruß,

von Wieder Spruch (Gast)


Lesenswert?

Schau mal in die Datei <stm32f4xx_gpio.c>, dort siehst du
wie das beim STM32 gemacht wird.

z.B. so:
1
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
2
{
3
  if (BitVal != Bit_RESET)
4
  {
5
    GPIOx->BSRRL = GPIO_Pin;
6
  }
7
  else
8
  {
9
    GPIOx->BSRRH = GPIO_Pin ;
10
  }
11
}

... aber auch anders. Deren Möglichkeiten gibt es viele.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> Das Setzen und Löschen eines jeweiligen Pins scheint jedoch fundamental
> unterschiedlich zu sein

So ist es, insofern genügt ein einfacher Ersatz durch GPIOD nicht.

Aber: bei STM32Fxxx kannst du auch das GPIOx->ODR direkt abändern, du 
musst also nicht zwingend über die get/set-Subregister gehen. Also ein
1
   PORTD |= (1 << bit);
2
   PORTD &= ~(1 << bit);

wäre dort
1
   GPIOD->ODR |= (1 << bit);
2
   GPIOD->ODR &= ~(1 << bit);

Bei anderen ARMs muss man zum Teil wirklich über die get/set-Register 
gehen, bspw. bei den SAM4x/SAMx70:
1
  if (PIOD->PIO_ODSR & (1 << bit))
2
     PIOD->PIO_CODR = (1 << bit);
3
  else
4
     PIOD->PIO_SODR = (1 << bit);

um das Bit "bit" auf PIOD zu toggeln.  AVR und STM32F4xxx können das 
einfach mit ^= (1 << bit) erledigen.

: Bearbeitet durch Moderator
von Alex (Gast)


Lesenswert?

Super - vielen Dank euch beiden.

Gruß,
Alex

von m.n. (Gast)


Lesenswert?

Vielleicht hilft Dir dies weiter: 
Beitrag "LCD-Modul 2x16 am STM32F4Discovery-Board"

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
Noch kein Account? Hier anmelden.