Moin
Nachdem ich mir vor 6 wochen das Stm32f4-discoveryboard gekauft habe und
dann nach 3 Wochen eine Anleitung für eine Toolchaininstallation
gefunden habe stöhn habe ich nun folgendes Problem:
Ich versuche den blauen Taster auf dem Board auszulesen. Aber leider
funktioniert der Quellcode, den ich nehme net. Die Blaue LED geht zwar
an, aber sie geht nicht aus, wenn ich den Taster drücke.
bei meinem Board ist der schwarze Taster der Reset-Knopf. Aber schau mal
auf den Bestückungsdruck auf der Platine. Dort steht, welcher der
User-Button und welcher der Reset-Button ist.
Ich habe mal mein COOCOX Projekt angehängt. Es ist für das Board mit dem
Bildschirm, das seit einem Monat vertrieben wird.
Es gibt von STMicroelectronics eine Art Betriebssystem oder Treiber für
die
einzelnen Baugruppen. Ich finde es eine gute Idee gleich die LED zu
initialisieren und anzusprechen, als jedes mal aus dem Datenblatt jedes
Bit für die Ansteuerung rauszusuchen. Vielleicht bring das was.
/* Initialize LEDs, User Button and LCD on STM32F429I-Disco
---------------------*/
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED4);
if (GPIOA->IDR & 0x0001)
{
STM_EVAL_LEDOn(LED4);
}
else
{
STM_EVAL_LEDOff(LED4);
}
Hallo 12V DC,
ich habe Dein Programm an meine IDE angepasst & laufen lassen im
Release-Modus.
Ergebnis:
* Taster blau - USER & WAKE-UP - lässt die blaue LED bei Betätigung
leuchten.
gem. Layout:
* PA0 >> USER & WAKE-UP Button
* NRST >> RESET-Button
* PD15 >> LD6 Blue
mfg
Olaf
Um die Nebenfrage von vorhin zu behandeln: Wieso geht
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) nicht, aber GPIOA->IDR &
0x0001?
Aber das wie gesagt nur mit dem Schwarzen Taster.
PS: Ich schau mir mal den code von lutz h an, aber ich muss das ganze an
Editor+gcc anpassen.
PPS: Ich würde Lösungen mit GPIO_… bevorzugen, da ich erst in der
Einarbeitungsphase bin.
@lutz h
ich versteh nicht ganz wei das mein Problem lösen soll. Das sind doch
nur die Beispiele für ein ähnliches Board, oder seh ich das falsch?
Und der gepostete Code ist doch nur eine Zusammenfassung von dem
meinigen.
12V DC schrieb:> Nachdem ich mir vor 6 wochen das Stm32f4-discoveryboard gekauft
Ich habe ein Discoveryboard mit Bildschirm, gibt es noch eine Version
ohne Bildschirm?
Und wird die hier verwendet?
@obrecht
Ne, dein code geht auch nicht und is sowieso derselbe wie bei mir(außer
dem debug_printf, der nicht geht - Weißt du wie das mit arm-none-eabi
geht?) Aber bei der Demo geht der Taster(das der nich geht kann also net
sein).
Muss ich vielleicht irgendwelche Jumper öffnen?
#define LEDn 2
#define LED3_PIN GPIO_Pin_13
#define LED3_GPIO_PORT GPIOG
#define LED3_GPIO_CLK RCC_AHB1Periph_GPIOG
#define LED4_PIN GPIO_Pin_14
#define LED4_GPIO_PORT GPIOG
#define LED4_GPIO_CLK RCC_AHB1Periph_GPIOG
/**
@12VDC Ich habe einen Unterschied gefunden, wird der richtige GPIO Port
verwendet? bei mir ist es der Port GPIOG nicht GPIOD Ich suche jetzt
nach einer anderen stm32f429i_discovery.h . Mal schauen,ob die LED an
verschiedenen Pins angeschlossen sind.
@lutz h
Die LED's gehen ja bei mir istdas Problem der Taster un der hängt an
GPIOD(laut diversen tutorials)
Die LED's sind nur an einen Pin angeschlossen(hätte auch keinen Sinn
wenns anders wär, oder?)
Aber wenn das ganze bei anderen klappt dann probiere ich es natürlich
aus. Ich habe nur das Problem, dass bei mir nur ein Editor und ein
Compiler arbeitet, und nicht irgendeine IDE die werweißwieviel
verändert(Toolchain link oben). Bin nun mal überzeugter Linux-User ;)
Pardon für den Verschreiber oben...
Ich meinte der Taster is garantiert an GPIOA und die LED's sind meines
Wissens nur an GPIOD aber du hast ja ein einwenig anderes Board.
ich glaube sb20 ist nur ein 0ohm wiederstand(Drahtbrücke SMD) aber genau
weiß ichs nicht.
Aber wie kriege ich jetzt das Projekt zum Laufen??
Hat jemand Erfahrung mit arm-none-eabi und dem stm?
Der schwarze Button resettet den µC, deswegen geht auch die LED aus.
Hängt laut
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00039084.pdf
auf NRST. Kann also garnicht von deiner SW ausgewertet werden.
SB20 ist die Lötbrücke auf der Unterseite die wenn geschlossen den
Button B1 mit PA0 verbindet, wenn geöffnet ist PA0 offen, der Taster
macht nix. Müsste wenn du nix dran rumgelötet hast geschlossen sein,
also PA0 mit B1 verbunden.
Das seltsame ist nur, dass der Resetbutton genauso ragiert hat wie der
blaue button sollte. D.h. die LED ging solange aus, bis der Taster
losgelassen wurde. Das doch ist für gewöhnlich nicht ein Reset??
Doch, die LEDs hängen alle auf Masse, wenn du Reset drückst, liegt keine
Spannung an PD15 und somit geht die LED aus.
Wie wäre es wenn du einfach mal schaust ob deine LED richtig angesteuert
wird indem du sie blinken lässt? Ausserdem würde vielleicht debuggen
helfen falls das bei dir funktioniert.
Ich habe diese Zeile noch im verdacht:
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
In diesem Beitrag ist die Einstellung auf meinem Board:
Autor: lutz h. (luhe)
Datum: 20.11.2013 18:14
// die ausgewählten PINS mit der Struktur initialisieren
9
GPIO_Init(GPIOD,&GPIO_InitStructure);
10
11
// Konfiguration GPIOA Pin 0 >> USER & WAKE-UP-Button
12
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
13
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
14
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
15
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
16
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
17
18
// die ausgewählten PINs mit der Struktur initialisieren
19
GPIO_Init(GPIOA,&GPIO_InitStructure);
Ich habe auch noch einmal die Belegung der PINs & SBs kontrolliert, sind
alle so wie in Schaltplan eingezeichnet oder von X2 erklärt. SB20 ist
SMD 0R, kann es aber nicht genauer erkennen, da trotz Lupenbrille nicht
erkennbar.
Struktur oder Programm aber bei mir in Verbindung mit CMSIS.
Werde noch meinen LA anschliessen & Screenshot ziehen, kann aber ein
bißchen dauern, da ich gerade ein anderes Projekt am LA hängen habe.
;-))
mfg
Olaf
Ich kann eure Tipps im Moment nicht ausprobieren, aber von dem was ich
so im Moment im Kopf habe, geht doch nach druck auf den Resetknopf die
led kurz auf und es dauert einige Sekunden bis die led wieder leuchtet.
Deshlb meine Verwunderung.
PS: Ich versuchs heute nachmittqag nochmal.
Sooo
Ich habe gerade alles noch einmal ausprobiert mit dem Ergebnis: NICHTS!!
Langsam werd ich verrückt...
Naja also kann mir noch jemand mal den kompletten Quellcode für dieses
Projekt schicken.
Hallo 12V DC,
Dir den ganzen Quellcode zu schicken bringt m.E überhaupt nichts.
Jede IDE & jede Toolchain hat im Hintergrund andere Einstellungen die
zusammen die ELF- und/oder HEX-Datei ergeben.
Als Beispiel: ich verwende hier gerade als Test-Umgebung Rowley's Cross
Studio unter Win7.
Du verwendest
+ BS Linux
+ Compiler: gcc-arm-none-eabi-linux
+ IDE: ???
Wie sehen Deine Compiler- & Linker-Einstellungen aus?
Kannst Du eine HEX-Datei in Dein Board laden?
mfg
Olaf
Ich würde ganz langsam anfangen.
Das läuf bei mir und schaltet eine LED an beim anderen Port GPIOD nutzen
ich glaube 3 mal ändern
Ein Programm schreiben LED an.
/* Initialize LEDs, User Button and LCD on STM32F429I-Disco
---------------------*/
// GPIOD Takt einschalten
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
// GPIOA Takt einschalten
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit (&GPIO_InitStructure);
// Konfiguriere PD15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOG, &GPIO_InitStructure);
// GPIO_ResetBits(GPIOD,GPIO_Pin_14);
GPIO_SetBits(GPIOG,GPIO_Pin_14);
Hallo Lutz,
ich würde auch ganz langsam anfangen. Es ist noch kein Programmierer vom
Himmel gefallen, ich habe Jahre gebraucht & lerne immer noch.
Wir sollten aber vielleicht erst einmal einen gemeinsamen Nenner finden,
ab dem wir dann die Programmierung & Fehleranalyse machen können.
Diese Cortexe haben es in sich. Überraschen mich immer wieder, vor allem
auf HW-Seite.
mfg
Olaf
@obrecht
1.)Ich verwende gar keine IDE, sondern nur st-util und
arm-none-eabi(-gdb) um die verbindung aufzubauen und um Programme aufs
Board zu laden.
2.)Ja, ich kann eine .hex aufs Board laden
3.)Ich will ja nur euren Quellcode und nicht die Compilierten elfs,
binarys und hexes
@lutz h
Durch das LED anschalten bin ich schon durch LED+Taster ist mein zweiter
Schritt.
@obrecht
Ich hab ja auch nicht gesagt, dass ich schon ausgelernt habe. Mit µC +C
habe so gut wie keine Erfahrung(n paar basics) und mit Arduino bin ich
sehr gut klargekommen. Sonstige C-Kentnisse: gut; Assembler:
garnich(wobei ich es lernen möchte)
12V DC schrieb:> Durch das LED anschalten bin ich schon durch LED+Taster ist mein zweiter> Schritt.
ich würde vorschlagen als zweiten schritt die LED wieder Auszuschalten,
ohne einen Taster abzufragen.
Beispiel:
GPIO_SetBits(GPIOD,GPIO_Pin_14);
;
GPIO_ResetBits(GPIOD,GPIO_Pin_14);
Ich weis ist logisch, aber damit Testen wir trotzdem die Funktion.
Als nächstes binde ich den Taster ein, der liegt glaube ich auf dem
gleiche PIN bei beiden Ports
Komisch ohne die Zeilen die ich mit ////? markiert habe wird bei mir der
Taster nicht erkannt. Ist die Abfrage zu schnell?Vom Compiler optimiert?
// Konfiguriere PA0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
////////////////////////////////////////////////////////
.
.
.
.
.
do{
////?
////? int hhh=(GPIOA->IDR & 0x0001);
////? char Line[25];
//// ? sprintf(Line,"%d",hhh);
////? LCD_DisplayStringLine(LCD_LINE_1,(uint8_t*)Line);
if (!(GPIOA->IDR & 0x0001))
{
GPIO_ResetBits(GPIOG,GPIO_Pin_14);
}
else
{
GPIO_SetBits(GPIOG,GPIO_Pin_14);
}
} while (1);
@lutz h
Durch das an und ausschalten bin ich auch schon durch. Geht auch.
Liegt das bei deinem Quellcode vielleicht an dem !-Operator in der
Bedingung?
Ja der ist von der Fehlersuche.
An der Stelle war bei komisches Verhalten,
do{
if (GPIOA->IDR & 0x0001)
{
GPIO_ResetBits(GPIOG,GPIO_Pin_14);
}
else
{
GPIO_SetBits(GPIOG,GPIO_Pin_14);
}
} while (1);
war der Code. dann habe ich zum Debuggen einzelne Zeilen verändert,um
den Fehler zu finden (LED schaltet nicht um).
Das Ausrufezeichen hat nichts geändert, die LED wurde trotz Tastendruck
nicht umgeschaltet.
Dann habe ich zum Debuggen den Taster am Bildschirm anzeigen lassen.
Plötzlich reagierte auch die LED auf den Tastendruck. Jetzt habe ich
wieder der originalen Code, und die LED reagiert.
Fehlerheilung durch Handauflegen?
Nicht alles zugleich, sondern Schritt für Schritt:
- LED ein/aus
- LED blinken
- UART senden Zeichen
- UART senden Text
- UART senden Zahl
- ganzen Port einlesen und über UART anzeigen (Hex-Zahl)
- gewünschtes Bit maskieren und anzeigen
- und nun kann man das Bit nehmen und damit die LED steuern.
lutz h. schrieb:> Jetzt habe ich> wieder der originalen Code, und die LED reagiert.> Fehlerheilung durch Handauflegen?
Nö, der Fehler ist einfach nur müde geworden und schläft gerade.
Aber er kommt wieder, solange Du ihn nicht gefunden hast, versprochen.
Vielleicht den Pullup vergessen?
Seid ihr sicher, dass es pullunder sin muss und nicht pulldown oder up?
Ich probier es gleich noch mal. Und wie gesagt Text senden kann ich noch
nicht, ohne IDE gestaltet sich das schwieriger.
IDE: Rowley Cross Studio
STM32 Dicovery-Board F4 ohne LCD
Verwendung der STM32F4xx Standard Peripherals Library
[[http://www.mikrocontroller.net/articles/STM32F10x_Standard_Peripherals_Library]]
Target Prozessor: STM32F407VG
Preprozessor Definition: USE_STDPERIPH_DRIVER,STM32F40_41xxx
Dieses Beispiel läuft in meiner IDE verbunden über ST-Link/V2 ohne
Probleme.
LA zeigt auch schön, wenn Taster betätigt, das LED verzögert anspricht.
mfg
Olaf
Wie sieht die Funktion SysTick_Handler() bei dir aus? Mit
SysTick_Config(SystemCoreClock/100); wird diese Funktion alle 100µs
aufgerufen.
Hab hier ein LPC17xx Projekt, bei dem ist in diesem Handler eine
Endlosschleife. Dein Problem ist, das du den Handler nicht implementiert
hast, und du dadurch nach 100µs in einer Endlosschleife hängst. Dein
Code wird ab da nicht mehr ausgeführt.
Einfach in deiner main.c diese Funktion implementieren, ohne Code drin,
dann müsste es gehn. (oder SysTick_Config auskommentieren da du den
anscheinend eh nicht benutzt im Moment)
1
voidSysTick_Handler(void)
2
{
3
}
Würdest du eine IDE benutzen, hättest du den Fehler innerhalb von
Sekunden gefunden indem du einfach im Debugger auf Pause gedrückt
hättest.