Hallo Ich versuche mit dem STM32 eine Transeiver Chip anzusprechen, um eine RFID-Karte abzufragen. Als verbindung zwischen beiden Geräten wird SPI verwendet der mit 5Mhz getaktet werden sollte. Nutze ich 8 als Prescaler sieht mein SPI Signal aus wie es aussehen sollte: Der Takt liegt nur an wenn ich Daten Sende/Empfange. Chipselect wird vor der Übertragung auf Low und nach der Übertragung wieder auf High gesetzt. Nutze ich 16 als Prescaler liegt der Takt dauerhaft an und Chipselect wird auch nicht mehr richtig geschaltet. Mein zweites Problem ist das ich eine delay_ms(); Funktion brauche um nötige Pausen in der Datenübertragung einzubauen. Da es eine ensprechende Funktion nicht zu geben scheint muss ich diese wohl selber realisierung und bin mir nicht sicher bin wie ich diese am besten realisieren soll.
Stephan van den Boom schrieb im Beitrag #2226217: > Da es eine ensprechende Funktion nicht zu geben scheint muss ich diese > wohl selber realisierung und bin mir nicht sicher bin wie ich diese am > besten realisieren soll. Nicht empfehlenswert für Delays: Einfache abgezählte Schleifen, wie man das bei PIC oder AVR gern macht. Zu viel Variablen drin, bin hin zu Adresslage und Speicherart. Ideal: Timer. Beispielsweise Systick. Ist die Wartezeit kleiner als dessen Periode, dann einfach so lange warten bis der Zielwert erreicht ist. Andernfalls den Systick-Interrupt verwenden. Alternative: Beim Start des Programms die Laufzeit einer bestimmten Funktion mit nur einer Programmschleife drin per Systick einmessen und einen Multiplikator ausrechnen, der von nun an aus den Mikrosekunden die Anzahl Durchläufe berechnet. Aufpassen dass diese Funktion vom Compiler nicht inlined wird.
Also ich habe bis jetzt nur mit PIC und AVR gearbeitet und ich muss zugeben das mir ist der Umgang mit Systick völlig schleierhaft ist.
Ist der einfachste aller Timer eines STM32. Der gehört nicht zur Peripherie von ST sondern zum Cortex-Core, ist folglich wie der Interrupt Controller beim Core dokumentiert, und arbeitet ungefähr so wie ein AVR-Timer im CTC-Modus. Gedacht als Quelle regelmässiger Interrupts (daher der Name), beispielsweise alle 1ms.
Ich hab mir ein bisschen was zusammen gebaut, ich bekomme aber beim Kompilieren Fehler.
Deine ganzen Includes am Anfang sind nicht konform, wenn Du die STM FW Lib benutzt. Sieh Dir erstmal paar Beispiele, sind innerhalb der LIB, an. Aktuelle Version ist übrigens 3.5.0 Folgendes reicht normalerweise aus: #include <stddef.h> #include "stm32f10x.h" Wenn nicht, hast Du irgedwelche Einstellungen der IDE nicht richtig gemacht. Wo ist die SystemInit() und die Interruptfunktion für den Systick, meist heist die SysTick_Handler(void)?
Mit den Includes hab ich mich am Template orientiert, und die unnötigen raus geworfen. Die systemInit() ist oben in der main() und war vorher in der SPIInit(). Die Interruptfunktion für den Systick? Ich hab gerade echt keinen Durchblick ich hab noch nie mit Interrupts gearbeitet. Die Hilfe der LIB hat mir auch nicht wirklich weiter geholfen. Ich werde mir morgen mal das SysTick Beispiel ansehen ich hoffe ich kapier es dann. MFG Stephan
Welche IDE, welchen Debugger hast Du? Deine Aufgabenstellung ist nicht gerade ein Einsteigerthema. Für den Umstieg auf ARM sollten schon paar Erfahrungen AVR oder ähnlich vorliegen. Interrupts sind das A und O, sollte man unbedingt können. >Mit den Includes hab ich mich am Template orientiert, und die unnötigen >raus geworfen. Brauchst Du nicht machen, der Linker sollte so klug sein, alle nicht benötigten wegzulassen. Oder Du hast noch eine Uralt FW-Lib, da musste man das so machen.
Guten Abend Ich habe Heute wieder viel gebastelt und bin ein gutes Stück weiter. Ich nutze KEIL uVision als IDE und einen Segger J-Link Adapter/Debugger. Ich habe mir das auch alles etwas einfacher vorgestellt und auch eigentlich gedacht das mir jemand beim Einstieg helfen könnte, naja was Solls. Die Library hab ich auf Version 3.5 umgestellt. Der Controller ist momentan mit 24 Mhz getaktet da komm ich besser auf meinen SPI Clock von 6 Mhz (Hab nochmal geschaut was ich brauche). Mit den Delays das klappt soweit auch allerdings müsste ich mit meinem Delay us genau arbeiten können. Das maximum was ich bis jetzt hinbekommen habe ist: SystemCoreClock /100000 das müssten 10us sein. wenn ich mit dem Teiler weiter hoch gehe gibt es keine Ausgabe mehr auf dem SPI Bus. Hat jemand da nen Tipp wie ich auf us komme? MFG Stephan
Delay über die Befehlszyklen zu machen, wie vom AVR bekannt, klappt bei µC dieser Liga nicht. Die Zykluszeit ist bedingt durch die mehrstufige Pipeline nicht konstant vorhersagbar. Mit einem Timer sollten 10us kein Problem sein.
Ich mache das doch jetzt mit einem Timer (siehe http://www.mikrocontroller.net/attachment/highlight/112946) 10us schaffe ich auch ich möchte aber 1us genau verzögern können.
Dann nimm einen Extra-Timer dafür. Den läßt Du im Interrupt ein Flag setzten. Je nach Vorteiler kannst Du Dir dann auf den Takt genau eine Verzögerung basteln. Grüße Noob
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.