Forum: Mikrocontroller und Digitale Elektronik STM32 Software Reset nach Befehl per CAN


von Ma B. (drumstick)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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.

von Ma B. (drumstick)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich glaube, das müsste es sein, musst selbst die Bits rausknobeln:

SCB->AIRCR = 0x05FA0001;

von (prx) A. K. (prx)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Wie ich schon oben schrieb: "Bits selbst raus knobeln" ;-)

von Roland H. (batchman)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Roland H. (batchman)


Lesenswert?

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.

von Ma B. (drumstick)


Lesenswert?

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.

von Roland H. (batchman)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Ma B. (drumstick)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
Noch kein Account? Hier anmelden.