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();
|