Hallo, Ich nutze sie STM32 lib und ISystem mit code sourcery. Wenn ich den Beispielcode aus der Lib nehme dann geht es. Wenn ich sie allerdings herunterkürtze funktioniert es plötzlich nicht mehr. Habe auf den folgenden Code heruntergekürtzt. die Spi wird eingerichtet aber wenn ich etwas schicken will passiert nichts. Im Debugger ist zu sehen das nicht in das SPI Datenregister geschrieben wird. Ich verstehe nicht warum, da alles da ist was man braucht: #include "stm32f10x_conf.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ SPI_InitTypeDef SPI_InitStructure; /* Private functions ---------------------------------------------------------*/ void RCC_Configuration(void); void GPIO_Configuration(void); int main(void) { /* System clocks configuration ---------------------------------------------*/ RCC_Configuration(); /* GPIO configuration ------------------------------------------------------*/ GPIO_Configuration(); /* SPI1 configuration ------------------------------------------------------*/ SPI_InitStructure.SPI_Direction = SPI_Direction_Tx; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); /* Enable SPI1 */ SPI_Cmd(SPI1, ENABLE); /* Transfer procedure */ /* Send SPI1 data */ SPI_I2S_SendData(SPI1, 0x55); while (1) {} } void RCC_Configuration(void) { /* Enable peripheral clocks --------------------------------------------------*/ /* GPIOA, SPI1 clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure SPI1 pins: SCK, MISO and MOSI ---------------------------------*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); }
- GPIO_Pin_6 sollte Eingang sein. - Direction "SPI_Direction_1Line_Tx" Den SPI_BaudRatePrescaler_16 auf 256 erhöhen, dann sieht man es besser am Oszi. In dem "SPI_Init()" sind viele assert_param(), darin z.B. IS_SPI_DIRECTION_MODE(), darin wiederum sieht man was für Parameter der erwartet. In Eclipse kommt man da leicht hin, einfach Strg+Linke Maustaste.
Ich benutze nur spi als Ausgang, wie gesagt es funktioniert erst nach meiner kürzung nicht. Der Rest ist Original ST.
SPI_InitStructure.SPI_Direction ist trotzdem falsch besetzt. Es könnte helfen, die bei Parameterfehlern aufgerufene Funktion assert_failed auch zu nutzen.
Der Parameter war zwar falsch, aber das Problem besteht weiterhin, vieleicht ist einer so nett und kann das mal compilieren.
Wenn die Langfassung des Programms funktioniert, die Kurzfassung jedoch nicht, dann liegt es doch auf der Hand, diese Versionen mal en detail zu vergleichen. Und wenn man dabei nichts sieht, dann sukzessive zu kürzen um festzustellen, wann genau das Problem auftritt. Oder ist dir das zu viel Arbeit, sollen andere suchen?
Finde diese Antworten einfach nur schade und wenig produktiv. COPY und Paste und innerhalb 3 Minuten hätte man eine helfende Antwort, anstatt ebenfalls drei Minuten so etwas zu schreiben. Wer nicht helfen will, soll es doch einfach lassen! Ich programmiere am STM32 schon länger und den der sofort etwas produktives damit angestellt hat, den will ich mal sprechen. Ich bin mittlerweile bei einem OVERHEAD von 8k ohne irgendetwas wirklich programmiert zu haben. Langsam geht mir die Lib aufn Sack. Wenn man nicht von den Beispielen zu einem eigenem Programm kommt dann ist das ganze ST System überflüssig. Das es hier wohl an etwas anderem liegt muss man ja auch erstmal wissen. Wer schon spi programmiert hat kann normalerweise mit einem Blick sagen was fehlt. Vermutungen helfen keinem bei dem complexen Zeugs. Habe den Fehler gefunden, aber gut überflüssige 8 Stunden daran gesessen. Obwohl nicht aufgerufen hatte eine Funktion die SPI Behandlung gestört. Da in dieser Funktion aber nichts steht (Platzhalter), weiß ich immer noch nicht warum. Aber schön dass es trotzdem jetzt funktioniert.
Alfred schrieb: > Finde diese Antworten einfach nur schade und wenig produktiv. COPY und > Paste und innerhalb 3 Minuten hätte man eine helfende Antwort, anstatt > ebenfalls drei Minuten so etwas zu schreiben. Danke für die Blumen, aber mit einem Beispiel unter der Verwendung der FWlib konnte ich nicht dienen, da ich die nicht verwende ... > Ich bin mittlerweile bei einem OVERHEAD von 8k ohne > irgendetwas wirklich programmiert zu haben. Langsam geht mir die Lib > aufn Sack. .... was mir beispielsweise diesen Overhead erspart. Allerdings kriegt man den beim GCC ggf. auch mit ein paar Compileroptionen weg. Grobrichtung -ffunction-sections -fdata-sections für die FWlib (und nur die), sowie --gc-sections beim Linken. Allerdings muss man dann aufpassen, dass Int-Handler nicht ebenfalls verschwinden.
Schön, dass es jetzt geht. Wenn es irgendwo anders was rein gespuckt hat, konnte sowiso niemand weiter helfen... Den obigen Code habe ich mit meinem ja schon heute Morgen verglichen und die Diffs gepostet. (Ich nutze den um ein EA-DOG Display zu beschreiben)
Ich bin mir nicht so sicher das alles laufen wird, da ich z.B. das
Linker Script irgendwoher habe. Wenn ich das nicht übersehen habe
liefert die ST nicht mit. Die die ich bei den Beispielen gefunden habe
funktionieren bei mir nicht.
>Schön, dass es jetzt geht. Wenn es irgendwo anders was rein gespuckt
hat, konnte sowiso niemand weiter helfen...
Daher mein Wunsch, das es ein anderer compiliert, wenn es da
funktioniert hätte, bräuchte ich an dieser Stelle nicht weitersuchen.
Mit der Lib werde ich mal sehen, das Problem ist das alles miteinander
vernetzt ist. Entweder man verabschiedet sich davon, oder eben nicht.
Ich suche noch nach der Möglichkeit z.B. die lib mit Option und meine
Sachen ohne Option zu compilieren.
Man bindet einfach die LIB ein, nutz z.B. die Initialisierung der Pheriperie und schaut dann was in den Regsitern drin steht. Später, wenn alles läuft kann auch direkt in die Register die Zahl geschrieben werden, ohne LIB. Die Regsiter "Manuell" zu nutzen, ohne LIB ist auch nicht sehr schwer. Ich nutze gerne die LIB. Hat auch einen Vorteil: Wenn man irgend etwas benutzt, dann kann man durch das ganze Projekt nach dem gleichen Befehl suchen, und findet so schnell heraus wo evt. das gleiche "Doppelt belegt" ist/wurde. Ich habe viele C-Dateien, eine für LCD, eine für Seriell, eine für Timer, eine für Dimmer usw. Diese nutzen z.B. Timer. Wenn ich ein neues Projekt mache, dann stupfe ich mir das ganze zusammen und dann muss ich schauen dass das eine Modul nicht den gleichen Timer nutzt wie ein anderes. Die Lib hilft zumindest sehr einen Überblick zu behalten und die Struktur ist auch nicht kryptisch. Ist zwar etwas lästig eine komplexe Struktur auszufüllen, anstatt ein Register mit einem Hex Code zu beschreiben, dafür wartungsfreundlicher. Die 8KB Lib-Overhead sind doch auch nicht so viel (=teuer). Ich nutze sowiso nur noch die 256KB Variante und derzeit bin ich bei 110KB Flash-Nutzung. Wenn man was sparen möchte, dann kann man immernoch die Compilleroptionen aktivieren, dann spart man etwa 1/3 Platz. Ist aber nur Sinnvoll für Produktion, denn der kleinere Code ist sehr schwer debugbar.
Ich bin langsam völlig verzweifelt und habe so eine Art HENNE EI Problem. Ich bin mir nicht sicher was läuft und was nicht. Ich habe einen STM32f105VC und daran einen ISYSTEM 5000 (6K €), also eigendlich gut ausgestattet. Das ganze wird mit codesourcery compiliert. Nachdem ich nun wieder und wieder ein Grundsystem aufgestellt habe und nach euren Infos (sorry, bin langsam echt gereizt) alles heruntergekürtzt hatte, schien alles zu laufen. Als ich dann meine restlichen GPIOS wieder zuschalten wollte ging es wieder nicht. Dann habe ich mal alles auf Anfang gesetzt und RCC und GPIOs gesetzt. GING? Dann habe ich im main.c nur GPIO_InitTypeDef GPIO_InitStructure; in die Main geholt, dann absturz (???). lege ich sie wieder in den globalen bereich gehts wieder. OK dachte ich, jetzt lagere ich den Initialisierungsteil der in der Main funktioniert in eine Funktion. Habe die GPIO_InitTypeDef GPIO_InitStructure; extern gesetzt und wieder geht nichts. WAS mache ich nur falsch, ähnlich schauerlich reagierte heute morgen spi. Ich weiß nicht mehr ob ich etwas falsch mache oder vieleicht meine Umgebung spinnt, oder das Linker script. Frage: Kann mir einer mal eine komplett lauffähige Umgebung geben mit allem was dazu gehört. Ich weiß langsam nicht mehr vor und zurück. Irgendwas scheint nicht zu stimmen sobalt große Variablen beschrieben werden.
Lauffähige Umgebung ist hier Beschrieben: STM32 Artikel (Siehe Teil Installation für...) Auch gibt es ein Demo-Projekt von Martin Thomas für Eclipse.
Alfred schrieb: > Ich habe einen STM32f105VC und daran einen ISYSTEM 5000 (6K €), also > eigendlich gut ausgestattet. Das ganze wird mit codesourcery compiliert. Codesourcery bedeutet, dass man an manchen Stellen selber Hand anlegen muss, wo einem dies in kommerziellen Entwicklungssystemen abgenommen wird. Wie beispielsweise beim Startup und beim Debugging mit OpenOCD. Geld scheint ja da zu sein. > Frage: Kann mir einer mal eine komplett lauffähige Umgebung geben mit > allem was dazu gehört. Sorry, ich verwende Crossworks. Andererseits hast du hier nie dein komplettes Projekt abgeladen, so dass auch keiner darin nach den Trüffeln schnüffeln kann.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.