STM32F407 Pendant zu PORTD und PD0 für HD44780 Ansteuerung

Gast #6307530
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ß,
Gast #6307544
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.
Moderator Persönliche Seite #6307546
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.