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.
SPI_InitStructure.SPI_Direction ist trotzdem falsch besetzt.
Es könnte helfen, die bei Parameterfehlern aufgerufene Funktion
assert_failed auch zu nutzen.
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.
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.