Uppdatera fasta programvara på fältet med DFU-läget på en mikrostyrenhet
Bidraget med av DigiKeys nordamerikanska redaktörer
2018-01-24
Nästan alla inbäddade system behöver kunna få den fasta programvaran uppdaterad på fältet för att lägga till nya funktioner eller åtgärda problem. Dock kan fältuppdateringar av fast programvara vara utmanande eftersom utvecklaren antingen måste programmera en egen starthanteringslösning eller införskaffa en starthanteringslösning från en tredjepartsleverantör.
Det finns ett lättare sätt. Den här artikeln visar hur du använder DFU-funktionen (enhetsuppdateringar av fast programvara) som är inbyggd i många mikrostyrenheter, men ofta glöms bort.
Uppdateringsalternativ för fast programvara
Att utveckla en starthanteringslösning är ingen liten sak. Utvecklarna måste reda ut flashutrymmet så att flera applikationer kan samverka. Därefter måste de hitta ett sätt att överföra sin kompilerade binärkod till mikrostyrenheten utan att använda ett programmeringsverktyg. Detta kräver att de antingen utvecklar sina kommunikationsprotokoll eller ökar systemkomplexiteten genom att lägga till externt minne för att lagra nya bilder. De kan även öka mängden internt minne som de har på mikrostyrenheten.
Dessutom kan programvaran i sig bli komplex eftersom starthanteringslösningen måste ställa in systemstatusen och avgöra om det är säkert att hoppa till programkoden eller inte.
Att använda en anpassad starthanteringslösningen kan ge utvecklarna mycket användbar flexibilitet för tillämpningarna, men det finns en uppdateringsstandard för fast programvara som kan fungera i många tillämpningar som inte kräver något arbete av utvecklaren: USB-standardens inbyggda DFU-klass (enhetsuppdateringar av fast programvara). Detta kan användas för att uppdatera en mikrostyrenhets programkod på fältet via USB-porten, vilket dramatiskt kan förenkla uppdateringsprocessen och utvecklingscykeln för den fasta programvaran.
DFU har blivit så utbrett att vissa mikrostyrenhetstillverkare som STMicroelectronics till och med inkluderar den programvara som krävs för att utföra de uppdateringar som hårdkodats i deras ROM. De som inte gör det tillhandahåller oftast exempelkod för hur du stöttar DFU.
Välja en DFU-kapabel mikrostyrenhet
Det enklaste sättet att stötta DFU är att välja en mikrostyrenhet som redan har DFU inkluderat i sitt ROM, som STMicroelectronics STM32-mikrostyrenheter. Av dessa är de enheter som skulle vara mest intressanta för en utvecklare att experimentera med de som finns i STM32 IoT Discovery Node och STM32F429 Discovery Kit.

Figur 1: STMicroelectronics STM32 IoT Discovery Node baseras på en ARM® Cortex®-M4-kärna som kör en STM32L475 MCU som inkluderar DFU-lägeskapacitet för uppdateringar av fast programvara. Den här enheten är utformad för att användas som en IoT-nod. (Bildkälla: STMicroelectronics)
STM32 IoT Discovery Node är ett billigt utvecklingskort som utformats för en IoT-sensornod. Kortet inkluderar flera olika gränssnitt för anslutning av kortet som Wi-Fi och Bluetooth. Det intressanta är att det inbyggda STM32L475 ger utvecklarna möjligheten att testa och använda DFU-funktioner på en enhet som är utformad för att ansluta till internet.
För utvecklare som bara vill testa DFU på en normal enhet som ska vara fristående är STM32F429 Discovery Kit en välkänd och billig utvecklingssats för STM32F4-seriens mikrostyrenheter. Nu går vi över till hur en utvecklare kan testa DFU på dessa mikrostyrenheter.

Figur 2: STMicroelectronics STM32F429 Discovery Kit baseras på en ARM® Cortex®-M4-kärna. Det här billiga utvecklingskortets MCU inkluderar även DFU-lägeskapacitet för programvaruuppdateringar. (Bildkälla: STMicroelectronics)
Ett enkelt DFU-exempel
Hur du kommer åt DFU är olika på varje mikrostyrenhet. Som ett enkelt exempel kan vi titta på hur en utvecklare kan uppdatera den fasta programvaran på en enhet som kör en STM32L475 MCU.
Som nämnts tidigare inkluderar STM32-mikrostyrenheter en DFU-starthanteringslösning som är inbyggd i ROM. För att komma åt starthanteringslösningen måste en utvecklare dra ett av BOOT-stiften till jord när MCU startar. BOOT-stiften styr läget som MCU startar i, som att starta från flash, RAM, eller i vårt fall, DFU USB-läge.
Att förbereda ett program för att hämtas med DFU kräver inget ytterligare arbete från utvecklaren. GNU-kompilatorsamlingen (GCC), tillsammans med många andra verktygskedjor, stöder generering av en DFU-fil när ett program kompileras. Det enda problemet här för utvecklaren är att avgöra var filen är lagrad: precis som för alla typiska program hittar du felsöknings- eller objektmappen där .dfu-filen finns.
DFU-filen är mycket lika andra programregisterformat som binär, s-record- och hexfiler. Filformatet innehåller adress- och datainformation som förmedlas via USB, behandlas och sedan skrivs till platsen som anges i flash. Processen är så pass smidig att utvecklare sällan ens behöver undersöka vilket protokoll som används. Detta abstraheras i bakgrunden, vilket gör uppdateringsprocessen för den fasta programvaran och utvecklingsarbetet mindre komplext.
Det finns flera olika verktyg som en utvecklare kan använda för att överföra sitt program till mikrostyrenheten med DFU. Ett allmänt kommandoradsverktyg som kan användas är dfu-util. Det är tillgängligt i både Linux och Windows® som ett programvarupaket med öppen källkod. Om utvecklare arbetar med STM-verktygskedjan kan de utnyttja STMicroelectronics-programmet DfuSe (figur 3).

Figur 3: STMicroelectronics DfuSe-verktyget kan användas för att programmera en DFU-fil som genereras av en kompilator som GCC och läsas in av en DFU-kompatibel mikrostyrenhet. (Bildkälla: Beningo Embedded Group)
DfuSe är ett Windows GUI-verktyg som registrerar STM32-enheter som har startats i DFU-läge och anslutits via USB till datorn. Utvecklare kan hämta information som programmerade återförsäljar- och produkt-ID. Om flash-utrymmet inte har säkrats korrekt kan de till och med kopiera MCU:ns minnesinnehåll och lagra det på datorn med uppladdningsåtgärdsrutan.
När DfuSe används använder utvecklaren normalt bara avsnitten Uppgradera eller Verifiera åtgärd. I det här området kan en utvecklare välja en DFU-tillämpningsfil och sedan trycka på uppgraderingsknappen. DfuSe koordinerar sedan automatiskt uppdateringsprocessen för den fasta programvaran tills hela filen har lästs in i MCU:n. En utvecklare kan därefter välja att verifiera att bilden har tagits emot. Efter verifiering kan BOOT-stiften ställas tillbaka till standardkonfigurationen, som starta till flash, och därefter väljs läget Lämna DFU för att läsa in och köra den uppdaterade fasta programvaran.
Använda DFU på enheter utan DFU-stöd
Bara för att en mikrostyrenhet inte innehåller en DFU-starthanteringslösning i ROM innebär det inte att utvecklaren inte kan utnyttja DFU-funktionerna. DFU är en USB-klass och stöds i många USB-stackar. Det innebär att en utvecklare lika enkelt kan lägga till DFU-funktion i sina programramverk och fortfarande utföra en DFU-uppdatering.
Till exempel har Microchip Technologys AT32UC3A3 inte ett inbyggt DFU-läge (figur 4). En utvecklare kan följa en enkelt programanteckning som beskriver hur DFU fungerar samt hur utvecklaren ska konfigurera sin mikrostyrenhet för att ge DFU ordentligt stöd.

Figur 4: AT32UC3A3 UC3-A3 XPLD AVR®32 MCU 32-bitars AVR inbäddat utvecklingskort innefattar inte DFU på kretsen, men kan ha en tillagd ramverks-USB-kod tillagd som möjliggör DFU-uppdateringsfunktionen för fast programvara. (Bildkälla: Microchip Technology)
Tips och trick för att utföra uppdateringar av fast programvara
Att uppdatera fast programvara på fältet måste inte nödvändigtvis endast komma från en DFU-kapabel mikrostyrenhet. En utvecklare kan besluta att en alternativ metod till att uppdatera den fasta programvaran krävs eller är mer praktisk. Under dessa omständigheter finns flera tips som en utvecklare har nytta av när det gäller uppdateringsprocessen för den fasta programvaran. Dessa är:
- Använda en kontrollsumma eller hash för att verifiera programmet som ska skrivas till mikrostyrenhetens minne.
- Välja en mikrostyrenhet med tillräckligt mycket minne för att lagra en säkerhetskopia av den fasta programvaran så att den fasta programvaruversionen kan återställas om något blir fel.
- Om mikrostyrenheten har en inbyggd flashloader, kontrollera att slutanvändaren inte kan aktivera den av misstag.
- Se till att eventuella starthanteringslösningar för programvara har kompilerats och storleksoptimerats.
- Lås flashkringutrustningen så att programmet inte kan läsas från minnet och bakåtkompileras.
- Se alltid till att stackpekar-, vektortabell- och programräknarregistren ställs in på rätt programvärde.
- Överväg att använda alternativa uppdateringsmetoder som dra och släpp-uppdateringar med USB MSD som visas på KL46Z Freedom Board (figur 5).

Figur 5: NXP Semiconductors KL46Z Freedom Board är ett billigt utvecklingskort som inte har stöd för DFU som standard. Utvecklare kan använda alternativa uppdateringsmetoder som USB MSD där en ny avbildning av den fasta programvaran dras och släpps i det interna minnet. (Bildkälla: NXP Semiconductor)
Slutsatser
Nästan alla inbäddade system kräver en metod för att uppdatera programkoden på fältet för att undvika återkallningar. Att skapa en starthanteringslösning eller att modifiera en befintlig lösning kan innebära komplexitets- och integreringsproblem ii en utvecklingscykel.
Istället kan utvecklarna använda den beprövade DFU-funktionen som är inbyggd i USB-standarden för att snabbt och effektivt utföra fältuppgraderingar med en mycket liten arbetsinsats. För att detta ska gå smidigt måste utvecklarna noggrant gå igenom sina mikrostyrenheter och avgöra om DFU är inbyggt i dem eller om de behöver inkludera en programstack som aktiverar DFU-funktioner.
Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.




