Forum: Mikrocontroller und Digitale Elektronik STm32F103 Blue Pills: Kein Software Reset mehr möglich?


von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

irgendwie habe ich gestern in Folge eines Threads mal alle Boards mit 
dem sog. Blinky Code von Greasewaezle bespielt, der echte von falschen 
BP's unterscheiden kann. Dabei fielen einige Boards aus ich habe rund 
15. Blinky kappt die swd Verbindung, die Chips sind danach nicht mehr 
erreichbar. Man muss den Boot Jumper umstecken, damit das ST Link Tool 
sie nach einem Reset erkennt. Taste drücken, schnell loslassen und Chip 
Clear. Jumper zurück setzen.

Seitdem klappt in meiner Anwendung der NVIC Reset nicht mehr! im 
Debugger sieht man deutlich, dass er endlos bei dem letzten DSB hängen 
bleibt. Totaler Stillstand, auch kein INT läuft mehr, da würde eine LED 
weiterblinken, alles steht. Denn auch im Debug Mode hat er früher 
resettet, wobei dann allerdings der Debugger neu verbunden werden 
musste, da die verbindung getrennt wurde. DWT Timer nutze ich nicht, 
spielt man mit dem rum klappt im Debugger einiges nicht mehr richtig.

Ok.. mal die Option Bytes kontrollieren... sieht soweit gut aus. Da wo 
sie immer waren.

Test: Den Software WDT aktvieren... der lief ja bisher auch, obwohl ich 
ihn nicht verwendete da die Boards stabil liefen.
1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
2
RCC_LSICmd(ENABLE);
3
while(IWDG_GetFlagStatus(IWDG_FLAG_PVU) == SET);
4
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
5
IWDG_SetPrescaler(IWDG_Prescaler_256);
6
IWDG_SetReload(10);
7
IWDG_Enable();
8
while(1);

Pustekuchen, läuft ins while(1) und bleibt da stehen. Nix Reset!

Blöd nur, dass das SoftReset für mich wichtig ist, damit ich nach einem 
Stop sauber aufstarte und alle Vars im _bss dann 0 sind. Ok, man kann 
den Stop mit einem Reset verbinden bei den Option Bytes aber da muss 
noch einiges vorher erledigt werden, der Zeitpunkt des Aufwachens wird 
auf SD Karte geschrieben weil das ein Data Logger ist.

Und jetzt die Gretchenfrage: Ich habe am Code nichts ändert, selbst ein 
Backup des Vortages mal zurück gespielt.

keines der Boards die mit "Blinky" bespielt wurden aktzeptiert einen 
Reset. Ob mit WDT oder mit NVIC. Und ich habe leider alle getestet.

Und das ist aktuell jedenfalls für mich unerklärlich, fällt in den 
Bereich "Unerklärliche Phänomene" oder wie zu C64 Zeiten "Little 
Computer People", wenn etwas nicht erklärbar war.

Da wäre noch der Bootloader, der sicherlich platt ist aber ich nehme eh 
die swd, nix mit Arduino oder so.

Reset Taste klappt noch, NRST ist ja nicht heraus geführt bei den BP's. 
Nur bei den Black Pills.

Schonmal jemand sowas gehabt? Irgendwelche geheimen Bits?

Christian
1
/** \brief  System Reset
2
3
    The function initiates a system reset request to reset the MCU.
4
 */
5
__STATIC_INLINE void NVIC_SystemReset(void)
6
{
7
  __DSB();                                                     /* Ensure all outstanding memory accesses included
8
                                                                  buffered write are completed before reset */
9
  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
10
                 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
11
                 SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
12
  __DSB();                                                     /* Ensure completion of memory access */
13
  while(1);                                                    /* wait until reset */
14
}

Mein STOP Code
1
           adxl_ACT_Detection(ENABLE);
2
3
            /* Auf 8 Mhz runterschalten, maximales Stromsparen */
4
5
            debug("Sleep:8 Mhz STOP!\r\n");
6
            /* ---- SLEEP SLEEP  SLEEP  SLEEP  SLEEP ----- */
7
            RCC_DeInit();
8
            SYSTICK_ISR_OFF;
9
            __DSB();
10
            PWR_ClearFlag(PWR_FLAG_WU);
11
            PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
12
            SYSTICK_ISR_ON;
13
            /* ---- SLEEP SLEEP  SLEEP  SLEEP  SLEEP ----- */
14
15
            /* INT2: Bewegung erkannt */
16
            SystemInit();                                       /* Systemclocks Init */
17
            RCC_GetClocksFreq(&RCC_Clocks);                     /* Clocks holen   */
18
            SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);    /* Systick einstellen */
19
            SysTick_Config(RCC_Clocks.SYSCLK_Frequency/1000);
20
21
            /* Aktualisierung der RTC Register abwarten */
22
            debug("Wake:Wait RTC\r\n");
23
            f_timevalid = false;  while (!f_timevalid);
24
25
            /* File neu aufmachen */
26
            debug("Wake:Logfile update\r\n");
27
            ErrorPrint(CreateNewDataFile(1));
28
            f_printf(&Fil,"$GNTXT, Bewegung um %02u:%02u Uhr *00\r\n",
29
                     RTC_Now.tm_hour,RTC_Now.tm_min);
30
            ErrorPrint(f_close(&Fil));
31
            DelayMs(10);
32
            f_unmount("");
33
            /* Systemreset */
34
            debug("Wake:System reset\r\n");
35
            /* Reset der CPU */
36
            NVIC_SystemReset();

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?


von Christian (Gast)


Lesenswert?

Nee, das Thema ist ausgekoppelt. Das hat damit nichts zu tun, das gilt 
fuer alle Boards, echte wie Falsche.

von Christian J. (Gast)


Lesenswert?

Ok, ich gebe auf.
Dafür gibt es keine Erklärung mehr nachdem alles nur Denkbare 
ausprobiert wurde :-( Kein Watchdog, kein NVIC resettet die Boards mehr 
und zwar alle nicht.

von Uwe Bonnes (Gast)


Lesenswert?

Christian J. schrieb:
> Ok, ich gebe auf.
> Dafür gibt es keine Erklärung mehr nachdem alles nur Denkbare
> ausprobiert wurde :-( Kein Watchdog, kein NVIC resettet die Boards mehr
> und zwar alle nicht.

Wie ist NRST beschaltet? Wird NRST mit dem NVIC_RESET nach Null gezogen? 
Geht er wieder nach '1'?

von Christian J. (Gast)


Lesenswert?

Uwe Bonnes schrieb:
> Wie ist NRST beschaltet? Wird NRST mit dem NVIC_RESET nach Null gezogen?
> Geht er wieder nach '1'?

Das Problem hat sich gelöst. Eine CuL Litze kam an NRST dran und deren 
Isolierung war schadhaft. Seitdem die weg ist läuft alles. NRST auf Vcc 
gezogen, dann klappen auch die internen Resets nicht mehr. Das war mir 
auch neu. Die internen Resets ziehen über einen Transistor NRST nach 
Masse. Dafür habe ich 2 Tage gesucht und diesen "Verzweiflungs Thread" 
gestartet, weil ich erst dachte ich hätte irgendwas verstellt. Denn die 
Option Bytes liegen ja im Flash und werden beim Start in Ram Zellen 
kopiert, sind mit FLASH->xxxx ansprechbar. Hätte also sein können, dass 
da was zerschossen war. Der EBlink Debug Server kann den Reset auch 
abschalten, also den Knopf und der geht über die swd ins Eingemachte.

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.