Forum: Mikrocontroller und Digitale Elektronik GPIO Pin Konfiguration


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von HeikoP (Gast)


Lesenswert?

Hallo. Ich möchte ein LCD mit dem STM323 VL Discovery ansteuern.
1
#define RS  GPIO_Pin_7
2
#define RW  GPIO_Pin_6
3
#define DB7  GPIO_Pin_9
4
#define DB6  GPIO_Pin_5
5
#define DB5  GPIO_Pin_4
6
#define DB4  GPIO_Pin_3
7
#define DB3  GPIO_Pin_2
8
#define DB2  GPIO_Pin_1
9
#define DB1  GPIO_Pin_0
10
#define DB0  GPIO_Pin_13
11
12
void LCDPin_InitConf(void)
13
{
14
  /* ************ Initialisierung/Konfiguration ***************** */
15
  GPIO_InitTypeDef GPIO_InitStructure;
16
  GPIO_InitStructure.GPIO_Pin =  RS | RW | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0;
17
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
18
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // Push-Pull Output
19
  GPIO_Init(GPIOC, &GPIO_InitStructure);
20
}
21
22
void LCD_Initial(void)
23
{
24
  GPIO_WriteBit(GPIOC, DB5 | DB4 | DB3, Bit_SET);
25
  delay();
26
  GPIO_WriteBit(GPIOC, DB5 | DB4 | DB3, Bit_RESET);
27
  delay();
28
  GPIO_WriteBit(GPIOC, DB3 | DB2 | DB1, Bit_SET);
29
  delay();
30
  GPIO_WriteBit(GPIOC, DB3 | DB2 | DB1, Bit_RESET);
31
  delay();
32
  GPIO_WriteBit(GPIOC, DB2 | DB1, Bit_SET);
33
  delay();
34
  GPIO_WriteBit(GPIOC, DB2 | DB1, Bit_RESET);
35
  delay();
36
  GPIO_WriteBit(GPIOC, RS | DB6 | DB4 | DB2 | DB1 | DB0, Bit_SET);
37
}
38
39
/* ************** Hilfsfunktionen ************************* */
40
void delay(void)
41
{
42
  int i;
43
  for (i=0;i<500;i++)
44
  {}
45
}
46
47
int main()
48
{
49
  while(1) // Do not exit
50
  {
51
    LCDPin_InitConf();
52
  delay();
53
  LCD_Initial();
54
  }
55
}

Dazu habe ich zwei Funktionen geschrieben und zum Testen erstmal LEDs an 
die Ausgänge gelegt, um im Debug-Modus erkennen zu können, ob an den 
Ausgängen etwas geschaltet wird, jedoch kommt da leider nix an. Kann mir 
jemand nen Tipp geben, wo mein Fehler liegt? Vielen Dank, MfG Heiko

von Hanz (Gast)


Lesenswert?

HeikoP schrieb:
> #define RS  GPIO_Pin_7
> #define RW  GPIO_Pin_6
> #define DB7  GPIO_Pin_9
> #define DB6  GPIO_Pin_5
> #define DB5  GPIO_Pin_4
> #define DB4  GPIO_Pin_3
> #define DB3  GPIO_Pin_2
> #define DB2  GPIO_Pin_1
> #define DB1  GPIO_Pin_0
> #define DB0  GPIO_Pin_13

Wo ist denn GPIO_Pin_7 usw. definiert?
In einer Header-Datei?

von ikarus (Gast)


Lesenswert?

1
void delay(void)
2
{
3
  int i;
4
  for (i=0;i<500;i++)
5
  {}
6
}
Vermutlich ist das da oben einfach zu schnell für dein Auge. Für solche 
Tests (*1) bietet sich msleep oder so an, falls das Linux ist und/oder 
die Funktion auf deinem System vorhanden ist.
Ist das denn unter Linux?

*1 Für später baust du dir vielleicht einen Timer usw. usf.

von Thomas E. (thomase)


Lesenswert?

ikarus schrieb:
> void delay(void)
>
> {
>
>   int i;
>
>   for (i=0;i<500;i++)
>
>   {}
>
> }

Solch eine Funktion wird von einem vernünftigen Compiler einfach 
wegoptimiert. Da kommt ja nichts raus.

volatile int nInd;
#define DELAY 10000

void Delay(void)
{
   for (nInd = 0; nInd < DELAY; nInd++) {};
}

mfg.

von HeikoP (Gast)


Lesenswert?

Hanz schrieb:
> HeikoP schrieb:
>> #define RS  GPIO_Pin_7
>> #define RW  GPIO_Pin_6
>> #define DB7  GPIO_Pin_9
>> #define DB6  GPIO_Pin_5
>> #define DB5  GPIO_Pin_4
>> #define DB4  GPIO_Pin_3
>> #define DB3  GPIO_Pin_2
>> #define DB2  GPIO_Pin_1
>> #define DB1  GPIO_Pin_0
>> #define DB0  GPIO_Pin_13
>
> Wo ist denn GPIO_Pin_7 usw. definiert?
> In einer Header-Datei?

Ja die Pins sind in einer header-Datei definiert, die Funktionen in der 
dazugehörigen C-Datei.

Habe jetzt noch den Takt hinzugefügt (Hatte ich vergessen 
mitzukopieren):
1
GPIO_InitType...
2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
3
GPIO_InitStru...
4
5
Das ganze wird auch sauber kompiliert. Habs auch schon mit GPIO_SetBits/GPIO_RestBits versucht. Leider keinen Erfolg

von HeikoP (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> volatile int nInd;
> #define DELAY 10000
>
> void Delay(void)
> {
>    for (nInd = 0; nInd < DELAY; nInd++) {};
> }

Danke dafür, man lernt nie aus ;-)

Okay, vielen Dank, es funktioniert jetzt.

von ikarus (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Solch eine Funktion wird von einem vernünftigen Compiler einfach
> wegoptimiert. Da kommt ja nichts raus.
Ja, mist, das Wegoptimieren habe nicht bedacht...

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.