Hallo, ich arbeite mit dem stm32f107vct6 und dem uVision von Keil. ich habe die Aufgabe einen Resset durchführen zu lassen, wenn ein bestimmter Request per CAN Bus eintrifft. Gibt es noch weitere Möglichkeiten, ausser per WDT? Danke und Gruss! M.B.
Ich bin mir jetzt nicht ganz sicher, aber es gibt es Reset Control Register, darin kann man einen Software-Reset ausführen und der Prozessor startet komplett neu. Vermutlich ist das ein Prozessor Register, bin mir jetzt nicht ganz sicher. Im RM0008 steht was unter "Software Reset", es muss das SYSRESETREQ Bit gesetzt werden.
habe im PM0056 folgendes gesehen. Hat jemand eine Idee was "outer system" bedeuten könnte? Bit 2 SYSRESETREQ System reset request This is intended to force a large system reset of all major components except for debug. This bit reads as 0. 0: No system reset request 1: Asserts a signal to the outer system that requests a reset.
Ich glaube, das müsste es sein, musst selbst die Bits rausknobeln: SCB->AIRCR = 0x05FA0001;
M. B. schrieb: > habe im PM0056 folgendes gesehen. Hat jemand eine Idee was "outer > system" bedeuten könnte? PM0056 beschreibt ausschliesslich den von ARM zur Verfügung gestellten Cortex-M3 Core mit NVIC und Debugging, und aus dessen Sicht muss man das betrachten. Das ist zunächst nur ein Signal, dass der Core erzeugt und dem übrigen Chip zur Verfügung stellt. "Outer system" heisst hier also: alles ausser dem Core selbst. Was der Gesamtchip damit anfängt ist dadurch jedoch nicht vorgegeben, das ist nicht Sache von ARM (PM0056) sondern von ST (PM0008).
Markus Müller schrieb: > SCB->AIRCR = 0x05FA0001; Dummerweise ist dieser Wert nicht zulässig. Bit 0 darf nicht 1 sein, obwohl natürlich genau dort der Hase im Pfeffer liegt. PM0056: "When writing to the register you must write 0 to this bit, otherwise behavior is unpredictable." Daraus und der etwas abweichenden ARM-Version der Core-Doku nach zu schliessen ist dieses Bit wohl ausschliesslich dafür gedacht, dass ein Debugger den Core anhält, das Bit setzt, und dann wieder startet: "For debugging, only write this bit when the core is halted."
Markus Müller schrieb: > Im RM0008 steht was unter "Software Reset", es muss das SYSRESETREQ Bit > gesetzt werden. Yep. Also SCB->AIRCR = 0x05FA0004; und nicht VECTRESET, wie in SCB->AIRCR = 0x05FA0001; "Software reset The SYSRESETREQ bit in Cortex™-M3 Application Interrupt and Reset Control Register must be set to force a software reset on the device. Refer to the STM32F10xxx Cortex-M3 programming manual (see Related documents on page 1) for more details."
Wie ich schon oben schrieb: "Bits selbst raus knobeln" ;-)
Ergänzend dazu, auch als allgemeine Anlaufstelle für SW-Reset, es gibt dafür eine Funktion in core_cm3.h bzw. core_cm4.h:
1 | static __INLINE void NVIC_SystemReset(void) |
2 | { |
3 | SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | |
4 | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | |
5 | SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ |
6 | __DSB(); /* Ensure completion of memory access */ |
7 | while(1); /* wait until reset */ |
8 | } |
Ob diese Funktion das dann Gewünschte erledigt, hängt davon ab, ob der Hersteller ... A. K. schrieb: > Was der Gesamtchip damit anfängt ist > dadurch jedoch nicht vorgegeben, das ist nicht Sache von ARM (PM0056) > sondern von ST (PM0008). ... das auch durchgezogen hat. Beispielsweise steht beim lpc1769 an dieser Stelle:
1 | [2] SYSRESETREQ WO System reset request: |
2 | 0 = no system reset request |
3 | 1 = asserts a signal to the outer system that requests a |
4 | reset. |
5 | This is intended to force a large system reset of all major |
6 | components except for debug. Note: support for |
7 | SYSRESETREQ is not included in LPC17xx devices. |
Ich meine allerdings, dass es auf dem LPCXpresso lpc1769 geht, und z. B. auf dem stm32f4 discovery geht es nicht (der SW-Reset).
Roland H. schrieb: > Ich meine allerdings, dass es auf dem LPCXpresso lpc1769 geht, und z. B. > auf dem stm32f4 discovery geht es nicht (der SW-Reset). Süss. Also genau umgekehrt wie dokumentiert. Denn ST sagt ja, dass es damit geht und NXP, dass es damit nicht geht.
A. K. schrieb: > Süss. Also genau umgekehrt wie dokumentiert. Denn ST sagt ja, dass es > damit geht und NXP, dass es damit nicht geht. Hängt vermutlich mit dem Board zusammen: Beim stm32f4 discovery geht der Core wahrscheinlich schon in den Reset, das Board bekommt davon allerdings nichts mit.
Hallo! habe
1 | NVIC_SystemReset(); |
getestet. Alle Variabeln werden auf 0 gesetzt und das Programm wird neu gestartet. Es funktioniert also mit einem stm32f107vct6. Vielen Dank für Eure Hilfe und nette Grüsse! M.B.
Wunderbar. Könntest Du bitte noch sagen, wie die CPU eingebunden ist? Eigenes Board? Irgendwelche (Reset-)Leitungen besonders herausgeführt/angebunden oder ging es "einfach so"?
Sowas ist rein intern. Immerhin geht es hier um die Frage, wie der Core und der Rest vom STM32 miteinander verbunden sind, nicht um irgendwelche externen Leitungen.
In diesem Projekt wurde ein eigenes Layout erstellt. Der NRESET wird für den JTAG verwendet. Sonst fällt mir nichts besonderes auf. Was ich im ersten Post falsch angegeben hatte, auf unserer Hardware ist der STM32F103VDT6 eingebunden. DAS RTX ist aufgesetzt. Verwendeter Oszillator ist extern. Ich hoffe Du willst damit nicht sagen, dass es eher Zufall ist, das der Reset funktioniert!? Danke und Gruss! M.B.
Da ST das ausdrücklich für diesen Zweck dokumentiert hat war das wohl kein Zufall, keine Sorge. Es sei denn im Errata-Sheet steht dazu was drin. Umgekehrt wärs aber denkbar, dass auch NXP das beim LPC1769 eigentlich vorgesehen hatte, aber dabei ins Klo griff und es nicht in allen Lebenslagen funktioniert. Und sie es früh genug merkten, um es nicht ins Errata-Sheet, sondern in die Doku selbst reinzuschreiben.
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.