Forum: Mikrocontroller und Digitale Elektronik STM32F4 mit TFT Codeverständnis


von mr. mo (Gast)


Angehängte Dateien:

Lesenswert?

Nabend!
Probiere mich derzeit an meinem STM32F4 Discovery auf dem WaveShare 
Open407V-D. Das mitgelieferte Display wird über FSMC angesprochen.

Nun geht es eigentlich um was ganz simples, ich versuche die 
mitgelieferte Library zu verstehen. Wenn ich diese einbinde funktionert 
diese auch ohne Probleme. Nur ich frage mich, wie bekommt die Library 
die Daten auf die Pins.

Benutzt wird in der Lib die folgende Funktion um ein Register des 
Displays mit Daten zu füttern:
1
__inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
2
{ 
3
  /* Write 16-bit Index, then Write Reg */  
4
  LCD_WriteIndex(LCD_Reg);         
5
  /* Write 16-bit Reg */
6
  LCD_WriteData(LCD_RegValue);  
7
}

Bis dahin keine Probleme, die beiden benutzen Funktionen sehen wie folgt 
aus:
1
__inline void LCD_WriteIndex(uint16_t index)
2
{
3
  //GPIO_ResetBits(GPIOD , GPIO_Pin_7);     //CS=0;
4
  LCD_REG  = index;
5
  //GPIO_SetBits(GPIOD , GPIO_Pin_7);     //CS=1;
6
}
7
8
__inline void LCD_WriteData(uint16_t data)
9
{
10
  //GPIO_ResetBits(GPIOD , GPIO_Pin_7);     //CS=0;
11
  LCD_RAM = data;
12
  //GPIO_SetBits(GPIOD , GPIO_Pin_7);     //CS=1;
13
}

Man kann sehen, dass "data" und "index" in LCD_RAM bzw. LCD_REG 
geschrieben wird. Beide sind wie folgt definiert:
1
#define LCD_REG              (*((volatile unsigned short *) 0x60 00 00 00)) /* RS = 0 */
2
#define LCD_RAM              (*((volatile unsigned short *) 0x60 02 00 00)) /* RS = 1 */

In der Definition muss die Info stecken wie ich die Daten auf die Pins 
mit FSMC bekomme. Entweder ich sehe die Lösung vor lauter Datenblättern 
kaum oder ich bin zu doof dafür.

Kann mir jemand den Zusammenhang erklären?

Ich werde die .c und .h mal anhängen. In der LCD.h erwähnten "config.h" 
ist nichts brauchbares zu finden.

Vielen Dank schonmal!

von Michael F. (startrekmichi)


Lesenswert?

Auf Seite 1226 im stm32f4 reference manual (31.4) steht wie der Name 
"external device address mapping" schon sagt, wie man den externen 
Speicher anspricht. D.h. das sind einfach die Adressen für die zwei 
Wörter, die das LCD benötigt. Die eigentliche Datenübertragung macht 
dann der FSMC. Wie der genau funktioniert bzw. wie man ihn entsprechend 
konfiguriert habe ich mir aber auch noch nicht angeschaut.

Aber es ist schon mal gut zu hören, dass der Code geht, mein Open407V-D 
ist nämlich auch schon unterwegs ;-)

von mr. mo (Gast)


Lesenswert?

Michael Frangenberg schrieb:
> Auf Seite 1226 im stm32f4 reference manual (31.4) steht wie der Name
> "external device address mapping" schon sagt, wie man den externen
> Speicher anspricht.

Achso das erklärt auch die Adresse 6000 0000h.

Wenn ich aber jetzt sage:
1
  LCD_REG  = index;

Heisst das dann, dass ich den index Wert in die Adresse 6000 0000h packe 
und mir der FSMC dies auch auf den Pins ausgibt?

Und wenn ich:
1
  LCD_RAM = data;

benutze, wird ja laut dem Kommentar (was auch laut Datenblatt des TFT 
sein muss) der RS Pin auf 1 gesetzt. Wo steht aber der Zusammenhang 
zwischen der Adresse und den Pins?

Ich habe das Gefühl ich überlese die ganze Zeit die wichtigen Punkte, 
bzw. es ist auch inzwischen schon sehr spät ...

Danke schonmal soweit.

von vampire (Gast)


Lesenswert?

mr. mo schrieb:
> Man kann sehen, dass "data" und "index" in LCD_RAM bzw. LCD_REG
> geschrieben wird. Beide sind wie folgt definiert:
 #define LCD_REG         (*((volatile unsigned short *) 0x60 00 00 00)) 
/* RS = 0 */
> #define LCD_RAM        (*((volatile unsigned short *) 0x60 02 00 00))
/* RS = 1 */

Du hast es doch vor Augen. Mit dem "Zeiger"(pointer *) wird eine 
Adresse festgelegt;
Zähl einfach mal ab: 00 00 sind A0 bis A15;
02 00 00 wäre demnach A17 = 1;
Im DS steht aber, das 16-bit Adressen so ausgegeben werden:
Addr(16-bit) >> 1;
Das ergibt nicht A17, sondern A16 = 1;
A16 beim stm32f4xx discovery ist PD11. Der RS -Pin ist also PD11 und 
wird durch Aufruf von
LCD_RAM = data;
automatisch gesetzt(da die Adr. A16 angesprochen wird) --
Der <Inhalt> von data wird in die durch A16 bestimmte Adresse 
geschrieben;

von mr. mo (Gast)


Lesenswert?

vampire schrieb:
> Du hast es doch vor Augen. Mit dem "Zeiger"(pointer *) wird eine
> Adresse festgelegt;
> Zähl einfach mal ab: 00 00 sind A0 bis A15;
> 02 00 00 wäre demnach A17 = 1;
> Im DS steht aber, das 16-bit Adressen so ausgegeben werden:
> Addr(16-bit) >> 1;
> Das ergibt nicht A17, sondern A16 = 1;
> A16 beim stm32f4xx discovery ist PD11. Der RS -Pin ist also PD11 und
> wird durch Aufruf von
> LCD_RAM = data;
> automatisch gesetzt(da die Adr. A16 angesprochen wird) --
> Der <Inhalt> von data wird in die durch A16 bestimmte Adresse
> geschrieben;


Achso! Ok das erklärt natürlich alles.

Danke dir für die ausführliche Erklärung.

von vampire (Gast)


Lesenswert?

-gerne !

von Arnold B. (arnold_b)


Lesenswert?

Hallo,

könnt ihr mir euere Beispiele bitte geben. Ich starte gerade mit STM. 
Bisher habe ich mit ESP und Microchip  und Atmega rumgespielt.

Aber was TFT betrifft ist STM nicht schlecht.
PS: Bei mir wird A18 verwendet. Mein Board kommt auch aus China. Und hat 
den Namen STM32_F4VE V2.0

Danke Arnold

: Bearbeitet durch User
von Helfersyndromiker (Gast)


Lesenswert?

Arnold B. schrieb:
> könnt ihr mir euere Beispiele bitte geben.

Hier gibt es die volle Dröhnung, auch für Displays.

http://mikrocontroller.bplaced.net/wordpress/

von Johannes S. (Gast)


Lesenswert?

Die Magie vom FMSC liegt in der Initialisierung, die ist doch schon im 
ersten Post zu finden. Was sich seit 2012 geändert hat ist vielleicht 
die HAL Version wenn man die benutzt.  Wo und wie die andere 
Adressleitung gesetzt wird ist im Post von vampire erklärt.
Wenn es ein übliches Board wie das STM32F407 Black ist dann findet man 
auch Arduino dafür, da wird FSMC auch unterstützt. Für Mbed habe ich das 
auch mal angepasst.

von m.n. (Gast)


Lesenswert?

Als Anregung für WQVGA:
Beitrag "TFT-direct-drive, WQVGA-TFT an STM32F4"
Und irgenwann werde ich diese Geschichte noch "rund" machen:
Beitrag "4,3" TFT-Controller STM32F730"

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.