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.
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."
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.
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.