Forum: Mikrocontroller und Digitale Elektronik STM32 CAN Active abfragen + uC resetten


von P. O. (neop13)


Lesenswert?

Hallo zusammen.

Ich brauche mal wieder hilfe.. Hab gleich 2 Fragen.

Ich habe einen STM32F105 verwende codesourcery G++

dieser hängt an einem CAN System dran und Loggt mit... Hat auch nur 
wenige Aufgaben Pins (bzw. LEDs) ein oder ausschalten, wenn bestimmte 
nachrichten laufen.

1.Frage:

Wie kann ich ermitteln ob der Canbus an dem ich hänge noch Aktiv ist. 
ich würde gerne darauf reagieren, wenn der BUS off ist.

Habe in der Doku zum STM nur gefunden was ihn in ein Bus-Off bringt. 
BOFF: im CAN error status register (CAN_ESR)

Ich möchte ihn nämlich nach einiger zeit auch in ein Sleep mode 
versetzen, das darf aber nur passieren, wenn der can den er abhört off 
ist.

das mach ich mit
1
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

2.Frage:
Da ich ab und zu ein Problem habe, wenn der Controller in bestimmten 
Anwendungen zu lange läuft. möchte ich ihn gerne über den code Resetten.
Ich hab in der Doku nur das hier gefunden:
1
Software reset
2
The SYSRESETREQ bit in Cortex-M3 Application Interrupt and Reset Control Register
3
must be set to force a software reset on the device. Refer to the STM32F10xxx Cortex-M3
4
programming manual (see Related documents on page 1) for more details.

Danke

von Arne (Gast)


Lesenswert?

P. Ostrich schrieb:
> 2.Frage:
> Da ich ab und zu ein Problem habe, wenn der Controller in bestimmten
> Anwendungen zu lange läuft. möchte ich ihn gerne über den code Resetten.
In 0x05FA0000 eine 0x00000004 schreiben (lt. meinem Code)

von (prx) A. K. (prx)


Lesenswert?

P. Ostrich schrieb:

> Wie kann ich ermitteln ob der Canbus an dem ich hänge noch Aktiv ist.
> ich würde gerne darauf reagieren, wenn der BUS off ist.

Es m.W. nur einen Weg, einen inaktiven aber mit Nodes besetzten CAN Bus 
von einem toten CAN Bus ohne funktionierende Nodes zu unterscheiden: 
Regelmässig NOP-Messages ohne automatischen Retry (!) senden und sehen 
ob sie quittiert werden (ACK Bit). Passiv kann man nur feststellen, ob 
ab und zu Messages kommen oder nicht.

> Habe in der Doku zum STM nur gefunden was ihn in ein Bus-Off bringt.
> BOFF: im CAN error status register (CAN_ESR)

Bus-Off ist ein Notmechanismus. Wenn eine Node zu viele Fehler 
produziert, dann hängt sich sich selbst vom Bus ab.

> Ich möchte ihn nämlich nach einiger zeit auch in ein Sleep mode
> versetzen, das darf aber nur passieren, wenn der can den er abhört off
> ist.

Was verstehst du unter "off"? Dass keine Node mehr drin ist, oder dass 
niemand was sendet?

> Ich hab in der Doku nur das hier gefunden:

Und was missfällt dir daran?

von P. O. (neop13)


Lesenswert?

Arne schrieb:
> P. Ostrich schrieb:
>> 2.Frage:
>> Da ich ab und zu ein Problem habe, wenn der Controller in bestimmten
>> Anwendungen zu lange läuft. möchte ich ihn gerne über den code Resetten.
> In 0x05FA0000 eine 0x00000004 schreiben (lt. meinem Code)
Kannst du mir da evtl. einen Auszug von zeigen??? Wie du das in deinem 
code setzt

Hab eben auch gefunden, das er den reset durch
1
NVIC_SystemReset();
macht. Frage ist nur, was resettet wird.... muss nochmal mehr lesen

A. K. schrieb:
> Passiv kann man nur feststellen, ob
> ab und zu Messages kommen oder nicht.

das würde mir schon reichen.. kannst du mir dazu bissl helfen??

A. K. schrieb:
> Was verstehst du unter "off"? Dass keine Node mehr drin ist, oder dass
> niemand was sendet?

das niemand mehr was sendet, bzw. sich selber abgemeldet hat.... kommt 
in meinem Fall quasi aufs selbe raus...
Also das passive abfragen genügt mir erst mal.

Daaanke schon mal

von (prx) A. K. (prx)


Lesenswert?

P. Ostrich schrieb:

> das würde mir schon reichen.. kannst du mir dazu bissl helfen??

Was mir dazu auf Anhieb einfällt: Keine Filter verwenden und auf die 
eigenen Messages in der ISR filtern. Dann kommt bei jeder Message ein 
Interrupt, egal ob passend oder nicht. Wie du rauskriegst, dass lange 
nichts mehr kam, hängt dann von deiner übrigen Arbeitsweise ab. Bei 
einem bis an Oberkante Unterkiefer belegten 1Mb CAN Bus nur begrenzt 
empfehlenswert.

Alternative Idee: CANRX Pin nebenbei als Interrupt-Pin definieren aber 
diesen Interrupt nicht einschalten, nur das betreffende Flag setzen 
lassen. Flag löschen, 1 Jahr warten, wenn immer noch gelöscht => tot.

von Arne (Gast)


Lesenswert?

Muss natürlich "0x05FA0004 an 0xE000ED0C schreiben" heißen.

von P. O. (neop13)


Lesenswert?

A. K. schrieb:
> Keine Filter verwenden und auf die
> eigenen Messages in der ISR filtern

ich sende ja keine msg ich höre nur ab. Senden ist nur gaaanz selten mal 
der Fall. das lase ich mal außen vor.

P.S.: Ich bin auch noch recht am Anfang mit meinem Wissen. Sorry für die 
evtl. doofe Fragen teilweise


von daher muss ich für dies hier

A. K. schrieb:
> Alternative Idee: CANRX Pin nebenbei als Interrupt-Pin definieren aber
> diesen Interrupt nicht einschalten, nur das betreffende Flag setzen
> lassen. Flag löschen, 1 Jahr warten, wenn immer noch gelöscht => tot.

noch genauer nachlesen

Danke

von Peer (Gast)


Lesenswert?

Arne schrieb:
> Muss natürlich "0x05FA0004 an 0xE000ED0C schreiben" heißen.

Ich bin  ganz neu und verstehe auch nicht was ihr genau redet... aber 
ich starte auch mit nem stm32 aber der F102.

Kann mir jemand erklären wie ich das mache? Also eine Adresse direkt 
beschreiben bzw Abfragen (geht ja sicher über ne if schleife...)

Aber das setzen???
muss ja irgendwie so gehen oder? Also mal ganz blöd dargestellt
1
Adresse 0xE000ED0C = 0x05FA0004;

von (prx) A. K. (prx)


Lesenswert?

Könnte es sein, dass ein komplexer Controller wie dieser STM32 für dich 
ein paar Latten zu hoch hängt? Für AVRs gibts hier auf der Seite ein 
Tutorial, eine ähnlich anfängerfreundliche Einstiegsanleitung für STM32 
ist mir leider nicht bekannt.

von Matthias K. (matthiask)


Lesenswert?

1
NVIC_SystemReset();
gehört zum CM3 Kern und ist in der core_cm3.h definiert. Sollte klappen.

von P. O. (neop13)


Lesenswert?

Matthias K. schrieb:
>
1
NVIC_SystemReset();
> gehört zum CM3 Kern und ist in der core_cm3.h definiert. Sollte klappen.

Ja das hab ich schon hinbekommen hatte ich oben geschrieben.
aber danke

von P. O. (neop13)


Lesenswert?

Zum CAN Active:

Eine andere Idee währe es ein Flag abzufragen. Es wird doch sicherlich 
ein Flag geben, was für Bus "aktive",  "full" oder so steht geben...
Kann man das nicht abfragen?

von (prx) A. K. (prx)


Lesenswert?

P. Ostrich schrieb:

> Eine andere Idee währe es ein Flag abzufragen. Es wird doch sicherlich
> ein Flag geben, was für Bus "aktive",  "full" oder so steht geben...
> Kann man das nicht abfragen?

Gib Bescheid wenn du eines findest. CAN hat kein Trägersignal wie bei 
Funk oder Modems und keinen Presence Pulse wie Ethernet.

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.