Displaytech 162 an STM32DiscoveryF3 (Cortex M3)

Gast #2673725
Lesenswert?
• ▲
▼
Hallo Leute,

Ich versuche ein LCD-Display im 8-Bit Modus am STM32 zum laufen zum 
Bringen.

Initialisierungsroutine:
1
#include "stm32f10x.h"
2
#include <stdio.h>
3

4
extern int32_t SysTickCnt;
5

6
volatile unsigned long TimeTick;
7

8
/*------------------------------------------------------------------------------
9
  Delay function
10
  delays number of tick Systicks (happens every 10 ms)
11
*------------------------------------------------------------------------------*/
12
static void Delay (unsigned long tick)
13
{
14
    unsigned long timetick;
15

16
    timetick = TimeTick;
17
    while ((TimeTick - timetick) < tick);
18
}
19

20
static void LCD_RS(uint8_t val)           // RS ... register select
21
{
22
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
23
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
24
}
25

26

27
static void LCD_RW(uint8_t val)           // RW ... read/write
28
{
29
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
30
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
31
}
32

33

34
static void LCD_E(uint8_t val)             // E ... enable
35
{
36
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_4);
37
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_4);
38
}
39

40
static void LCD_Data(uint8_t val)             // E ... enable
41
{
42
     GPIOA->BSRR=0xFFFFFF;
43
  if(val)   GPIOA->BSRR=val;
44

45
}
46

47
void LCD_Init(void)
48
{
49
  GPIO_InitTypeDef  GPIO_InitStruct;
50
  int32_t SysTickCntHold;
51

52
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
53
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
54
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
55

56
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // Konfig. LED an PC8
57
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
58
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
59
  GPIO_Init(GPIOB, &GPIO_InitStruct);
60

61
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;      // Konfig. LED an PC8
62
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
63
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
64
  GPIO_Init(GPIOC, &GPIO_InitStruct);
65

66
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
67
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
68
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
69
  GPIO_Init(GPIOA, &GPIO_InitStruct);
70

71
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
72
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
73
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
74

75
  LCD_RW(0);
76

77
  SysTickCntHold = SysTickCnt;  
78
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
79

80
  GPIO_SetBits (GPIOA, GPIO_Pin_4|GPIO_Pin_5);
81
  //Delay(1);
82

83
  LCD_E(1);
84
  Delay(1);  //SET_TO 8-Bit (1/3)
85
  LCD_E(0);
86

87
  SysTickCntHold = SysTickCnt;  
88
  while((SysTickCnt - SysTickCntHold ) < 5 );   // wait ca. 4.2ms
89

90
   LCD_E(1);
91
  Delay(1);  //SET_TO 8-Bit (2/3)
92
  LCD_E(0);
93

94
  SysTickCntHold = SysTickCnt;  
95
  while((SysTickCnt - SysTickCntHold ) < 2 );   // wait ca. 110us
96

97
   LCD_E(1);
98
  Delay(1);  //SET_TO 8-Bit (3/3)
99
  LCD_E(0);
100

101
  Delay(1);
102

103
   LCD_E(1);
104
  Delay(1);   //SET_TO 8-Bit (4/3)
105
  LCD_E(0);
106

107
   Delay(1);
108

109
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
110
   GPIO_SetBits (GPIOA, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //2-Line Display
111
     LCD_E(1);
112
  Delay(1);
113
  LCD_E(0);
114

115
   Delay(1);
116

117
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
118
   GPIO_SetBits (GPIOA, GPIO_Pin_3);  //Display off
119
     LCD_E(1);
120
  Delay(1);
121
  LCD_E(0);
122

123
   Delay(1);
124

125
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
126
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
127
     LCD_E(1);
128
  Delay(1);
129
  LCD_E(0);
130

131
   Delay(1);
132

133
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
134
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2);  //Cursor Right
135
     LCD_E(1);
136
  Delay(1);
137
  LCD_E(0);
138

139
   Delay(1);
140

141
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
142
   GPIO_SetBits (GPIOA, GPIO_Pin_2|GPIO_Pin_3);  //Display On
143
     LCD_E(1);
144
  Delay(1);
145
  LCD_E(0);
146

147
//beginn
148
   Delay(1);
149

150
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
151
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
152
     LCD_E(1);
153
  Delay(1);
154
  LCD_E(0);
155

156

157
   Delay(1);
158

159
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
160
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
161
     LCD_E(1);
162
  Delay(1);
163
  LCD_E(0);
164

165

166
}

Delay(1) ist ein Delay von ca 10ms, nur zum Testen.

Display D0 = PortA0 - D7=PortA7


Leider macht das Display garnichts, außer dass der Hintergrund ist und 
die Rechtecke in einer Zeile angezeigt werden (Industriestandart).

Vielleicht habt ihr eine Idee.
Gast #2673825
Lesenswert?
• ▲
▼
Das Problem wurde nun etwas eingeschränkt, anscheinend funtkioniert der 
Systick Timer nicht richtig.
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
#include "lcd.h"
4

5

6
volatile int32_t SysTickCnt=0;
7
int32_t SysTickCntHold;  
8

9
void SysTick_Handler(void)
10
{
11
  SysTickCnt++;
12
}
13

14
int main(void)
15
{
16
  RCC_ClocksTypeDef   Clocks;
17
  GPIO_InitTypeDef   GPIO_InitStruct;
18
  RCC_GetClocksFreq(&Clocks);
19
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
20

21

22
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
23

24

25

26
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // Konfig. LED an PC8
27
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
28
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
29
  GPIO_Init(GPIOC, &GPIO_InitStruct);
30

31

32
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
33

34

35
  SysTickCntHold = SysTickCnt;  
36
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
37
   GPIO_ResetBits(GPIOC, GPIO_Pin_8);
38
  LCD_Init();
39

40
  while(1)
41
  {
42
  }
43
}

Hier im Main Funktioniert der Systick-Timer ohne Probleme.


In der Datei lcd.c (code oben)

extern int32_t SysTickCnt;



void LCD_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  int32_t SysTickCntHold;

  GPIO_ResetBits(GPIOC, GPIO_Pin_8);
  SysTickCntHold = SysTickCnt;
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms

   GPIO_SetBits(GPIOC, GPIO_Pin_9);
...


Hängt sich der Prozessor anscheiend bei der While Schleife auf.
Gast #2674958
Lesenswert?
• ▲
▼
Hier nun der aktuelle Code in der main.c
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
//#include "lcd.h"
4

5
void Delay (unsigned long tick);
6
void LCD_Init(void);
7
void LCD_SetPrintPosition(unsigned int ln, unsigned int col);       // line 0...1  column 0...15
8
volatile int32_t SysTickCnt=0;
9
int32_t SysTickCntHold;  
10

11
void SysTick_Handler(void)
12
{
13
  SysTickCnt++;
14
}
15

16

17
int main(void)
18
{
19
  RCC_ClocksTypeDef   Clocks;
20
  GPIO_InitTypeDef   GPIO_InitStruct;
21
  RCC_GetClocksFreq(&Clocks);
22
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
23

24

25
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
26

27

28

29
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // TESTLEDS
30
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
31
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
32
  GPIO_Init(GPIOC, &GPIO_InitStruct);
33

34

35
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
36

37

38
  Delay(10);
39
   GPIO_ResetBits(GPIOC, GPIO_Pin_8);
40
  LCD_Init();
41

42
  while(1)
43
  {
44
  }
45
}
46

47

48

49
void Delay (unsigned long tick)
50
{  
51
   // unsigned long timetick;
52

53
   // timetick = TimeTick;
54
   // while ((TimeTick - timetick) < tick);
55
  int32_t SysTickCntHold;
56
     SysTickCntHold = SysTickCnt;  
57
  while((SysTickCnt - SysTickCntHold ) < tick );   // wait ca. 110us
58
}
59

60
static void LCD_RS(uint8_t val)           // RS ... register select
61
{
62
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
63
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
64
}
65

66

67
static void LCD_RW(uint8_t val)           // RW ... read/write
68
{
69
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
70
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
71
}
72

73

74
static void LCD_E(uint8_t val)             // E ... enable
75
{
76
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_4);
77
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_4);
78
}
79

80
static void LCD_Data(uint8_t val)             // E ... enable
81
{
82
     GPIOA->BSRR=0xFFFFFF;
83
  if(val)   GPIOA->BSRR=val;
84

85
}
86

87
void LCD_Init(void)
88
{
89
  GPIO_InitTypeDef  GPIO_InitStruct;
90
  int32_t SysTickCntHold;
91

92
  GPIO_SetBits(GPIOC, GPIO_Pin_9);
93
Delay(15);
94

95
   GPIO_ResetBits(GPIOC, GPIO_Pin_9);
96

97
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
98
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
99
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
100

101
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // RS
102
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
103
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
104
  GPIO_Init(GPIOB, &GPIO_InitStruct);
105

106
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;    //En and R/W
107
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
108
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
109
  GPIO_Init(GPIOC, &GPIO_InitStruct);
110

111
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
112
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
113
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
114
  GPIO_Init(GPIOA, &GPIO_InitStruct);
115

116
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
117
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
118
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
119
     
120
   
121

122
  LCD_RW(0);
123
    GPIO_SetBits(GPIOC, GPIO_Pin_9);
124
  SysTickCntHold = SysTickCnt;  
125
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
126
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
127

128
  GPIO_SetBits (GPIOA, GPIO_Pin_4|GPIO_Pin_5);
129
  //Delay(1);
130

131
  LCD_E(1);
132
  Delay(1);  //SET_TO 8-Bit (1/3)
133
  LCD_E(0);
134

135
  SysTickCntHold = SysTickCnt;  
136
  while((SysTickCnt - SysTickCntHold ) < 5 );   // wait ca. 4.2ms
137

138
   LCD_E(1);
139
  Delay(1);  //SET_TO 8-Bit (2/3)
140
  LCD_E(0);
141

142
  SysTickCntHold = SysTickCnt;  
143
  while((SysTickCnt - SysTickCntHold ) < 2 );   // wait ca. 110us
144

145
   LCD_E(1);
146
  Delay(1);  //SET_TO 8-Bit (3/3)
147
  LCD_E(0);
148

149
  Delay(1);
150

151
   LCD_E(1);
152
  Delay(1);   //SET_TO 8-Bit (4/3)
153
  LCD_E(0);
154

155
   Delay(1);
156

157
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
158
   GPIO_SetBits (GPIOA, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //2-Line Display
159
     LCD_E(1);
160
  Delay(1);
161
  LCD_E(0);
162

163
   Delay(1);
164

165
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
166
   GPIO_SetBits (GPIOA, GPIO_Pin_3);  //Display off
167
     LCD_E(1);
168
  Delay(1);
169
  LCD_E(0);
170

171
   Delay(1);
172

173
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
174
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
175
     LCD_E(1);
176
  Delay(1);
177
  LCD_E(0);
178

179
   Delay(1);
180

181
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
182
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2);  //Cursor Right
183
     LCD_E(1);
184
  Delay(1);
185
  LCD_E(0);
186

187
   Delay(1);
188

189
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
190
   GPIO_SetBits (GPIOA, GPIO_Pin_2|GPIO_Pin_3);  //Display On
191
     LCD_E(1);
192
  Delay(1);
193
  LCD_E(0);
194

195
//beginn
196
   Delay(1);
197

198
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
199
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
200
     LCD_E(1);
201
  Delay(1);
202
  LCD_E(0);
203

204

205
   Delay(1);
206

207
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
208
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
209
     LCD_E(1);
210
  Delay(1);
211
  LCD_E(0);
212
      
213
    GPIO_ResetBits(GPIOC, GPIO_Pin_9);        
214
}

Und das Display macht wie gesagt gar nichts, außer der Hintergrund und 
die erste Zeile bei der alle Punkte leuchten.
Gast #2676110
Lesenswert?
• ▲
▼
Hab die Ausgänge jetzt auf Push-Pull gestellt, das Display initialisiert 
wohl nun erfolgreich, aber angezeigt bekomm ich noch nichts.
1
//beginn
2
   Delay(1); 
3
    GPIO_ResetBits (GPIOA, GPIO_Pin_All);
4
   GPIO_SetBits (GPIOA, GPIO_Pin_7);  //DD-Ram
5
     LCD_E(1);
6
  Delay(1);
7
  LCD_E(0);
8
   
9
   Delay(1);
10

11
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
12
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
13
     LCD_E(1);
14
  Delay(1);
15
  LCD_E(0);
16

17

18
   Delay(1);
19

20
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
21
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
22
     LCD_E(1);
23
  Delay(1);
24
  LCD_E(0);
25

26
   Delay(1);
27
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
28
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);  //Blink Cursor
29
     LCD_E(1);
30
  Delay(1);
31
  LCD_E(0);
32

33
   Delay(1);        
34
      
35

36
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
37
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);  //W
38
   GPIO_SetBits (GPIOA, GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);   
39
   LCD_RS(1);
40
      LCD_E(1);
41
  Delay(1);
42
  LCD_E(0);

Will nur einen Buchstaben anzeigen lassen.
Gast #2676224
Lesenswert?
• ▲
▼
Falls es jemand interessiert, hier ist der Funktionierende Code:
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
//#include "lcd.h"
4

5
void Delay (unsigned long tick);
6
void LCD_Init(void);
7
static void LCD_Data(uint8_t val);
8
static void lcd_string( const char *data );
9
void lcd_setcursor( uint8_t x, uint8_t y );
10
//void LCD_SetPrintPosition(unsigned int ln, unsigned int col);       // line 0...1  column 0...15
11
volatile int32_t SysTickCnt=0;
12
int32_t SysTickCntHold;  
13

14
void SysTick_Handler(void)
15
{
16
  SysTickCnt++;
17
}
18

19

20
int main(void)
21
{
22
  RCC_ClocksTypeDef   Clocks;
23
  GPIO_InitTypeDef   GPIO_InitStruct;
24
  RCC_GetClocksFreq(&Clocks);
25
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
26

27

28
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
29

30

31

32
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // TESTLEDS
33
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
34
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
35
  GPIO_Init(GPIOC, &GPIO_InitStruct);
36

37
  LCD_Init();
38

39
   LCD_Data('H');
40
  LCD_Data('A');
41
   LCD_Data('L');
42
  LCD_Data('L');
43
  LCD_Data('O');
44
  lcd_string(" POOL 38°C");  
45

46
  lcd_setcursor(5,2);
47
  lcd_string(" TEST");  
48

49
  while(1)
50
  {
51
  }
52
}
53

54
/*******************************************************************************
55
* Function Name  : EXTI9_5_IRQHandler
56
* Description    : This function handles External lines 9 to 5 interrupt request.
57
* Input          : None
58
* Output         : None
59
* Return         : None
60
*******************************************************************************/
61

62
void EXTI0_IRQHandler(void)
63
{
64
  if(EXTI_GetITStatus(EXTI_Line0) != RESET) //EXTI_Line 0 hat ausgeloest?
65
  {
66

67
    EXTI_ClearITPendingBit(EXTI_Line0);
68
  }
69
}
70

71
void TIM3_IRQHandler (void)
72
{  
73
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);  
74
}
75

76

77
void Delay (unsigned long tick)
78
{  
79
  int32_t SysTickCntHold;
80
     SysTickCntHold = SysTickCnt;  
81
  while((SysTickCnt - SysTickCntHold ) <= tick );   // wait ca. 110us
82
}
83

84
static void LCD_RS(uint8_t val)           // RS ... register select
85
{
86
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
87
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
88
}
89

90

91
static void LCD_RW(uint8_t val)           // RW ... read/write
92
{
93
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
94
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
95
}
96

97

98
static void LCD_E(uint8_t val)             // E ... enable
99
{
100
  if(val){
101
    GPIO_SetBits  (GPIOC, GPIO_Pin_4);
102
    Delay(1);  //SET_TO 8-Bit (1/3)
103
      GPIO_ResetBits(GPIOC, GPIO_Pin_4);
104
  }
105
  else GPIO_ResetBits(GPIOC, GPIO_Pin_4);
106
}
107

108
static void LCD_Data(uint8_t val)             // E ... enable
109
{
110
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
111
  if(val)   GPIOA->BSRR=val;
112
     LCD_E(1);
113

114
}
115

116
// Schreibt einen String auf das LCD
117
 
118
static void lcd_string( const char *data )
119
{
120
    while( *data != '\0' )
121
        LCD_Data( *data++ );
122
}
123

124

125
// Setzt den Cursor in Spalte x (0..15) Zeile y (1..2) 
126
 
127
void lcd_setcursor( uint8_t x, uint8_t y )
128
{
129
    uint8_t data;
130
 
131
    switch (y)
132
    {
133
        case 1:    // 1. Zeile
134
            data = 0x80 + 0x00 + x;
135
            break;
136
 
137
        case 2:    // 2. Zeile
138
            data = 0x80 + 0x40 + x;
139
            break;
140
        default:
141
            return;                                   // für den Fall einer falschen Zeile
142
    }
143
    LCD_RS(0);
144
    LCD_Data( data );
145
  LCD_RS(1);
146
}
147

148
void LCD_Init(void)
149
{
150
  GPIO_InitTypeDef  GPIO_InitStruct;
151

152
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
153
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
154
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
155

156
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // RS
157
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
158
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
159
  GPIO_Init(GPIOB, &GPIO_InitStruct);
160

161
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;    //En and R/W
162
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
163
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
164
  GPIO_Init(GPIOC, &GPIO_InitStruct);
165

166
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
167
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
168
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
169
  GPIO_Init(GPIOA, &GPIO_InitStruct);
170

171
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
172
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
173
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
174
     
175
  /* DISPLAY INITIALISATION */
176
  LCD_RW(0);
177

178
  Delay(15);  //wait ca 15ms
179
  LCD_Data(0x30);    //SET_TO 8-Bit (1/4)
180
  Delay(5);  //wait more than 4,2ms
181
  LCD_Data(0x30);    //SET_TO 8-Bit (2/4)
182
  Delay(1);  //wait more than 110us
183
  LCD_Data(0x30);    //SET_TO 8-Bit (3/4)
184
  LCD_Data(0x30);    //SET_TO 8-Bit (4/4)
185
   
186
  LCD_Data(0x38);    //2-Line Display
187
  LCD_Data(0x08);    //Display Off
188

189
  LCD_Data(0x01);    //Delete Display
190

191
  LCD_Data(0x03);    //Cursor Right
192

193
  LCD_Data(0x06);    //Display On
194

195
  lcd_setcursor(0,0);    //Cursor 0/0
196
   
197
   LCD_Data(0x0C);    //Display On
198

199
   LCD_RS(1);
200
     
201
}
#2698318
Lesenswert?
• ▲
▼
Hallo,
ich arbeite auch mit dem STM32 Board und dem 1602 LCD Modul.
Ich bekomm bei deinem Code allerdings den Fehler:

".\Debug\GPIOToggle.axf: Error: L6200E: Symbol SysTick_Handler multiply 
defined (by stm32f10x_it.o and main.o)."

Wenn ich die Funktion SysTick_Handler in der stm32f10x_it.c ausklammer 
(in der im Übrigen auch nichts gemacht wird), gibts kein Fehler, 
allerdings kommt beim Display nichts raus (nur der Standardbalken...)!?

Fehlt bei deinem geposteten Code noch was?
#2698368
Lesenswert?
• ▲
▼
Ich hab den Fehler gefunden:
wenn ich mein LCD Modul der Reihe nach anstecke ist DB0 PA7 zugeordnet. 
Das ist genau umgekehrt, wie bei dir...

ich hab alle "LCD_Data" Befehle beim Aufruf geswapt, dann gehts auch.

Kennt jmd einen Befehl bei stm32 mit dem man die nibbels eines bytes 
tauschen kann?

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.