Aggiorna il firmware nel campo con la modalità DFU del microcontroller
Contributo di Editori nordamericani di DigiKey
2018-01-24
Quasi ogni sistema embedded ha bisogno che il suo firmware possa essere aggiornato sul campo per aggiungere nuove funzionalità o correggere bug. Tuttavia, gli aggiornamenti sul campo del firmware possono essere difficili in quanto uno sviluppatore deve programmare il bootloader o procurarsi un bootloader da un fornitore terzo.
Esiste un modo più facile. Questo articolo mostrerà come utilizzare la funzionalità di aggiornamento del firmware del dispositivo (DFU) incorporata in molti microcontroller, spesso trascurata.
Opzioni di aggiornamento del firmware
Sviluppare un bootloader da zero non è un'impresa da poco. Gli sviluppatori devono analizzare il proprio spazio flash per poter far coesistere più applicazioni. Quindi devono sviluppare un modo per trasferire il loro codice binario compilato sul microcontroller senza l'uso di uno strumento di programmazione. Ciò richiede lo sviluppo di un proprio protocollo di comunicazione o l'incremento della complessità del sistema aggiungendo memoria esterna per memorizzare nuove immagini. Possono anche aumentare la quantità di memoria interna che hanno sul proprio microcontroller.
Anche lo stesso software può diventare più complesso, dal momento che il bootloader dovrà impostare lo stato del sistema e determinare se è sicuro saltare al codice dell'applicazione o no.
L'uso di un bootloader personalizzato può dare agli sviluppatori la flessibilità necessaria per le loro applicazioni, ma esiste uno standard di aggiornamento del firmware che può funzionare in molte applicazioni che non richiedono l'intervento di uno sviluppatore: la classe DFU (aggiornamento firmware del dispositivo) integrato dello standard USB. Può essere usato per aggiornare il codice dell'applicazione di un microcontroller sul campo attraverso la sua porta USB, il che può ridurre drasticamente il processo di aggiornamento del firmware e il ciclo di sviluppo.
Il DFU è diventato così diffuso che alcuni produttori di microcontroller come STMicroelectronics includono il software necessario per eseguire gli aggiornamenti codificati addirittura nella loro ROM. Quelli che non lo fanno, spesso forniscono codice di esempio su come supportare DFU.
Selezione di un microcontroller compatibile con DFU
Il modo più semplice per supportare DFU è selezionare un microcontroller che abbia DFU già incluso nella sua ROM, come è il caso dei microcontroller STM32 di STMicroelectronics. Fra questi, i dispositivi possono risultare più interessanti per gli esperimenti di uno sviluppatore sono quelli su STM32 IoT Discovery Node e STM32F429 Discovery Kit.

Figura 1: STM32 IoT Discovery Node di STMicroelectronics si basa su un core ARM® Cortex®-M4 con un MCU STM32L475 che include capacità DFU per aggiornamenti firmware. Questo particolare dispositivo è progettato per essere utilizzato come nodo IoT. (Fonte dell'immagine: STMicroelectronics)
STM32 IoT Discovery Node è una scheda di sviluppo a basso costo progettata per essere utilizzata come nodo sensore IoT. La scheda include diverse interfacce per il collegamento della scheda, tra cui Wi-Fi e Bluetooth. La cosa interessante è che l'MCU STM32L475 consente agli sviluppatori di testare e utilizzare le funzionalità DFU su un dispositivo progettato per connettersi a Internet.
Per gli sviluppatori che vogliono testare DFU solo su un dispositivo normale autonomo, STM32F429 Discovery Kit è un kit di sviluppo ben noto e a basso costo per la serie di microcontroller STM32F4. Vediamo come uno sviluppatore potrebbe procedere per testare le funzioni DFU su questi microcontroller.

Figura 2: STM32F429 Discovery Kit di STMicroelectronics si basa su un core ARM® Cortex®-M4. Questo MCU dell'economica scheda di sviluppo include anche funzionalità DFU per gli aggiornamenti del firmware. (Fonte dell'immagine: STMicroelectronics)
Un semplice esempio di DFU
L'accesso a DFU è diverso per ciascun microcontroller. Come esempio, vediamo come uno sviluppatore aggiornerebbe il proprio firmware su un dispositivo che implementa un MCU STM32L475.
Come accennato in precedenza, i microcontroller STM32 includono un bootloader DFU integrato nella loro ROM. Per accedere a quel bootloader, lo sviluppatore deve portare uno dei pin di BOOT a terra mentre l'MCU si sta avviando. I pin di BOOT controllano la modalità in cui si avvia l'MCU, come l'avvio da flash, RAM o, nel nostro caso, la modalità USB DFU.
La preparazione di un'applicazione da scaricare con DFU non richiede alcun lavoro aggiuntivo da parte dello sviluppatore. La GNU Compiler Collection (GCC), insieme a molte altre toolchain, supporta la generazione di un file DFU durante la compilazione di un'applicazione. L'unico accorgimento che lo sviluppatore deve mettere in atto è determinare dove è archiviato quel file: proprio come con qualsiasi applicazione tipica, la cartella di debug o degli oggetti è quella in cui si trova il file .dfu.
Il file DFU è molto simile ad altri formati di registrazione di applicazioni come file binari, s-record ed esadecimali. Il formato del file contiene informazioni su indirizzo e sui dati che vengono inoltrate su USB, elaborate e quindi scritte nella posizione specificata all'interno della flash. Il processo è così semplice che uno sviluppatore non ha praticamente mai bisogno nemmeno di esaminare il protocollo che viene utilizzato. Tutto avviene dietro le quinte, il che aiuta a rendere meno complesso il processo di aggiornamento del firmware e lo sforzo di sviluppo.
Esistono diversi strumenti che uno sviluppatore può utilizzare per trasferire un'applicazione sul proprio microcontroller utilizzando DFU. Uno strumento da riga di comando generale che può essere utilizzato è dfu-util. È disponibile sia per Linux che per Windows® come pacchetto software open-source. Se uno sviluppatore sta lavorando con la toolchain STM, può sfruttare l'applicazione DfuSe di STMicroelectronics (Figura 3).

Figura 3: Lo strumento DfuSe di STMicroelectronics può essere usato per programmare un file DFU generato da un compilatore come GCC e caricato su un microcontroller compatibile con DFU. (Immagine per gentile concessione di Beningo Embedded Group)
DfuSe è una utility GUI Windows che rileverà qualsiasi dispositivo STM32 acceso in modalità DFU e collegato tramite USB al computer. Gli sviluppatori possono recuperare informazioni come il fornitore programmato e gli ID prodotto. Se lo spazio della flash non è stato bloccato appositamente, possono anche copiare il contenuto della memoria dell'MCU e memorizzarlo sul computer utilizzando la casella Upload Action.
Con DfuSe, in genere uno sviluppatore utilizza solo le sezioni Upgrade o Verify Action. In questa area, può scegliere il suo file dell'applicazione DFU e quindi selezionare il pulsante di aggiornamento. DfuSe coordinerà automaticamente il processo di aggiornamento del firmware finché l'intero file non sarà stato caricato correttamente sull'MCU. Lo sviluppatore può quindi scegliere di verificare che l'immagine sia stata ricevuta correttamente. Dopo la verifica, i pin BOOT possono essere riportati alla loro configurazione predefinita, come ad esempio boot to flash, quindi viene selezionata la modalità "Leave DFU" per caricare ed eseguire il firmware aggiornato.
Utilizzo di DFU su dispositivi senza supporto DFU
Il fatto che un microcontroller non includa un bootloader DFU all'interno della ROM non significa che uno sviluppatore non possa ancora utilizzare le funzionalità DFU. DFU è una classe USB ed è supportata in molti stack USB. Ciò significa che è possibile aggiungere funzionalità DFU ai propri framework applicativi e, altrettanto facilmente, eseguire un aggiornamento DFU.
Ad esempio, AT32UC3A3 di Microchip Technology non ha una modalità DFU integrata (Figura 4). Lo sviluppatore può seguire una semplice nota applicativa che descrive come funziona DFU e come deve configurare il proprio microcontroller per supportare correttamente DFU.

Figura 4: La scheda di valutazione AT32UC3A3 UC3-A3 XPLD AVR®32 MCU 32 bit AVR embedded non include DFU on-chip ma può avere un codice USB di framework aggiunto che permette la funzionalità di aggiornamento del firmware DFU. (Immagine per gentile concessione di Microchip Technology)
Suggerimenti e consigli per eseguire gli aggiornamenti firmware
L'aggiornamento del firmware sul campo non deve necessariamente provenire solo da un microcontroller con capacità DFU. Uno sviluppatore può decidere che è necessario o più pratico un approccio alternativo per l'aggiornamento del firmware. In queste circostanze, ci sono diversi suggerimenti di cui uno sviluppatore dovrebbe tener conto per il suo processo di aggiornamento del firmware. Tra questi:
- Utilizzare una checksum o un hash per verificare l'applicazione che verrà scritta nella memoria del microcontroller.
- Selezionare un microcontroller con memoria sufficiente per conservare una copia di backup del firmware in modo che se qualcosa va storto, sia possibile ripristinare la versione precedente.
- Verificare che se il microcontroller dispone di un flashloader incorporato, l'utente finale non possa attivarlo accidentalmente.
- Assicurarsi che tutti i bootloader software siano stati compilati e ottimizzati per le dimensioni.
- Bloccare la periferica flash in modo che l'applicazione non possa essere letta dalla memoria e retroingegnerizzata.
- Accertarsi sempre che il puntatore dello stack, la tabella vettoriale e i registri del contatore del programma siano impostati sul valore appropriato dell'applicazione.
- Prendere in considerazione l'utilizzo di metodi di aggiornamento alternativi come gli aggiornamenti drag-n-drop tramite MSD USB come dimostrato nella Scheda KL46Z Freedom (Figura 5).

Figura 5: KL46Z Freedom di NXP Semiconductor è una scheda di sviluppo a basso costo che per impostazione predefinita non supporta DFU. Gli sviluppatori possono utilizzare metodi di aggiornamento alternativi come MSD USB in cui una nuova immagine del firmware viene trascinata e rilasciata nella memoria interna. (Immagine per gentile concessione di NXP Semiconductors)
Conclusione
Quasi ogni sistema embedded richiede un metodo per aggiornare il codice dell'applicazione sul campo evitando così richiami. La creazione di un bootloader da zero o la modifica di uno esistente può introdurre complessità e problemi di integrazione in un ciclo di sviluppo.
Invece, gli sviluppatori possono utilizzare le collaudate capacità DFU incorporate nello standard USB per eseguire in modo molto rapido ed efficiente gli aggiornamenti sul campo con poco o nessun sforzo. Affinché ciò avvenga senza problemi, devono esaminare attentamente i loro microcontroller e determinare se DFU è integrato o se è necessario includere uno stack software che consenta le funzionalità DFU.
Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.




