Forum: Mikrocontroller und Digitale Elektronik BLE Nano OTA DFU Bootloader Beispiel läuft nicht


von Markus S. (1fc_schinkenwurst)


Lesenswert?

Hallo zusammen,

ich benutze aktuell das BLE Nano v2 mit dem nrf52832 drauf und einen 
DAPLink USB-Dongle zum programmieren. IDE ist Eclipse mit gcc und nrf5 
SDK v14.2. Mein Ziel ist es, Software über BLE aufzuspielen, also habe 
ich das Beispiel bootloader_secure_ble aus dem SDK nach diesem Tutorial 
versucht aufzuspielen: 
https://devzone.nordicsemi.com/b/blog/posts/getting-started-with-nordics-secure-dfu-bootloader
Ich habe die Funktion leds_init() & buttons_init() an das BLE Nano 
angepasst, die Datei dfu_public_key.c mit einem neuen public key 
aktualisiert und zusammen mit dem s132 softdevice v4.0, meiner Anwendung 
und den bootloader Einstellungen per Drag and Drop geflasht. Meine 
Anwendung läuft gut und ich komme auch in den dfu-Modus durch Drücken 
des Tasters -> LED leuchtet, aber ich kann kein advertisen feststellen. 
Außerdem springt der Bootloader im dfu-Modus nach der in der sdk_config 
angegebenen Zeit nicht mehr zu meiner Anwendung zurück.
Hat das schonmal jemand von euch gemacht und kann eventuell 
weiterhelfen? Ich bin im Moment leider ratlos..

Danke im Voraus
Markus

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Markus S. schrieb:
> Meine
> Anwendung läuft gut und ich komme auch in den dfu-Modus durch Drücken
> des Tasters -> LED leuchtet, aber ich kann kein advertisen feststellen.



Hast Du Dich in dem Moment mal mit einem Debugger verbunden und Dir den 
Callstack angeguckt?

von Markus S. (1fc_schinkenwurst)


Angehängte Dateien:

Lesenswert?

Ja habe den Debugger angeschmissen, leider mit mäßigem Erfolg ;) Im 
Anhang das Debug-Fenster von Eclipse mit dem Call Stack im dfu-Modus. 
Zuletzt wird der Timer gestartet um dann nach dem Ablaufen die Anwendung 
zu starten. Außerdem habe ich noch die Log-Funktion aktiviert und 
nochmals ohne Anwendung getestet, also nur softdevice und bootloader. 
Hier die Ausgabe:
1
<info> app: Inside main
2
<debug> app: In nrf_bootloader_init
3
<debug> app: in weak nrf_dfu_init_user
4
<debug> app: In real nrf_dfu_init
5
<debug> nrf_dfu_settings: Running nrf_dfu_settings_init(sd_irq_initialized=false).
6
<debug> nrf_dfu_flash: Calling nrf_dfu_flash_init(sd_irq_initialized=false)...
7
<debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
8
<debug> app: Initializing the clock.
9
<info> clock: Function: nrf_drv_clock_init, error code: NRF_SUCCESS.
10
<debug> app: Enter nrf_dfu_continue
11
<error> app: Single: Invalid bank
12
<debug> app: Enter nrf_dfu_app_is_valid
13
<debug> app: Return false in valid app check

Der Error kommt weil keine gültige Anwendung gefunden wurde. Ich kann 
irgendwie nichts außergewöhnliches finden...

Grüße
Markus

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Markus S. schrieb:
> Der Error kommt weil keine gültige Anwendung gefunden wurde. Ich kann
> irgendwie nichts außergewöhnliches finden...

Das sieht so aus, als hättest Du nocht irgend welche Interrupt-Quellen 
aktiv, wenn Du den Bootloader aktivierst. Oder evtl. sogar den Watch Dog 
Timer? Es kann aber auch sein, dass der Debugger das "falsch" zu 
WDT_IRQHandler auflöst und in Wirklichkeit der Default_Handler 
ausgeführt wird. (Das kannst Du im Map-File oder lis-File nachgucken)

von Markus S. (1fc_schinkenwurst)


Lesenswert?

Ich habe im Debug-Modus das Programm einfach laufen lassen und dann 
pausiert um den Screenshot zu machen. In der map-file stehen für 0x78c2a 
sämtliche IRQHandler. Unter anderem auch der Default_Handler und 
WDT_IRQHandler:

...
0x00078c2a                WDT_IRQHandler
...
0x00078c2a                Default_Handler
...

Von meiner Anwendung her dürften keine Interrupts aktiviert sein, das 
ist nur eine einfache LED-Blinklicht-Hello-World Anwendung die mit 
nrf-delay realisiert wurde. Und der Bootloader ist eigentlich reiner 
Beispielcode, mit Ausnahme der Anpassung der Pins für LED und Taster. 
Kann natürlich sein, dass der Button um den Bootloader zu aktivieren mit 
einem Interrupt abgefragt wird. Auch könnte der Timer, der für den 
Sprung zum Hauptprogramm nach einer bestimmten Zeit verantwortlich ist, 
dann einen Interrupt auslöst.

Gruß Markus

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Markus S. schrieb:

> Von meiner Anwendung her dürften keine Interrupts aktiviert sein, das
> ist nur eine einfache LED-Blinklicht-Hello-World Anwendung die mit
> nrf-delay realisiert wurde.

Beide Handler haben die selbe Adresse. Es wird also der Default_Handler 
ausgelöst. Grund hierfür wird Dein delay sein, das wahrscheinlich auf 
dem Systick Timer aufsetzt, welches einen Interrupthandler hat, wechler 
periodisch einen globale Variable hoch zählt.

> Auch könnte der Timer, der für den
> Sprung zum Hauptprogramm nach einer bestimmten Zeit verantwortlich ist,
> dann einen Interrupt auslöst.

Genau, wäre auch mein Favorit. Das könnte man aber auch als Bug in der 
Aktivierung des Bootloaders bezeichnen. Du kannst das ja mal bei Nordic 
einkippen, die sind ja eigentlich ganz offen für soetwas.

Ansonsten entweder alle Interrupts vor dem Ändern der vector table 
abschalten, oder eine extra Runde durch einen Reset drehen und dann 
direkt nach dem Reset den Bootloader starten.

mfg Torsten

von Jim M. (turboj)


Lesenswert?

Markus S. schrieb:
> Von meiner Anwendung her dürften keine Interrupts aktiviert sein

Wieso sehe ich dann app_timer im Call Stack? Dort sind 2 Interrupt 
Handler mit drin (RTC und EGU).

Leider sind alle default Handler dieselbe Funktion, so dass man nicht 
sieht welcher Handler es wirklich war.

Ich tippe auf HardFault, denn sollte man sich sowieso definieren - damit 
man eigene Programmierfehler schneller findet.

von Markus S. (1fc_schinkenwurst)


Lesenswert?

Habe das "Problem" "gelöst" bekommen. Ich habe mit der nrfConnect App 
auf einem Android Pixel Tablet gearbeitet. Diese entdeckt mein BLE Nano 
nicht im Bootloader Modus. Dieselbe App auf einem iPad erkennnt es und 
das Update funktioniert dann auch. Keine Ahnung woran das jetzt liegt.. 
Aber trotzdem danke für eure Mühe.

Grüße Markus

Beitrag #5387293 wurde von einem Moderator gelöscht.
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.