Jonas Nygård Skalman

Vecka 8: Uppdatering av Projektet

Hejsan!

I denna veckas blogg så kommer en lite mer detaljerad beskrivning av hur utvecklingen av kod till mikrokontrollern kan gå tillväga. Vi kommer att gå igenom ett enklare exempel med hur vi kan stänga av och på en utgång på utvecklingskortet och därmed tända och släcka en LED lampa som sitter där. Vi kommer först att visa hur det går till om man går den längre (och jobbigare) vägen med att direkt använda sig av mikrokontrollerns register samt sedan hur man kan göra det enklare för sig genom att istället använda sig av ett färdigt API, i detta fall STMs egna Hardware abstraction layer(HAL).

Först dock, en lite kortare uppdatering angående projektet överlag. Nytt denna vecka är att efter förra veckans projektmöte har vi kommit fram till att vi kommer att ta bort den analoga temperatur givaren från projektet. Istället så kommer vi att fokusera mer på strömförsörjningen till projektet. Planen är som sagt att driva hela badsensorn utan några batterier.

Som energiförsörjning står en solpanel som i sin tur kommer att ladda upp två stycken superkondensatorer, vilka då kommer att fungera som energilagringsenhet över natten samt vid dåligt väder. Ett första kretsschema för intresserade över hur en sådan lösning kan se ut, kan ses i bilden nedan.

caption id=”attachment_84″ align=”alignnone” width=”1762″Öppna bilden i en ny flik om den syns dåligt Strömförsörjning/caption

*Notis: Om bilderna syns dåligt, prova öppna de i en ny flik för högre kvalitet.

En mer detaljerad beskrivning av just denna analoga del kommer vid ett senare tillfälle, då vi väntar på en andra beställning och ändringar kan komma att göras. Fokus på detta blogginlägg ligger istället på att visa hur mjukvara utveckling till inbyggda system (speciellt en mikrokontroller) kan gå till och vilka hjälpmedel man kan ta till för att snabba på en sådan utveckling idag.

 

 

Mjukvaruutveckling

Då ingen av oss tidigare har använt någon av de flertalet STM32 mikrokontrollers som finns på marknaden samt att den gemensamma erfarenheten av utveckling av mjukvara till mikrokontrollers är väldigt begränsad så tar det av naturliga orsaker lite längre tid för oss. Med det sagt så tänkte vi visa hur det kan gå till att skriva lite kod till en STM32.

Som exempel kommer vi att ta det utvecklingskort och mikrokontroller som vi använder oss av i detta projekt, nämligen STM32L072CYZ på utvecklingskortet B-L072Z-LRWAN1. I exemplet så vill vi tända en av de flera LEDs som finns på utvecklingskortet, nämligen mer specifikt den gröna LED lampan.

 

Först så behöver vi hitta till vilken utgång på mikrokontrollern som LEDen är kopplad till. För detta så kan vi gå till manualen och där kan vi hitta kortets kretsschema. På sidan 33 kan vi hitta de LEDs vi söker.

Om vi zoomar in här kan vi se hur de olika LED lamporna är kopplade.

Här kan vi då se att den gröna LEDen är kopplad till PB5. Vilket betyder Pin 5, GPIO port B. Där GPIO står för General purpose inpout output.

Utan API

Med namnen på utgångarna i minnet är då nästa steg att söka reda på mikrokontrollerns datablad, där all information som man kan tänkas behöva för att programmera mikrokontrollern finns. Dessa datablad tenderar dock att vara väldigt stora (denna är på 1001 sidor), så det är inte ofta man läser de pärm till pärm utan de är mer tänka som uppslagsverk.

Hur man ska hitta vad man söker efter här är inte alltid så enkelt, men i detta fall så kan vi börja söka efter GPIO i innehållsförteckningen. På sidan 8 hittar vi något intressant som heter GPIO clock enable register (RCC_IOPENR). Om vi går till denna sektion så kan vi se vilka bitar i detta register vi behöver ändra för att aktivera GPIO port B där våran LED sitter. Dessa register är specifierade med en adress, oftast en offset. För att få reda på bas adressen så behöver vi söka reda på memory map i manualen. Dock så är detta inte nödvändigt i detta fall, utan om dessa namn och adresser är oftast inkluderade med utvecklingsverktyg som man använder. I detta fall använder jag mig av Atollics trueStudio, vilket är gratis att använda med alla STM32 mikrokontrollers. När man skapar ett projekt där så väljer man mikrokontroller och programmet inkluderar automatiskt filer med namn som stm32L0xx.h. I dessa filer har tillverkaren redan mappat registernamn med själva adresserna i databladet, även kallat cmsis fil.

Om vi i databladet går vidare till sektionen om GPIO så kan vi se att den innehåller många olika register. För att kunna tända den gröna LED lampan så behöver vi först aktivera vissa delar av hårdvaran.

  • Aktivera register GPIOX_MODER för port B. Detta register anger vilken typ GPIO kommer att anta.

  • Aktivera register GPIOX_OTYPER specificerar om utgången skall vara push pull eller open drain.

 

  • Aktivera register GPIOX_OSPEEDR, vilket specificerar vilken hastighet utgången skall ha, i detta fall spelar det inte så stor roll för oss så vi kan ta vilket värde vi vill hit så länge.

 

  • Aktivera register GPIOX_PUPDR, detta register specifierar om utgången skall vara pull up eller pull down.

Efter att dessa register satts korrekt så kan man skriva till utgångs pinne nr 5 i port B med hjälp av register

  • GPIOX_BSRR, vilket står för bit set reset register, hit kan vi skriva om vi vill tända LEDen.
  • GPIOX_BRR, bit reset register är det register vi skriver till om vi vill släcka LEDen.

När vi nu hittat vilka register vi skall skriva till så kan vi implementera allt detta i C-kod. Det kan då se ut på följande sätt.

Här har jag medvetet skrivit till de olika registrerarna på flera olika sätt. Både med hjälp av bit shifts, fördefinierade värden från cmsis header filen eller som ett direkt hex-värde. Vilket visar på att man kan skriva på många olika sätt för att ändå få samma resultat.

Efter allt detta så kan vi nu äntligen tända vår gröna LED lampa.

 

Nu inser man att detta är ganska mycket jobb för att endast göra en enkel sak som att tända en enda LED. Då tid är dyrbart så vill man kunna optimera utvecklingen och då kommer användandet av så kallade APIer in (Application programming interface). Dessa innehåller färdigskrivna funktioner som gör att själva arbetet kan snabbas på väsentligt.

Med API

Genom att använda STMs HAL bibliotek så kan vi tända samma gröna LED med följande kod.

Som vi kan se behöver vi endast initiera HAL biblioteket med HAL_Init och sedan kalla funktionen HAL_GPIO_TogglePin med parametrarna för vilken port samt pin vi vill aktivera. Vi behöver inte ens titta i databladet här utan kan direkt slå av och på den gröna LED lampan. För att komma åt HAL biblioteket samt kodexempel för just LORAWAN så har ST förberett ett litet tillägg för de mest populära utvecklingsmiljöerna (Keil, IAR, TrueStudio). Man kan ladda ner dessa exempel här.

På återseende nästa vecka!

/Med vänlig hälsning Jonas, Viktor, Kastriot