Hallo, ich übe mich in der c-Programmierung eines STM32 discovery bords. In den Example Ordner ist ein Bsp GPIO-Toggle mit dem zwei LEDs blicken. die Blink-Frequenz wird hierbei mit folgender Funktion beeinflusst. void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); } FRAGE: Kann ich diese Funktion für eine definierte Wartezeit von z.B. 5ms verwenden? Oder gibt es eine andere Möglichkeit eine definierte Warte-Funktion zu erstellen?
Gast
#2697443
Ich würds mit systic timer machen, so gehts aber auch. Hab vor kurzem ein Displaytech 162 im 8-Bit mode angesteuert mit dem STM32F10x, wennst den selben hast kann ich dir die Lib schicken.
Gast
#2697445
Soviel ich mich erinnern kann, hing diese Funktion vom Systick Timer ab. Man übergibt die Anzahl von Systick Takten, die gewartet werden soll, also wenn der Systick jede ms tickt, würdest du mit Delay(5) 5ms warten. Am Anfang der main Funktion wurde der Systick Timer eingestellt.
@abc: Danke, das Board hab ich auch. Und ich bin auch dabei ein LCD-Modul im 8-bit mode anzusteuern, bin aber schon bei der Initialisierung hängen geblieben. Kannst du mir das schicken?
Naja, die Funktion wird im Bsp mit Delay(0xFFFFF); aufgerufen, was eine Blinkrate von geschätzt 250ms ausmacht...
Gast
#2697566
main:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
LCD.c:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
Gast
#2697571
Den auch noch in die main packen:
1 | |
2 | |
3 | |
4 | |
Gast
#2697573
Gibt es ein gutes tutorial zum stm32 oder eventuell ein Buch.das mir empfohlen werden könnte?
Gast
#2697584
nein, aber wenn du dich gut mit µ-Cs auskennst kann ich dir paar einfache gut dokumentierte Programmierbeispiele schicken, den rest findet man im Referenzmanual
Ivan Jast schrieb: > void Delay(__IO uint32_t nCount) > { > for(; nCount != 0; nCount--); > } Das ist Pfusch - vor allem auf einem stm32, welcher massig Timer zur Verfügung stellt. abc schrieb: > main: > volatile int32_t SysTickCnt=0; Kann es sein, dass da die ISR fehlt? > void Delay (unsigned long tick) > { > int32_t SysTickCntHold; > SysTickCntHold = SysTickCnt; > while((SysTickCnt - SysTickCntHold ) <= tick ); // wait ca. 110us > } Wo wird der Zählerüberlauf beachtet? Was bedeutet der Kommentar? EDIT: Die ISR ist inzwischen eingetrudelt. Aber wo wird der Überlauf des Zählers behandelt?
Danke für den Code! Ich werd ihn mal für meine Pins anpassen... abc schrieb: > Den auch noch in die main packen: > void SysTick_Handler(void) die Fkt ist (laut Fehler) schon in stm32f10x_it.c definiert... ohne sie gibts auch keinen Fehler.
Roland H. schrieb: >> void Delay (unsigned long tick) >> { >> int32_t SysTickCntHold; >> SysTickCntHold = SysTickCnt; >> while((SysTickCnt - SysTickCntHold ) <= tick ); // wait ca. 110us >> } > > Wo wird der Zählerüberlauf beachtet? Was bedeutet der Kommentar? > > EDIT: Die ISR ist inzwischen eingetrudelt. Aber wo wird der Überlauf des > Zählers behandelt? Da hier unsigned gerechnet wird, braucht man sich um 1 Überlauf nicht kümmern. Mehrere dürfen es allerdings nicht sein.
Gast
#2697742
@Abc also IDE programmer geht alles nur mit der stm lib kenn ich mich nicht aus! Erfahrung hab ich einiges mit avr.und 8051
Gast
#2697750
@ ivan, in der it datei passt natürlich auch Wichtig ist dass du die SysTickCnt variable definierst und im IR handler erhöhst. SysTickCnt++; Übern überlauf hab ich mir noch wenig gedanken gemachtr.
Gast
#2697764
Ich habe mich an dieses Tutorial mit Beispielen gehalten: http://en.radzio.dxp.pl/stm32vldiscovery/
Ich habe das so realisiert:
void delay_us(uint32_t time_us)
{
SysTick->LOAD = 72 * time_us-1;
SysTick->VAL = 0; /* Load
the SysTick Counter Value */
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* Enable
SysTick Timer */
do
{
} while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG)==0);
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; /*
Disable SysTick Timer */
SysTick->VAL = 0; /* Load
the SysTick Counter Value */
}
void delay_ms(uint16_t time_ms)
{
while (time_ms>0)
{
delay_us(1000);
time_ms--;
}
}
Gast
#2698736
bei deinem Problem:
if(val) GPIOA->ODR |= val; //GPIOA->BSRR=val;
LCD_E(1);
Das es verkehrt herum ist, Probier mal:
val = ( ((uint16_t)val) >> 8 ) | ( val << 8 );
Gast
#2698742
Das sollte funktionieren:
int bit_reverse(int in) {
int rev=0;
int i;
for (i = 0; i < BIT_WIDTH; i++) {
rev = (rev << 1) | (in & 1);
in >>=1;
}
return rev;
}
Jawohl :-) dein Code funktioniert!! Herzlichen Dank!!! Ich musste nur die Bitreihenfolge der Datenbits ändern, weil ich die andersrum angeschlossen hab (DB0 : PA7 usw), das geht mit folgendem Algorithmus am Anfang der LCD_Data Funktion:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Gast
#2698936
schön ;)
abc schrieb: > Ich würds mit systic timer machen, so gehts aber auch. > > Hab vor kurzem ein Displaytech 162 im 8-Bit mode angesteuert mit dem > STM32F10x, wennst den selben hast kann ich dir die Lib schicken. Moin Zusammen! Bin grad am Basteln mit genau dem LCD, habe auch ungefähr das selbe Problem mit der Initialisierung... Möchte mir jemand mla einen Beispielcode/Project zur verfügung stellen, dann könnte cih vergleiche wie ihr das gemacht habts...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.