Inhoudsopgave:

Bare Metal Raspberry Pi 3: Knipperende LED - Ajarnpa
Bare Metal Raspberry Pi 3: Knipperende LED - Ajarnpa

Video: Bare Metal Raspberry Pi 3: Knipperende LED - Ajarnpa

Video: Bare Metal Raspberry Pi 3: Knipperende LED - Ajarnpa
Video: Home Automation: 12V Relay with LED Display Delay 0.1 seconds to 999 seconds Timer module P1 to P4 2024, Juli-
Anonim
Bare Metal Raspberry Pi 3: Knipperende LED
Bare Metal Raspberry Pi 3: Knipperende LED

Door moldypizzaVolg meer van de auteur:

Raspberry Pi-drukknop met LED's blank metaal
Raspberry Pi-drukknop met LED's blank metaal
Raspberry Pi-drukknop met LED's blank metaal
Raspberry Pi-drukknop met LED's blank metaal
Kratten
Kratten
Kratten
Kratten
Hoe maak je een reliëfsnijwerk voor Veteranendag
Hoe maak je een reliëfsnijwerk voor Veteranendag
Hoe maak je een reliëfsnijwerk voor Veteranendag
Hoe maak je een reliëfsnijwerk voor Veteranendag

Over:.oO0Oo. Meer over Moldypizza »

Welkom bij de BARE METAL pi 3 Knipperende LED-tutorial!

In deze tutorial zullen we van begin tot eind de stappen doorlopen om een LED te laten knipperen met behulp van een Raspberry PI 3, een breadboard, een weerstand, een led en een lege SD-kaart.

Dus wat is KAAL METAAL? BARE METAL is programmeren zonder franje. Bare metal betekent dat we tot op het bot de controle hebben over wat de computer doet. Het betekent dus in feite dat de code volledig in assembly wordt geschreven, met behulp van de Arm-instructieset. Tegen het einde hebben we een programma gemaakt dat een LED laat knipperen door toegang te krijgen tot het fysieke adres van een van de GPIO-pinnen van de Raspberry Pi en dit te configureren om uit te voeren en het vervolgens in en uit te schakelen. Het proberen van dit project is een geweldige manier om aan de slag te gaan met embedded programmering en hopelijk een beter begrip te geven van hoe een computer werkt.

Wat heb je nodig?

Hardware

  • Framboos PI 3
  • SD-kaart vooraf geladen met een opstartbare afbeelding
  • Breadboard
  • Man Vrouw jumperdraden
  • Man Mannelijke jumperdraden
  • LED
  • 220 ohm weerstand (hoeft niet precies 220 ohm te zijn, bijna elke weerstand zal werken)
  • mini-sd-kaart
  • mini-sd-kaart vooraf geladen met raspberry pi-besturingssysteem (meestal meegeleverd met de pi)

Software

  • GCC-compiler
  • GNU embedded toolchain
  • tekstverwerker
  • sd-kaart formatter

Oké, laten we BEGINNEN!

Stap 1: DINGEN / DINGEN INSTELLEN

DINGEN/DINGEN INSTELLEN
DINGEN/DINGEN INSTELLEN

Oké, dus … de eerste stap is om hardware te verwerven. Je kunt de onderdelen apart kopen of er is een kit met meer dan genoeg onderdelen. KOPPELING

Deze kit wordt geleverd met alles wat nodig is om de Raspberry Pi 3 en meer in te stellen! het enige dat niet in deze kit zit, is een extra mini-sd-kaart. Wacht! Koop nog niet meteen een andere. Als je niet van plan bent de linux-installatie te gebruiken die vooraf op de kaart is geladen, kopieer dan gewoon de inhoud van de meegeleverde mini-sd-kaart voor later en formatteer de kaart opnieuw (daarover later meer). BELANGRIJKE OPMERKING: zorg ervoor dat u de bestanden op de meegeleverde kaart bewaart, u hebt ze nodig voor later!

Vervolgens is het tijd om de software in te stellen. Deze tutorial bevat geen gedetailleerde instructies voor het installeren van de software. Er zijn veel bronnen en zelfstudies online over hoe u deze kunt installeren:

WINDOWS-GEBRUIKERS:

Download en installeer gcc

Download en installeer vervolgens de GNU ARM embedded toolchain

LINUX/MAC

  • Linux-distributies worden geleverd met gcc vooraf geïnstalleerd
  • Download en installeer GNU ARM embedded toolchain.

Oké, dus als alles goed gaat, zou je de terminal (linux/mac) of cmd-regel (windows) moeten kunnen openen en proberen te typen

arm-geen-eabi-gcc

De uitvoer moet lijken op de eerste afbeelding. Dit is alleen om te controleren of het correct is geïnstalleerd.

Oké, nu de vereisten uit de weg zijn, is het tijd om aan de slag te gaan met de leuke dingen.

Stap 2: CIRCUIT

STROOMKRING
STROOMKRING
STROOMKRING
STROOMKRING
STROOMKRING
STROOMKRING

Circuit tijd! De schakeling hiervoor is eenvoudig. We zullen een led aansluiten op GPIO 21 (pin 40) op pi (zie foto 2 en 3). Er is ook een weerstand in serie geschakeld om te voorkomen dat de led beschadigd raakt. De weerstand wordt aangesloten op de negatieve kolom op het breadboard die wordt aangesloten op GND (pin 39) op de pi. Zorg er bij het aansluiten van de led voor dat het korte uiteinde op de negatieve kant wordt aangesloten. Zie de laatste foto

Stap 3: BOOTABLE Mini SD

OPSTARTBARE Mini SD
OPSTARTBARE Mini SD
OPSTARTBARE Mini SD
OPSTARTBARE Mini SD
OPSTARTBARE Mini SD
OPSTARTBARE Mini SD

Er zijn drie stappen om uw pi 3 uw lege mini-SD-kaart te laten herkennen. We moeten bootcode.bin, start.elf en fixup.dat zoeken en kopiëren. Je kunt deze bestanden op de meegeleverde mini-sd-kaart krijgen als je de canakit hebt gekocht of een opstartbare sd-kaart voor de pi 3 hebt gemaakt met een linux-distributie. Hoe dan ook, deze bestanden zijn nodig om de pi de SD-kaart te laten herkennen als een opstartbaar apparaat. Formatteer vervolgens de mini-sd naar fat32 (de meeste mini-sd-kaarten zijn geformatteerd in fat32. Ik gebruikte een goedkope mini-sd-kaart van sandisk), verplaats bootcode.bin, start.elf, fixup.dat naar de sd-kaart. En je bent klaar! Oké nog een keer en in de volgorde van de foto's zijn de stappen:

  1. Zoek bootcode.bin, start.elf, fixup.dat.
  2. Zorg ervoor dat uw SD-kaart is geformatteerd naar fat32.
  3. Verplaats bootcode.bin, start.elf en fixup.dat naar de geformatteerde SD-kaart.

Hier is hoe ik erachter kwam, link.

Stap 4: CONTROLEER Mini SD

CONTROLEER Mini SD
CONTROLEER Mini SD
CONTROLEER Mini SD
CONTROLEER Mini SD

Oké, we hebben een opstartbare mini-SD-kaart en hopelijk heb je op dit moment een pi 3. Dus nu moeten we het testen om er zeker van te zijn dat de pi 3 de mini-SD-kaart herkent als opstartbaar.

Op de pi, bij de mini usb-poort, zitten twee kleine led's. Een is rood. Dit is de stroomindicator. Als de pi stroom krijgt, moet dit lampje branden. Dus als u uw pi nu aansluit zonder mini-SD-kaart, moet deze rood oplichten. Oké, ontkoppel nu je pi en plaats je opstartbare mini-sd-kaart die in de vorige stap is gemaakt en sluit de pi aan. Zie je nog een lampje? Er zou een groen lampje moeten zijn, direct naast de rode, dat aangeeft dat de SD-kaart wordt gelezen. Deze led wordt de ACT-led genoemd. Het licht op wanneer er een levensvatbare SD-kaart is geplaatst. Het knippert wanneer het toegang heeft tot uw mini-SD-kaart.

Oké, dus er hadden twee dingen moeten gebeuren nadat je de opstartbare mini-SD-kaart had geplaatst en de pi had aangesloten:

  1. De rode led moet branden om de stroomontvangst aan te geven
  2. De groene led moet branden om aan te geven dat hij is opgestart op de mini-SD-kaart

Als er iets mis is gegaan, herhaal dan de vorige stappen of klik op de onderstaande link voor meer informatie.

Link hier is een goede referentie.

Stap 5: CODE1

Dit project is geschreven in ARM-assembleertaal. In deze zelfstudie wordt uitgegaan van een basiskennis van ARM-assemblage, maar hier zijn een paar dingen die u moet weten:

.equ: wijst een waarde toe aan een symbool, d.w.z. abc.equ 5 abc vertegenwoordigt nu vijf

  • ldr: laadt uit het geheugen
  • str: schrijft naar het geheugen
  • cmp: vergelijkt twee waarden door een aftrekking uit te voeren. Zet vlaggen.
  • b: vertakking naar label
  • toevoegen: voert rekenkunde uit

Als je geen ervaring hebt met armmontage, bekijk dan deze video. Het geeft je een goed begrip van de Arm-assembleertaal.

Oké, dus nu hebben we een circuit dat is verbonden met onze Raspberry pi 3 en we hebben een SD-kaart die de pi herkent, dus onze volgende taak is uitzoeken hoe we met het circuit kunnen communiceren door de pi te laden met een uitvoerbaar programma. Over het algemeen moeten we de pi vertellen om een spanning uit te voeren van GPIO 21 (pin aangesloten op de rode draad). Dan hebben we een manier nodig om de led te laten knipperen. Hiervoor hebben we meer informatie nodig. Op dit moment hebben we geen idee hoe we GPIO 21 moeten laten uitvoeren, daarom moeten we de datasheet lezen. De meeste microcontrollers hebben datasheets die precies aangeven hoe alles werkt. Helaas heeft de pi 3 geen officiële documentatie! Er is echter een onofficiële datasheet. Hier zijn twee links ernaar toe:

  1. github.com/raspberrypi/documentation/files…
  2. web.stanford.edu/class/cs140e/docs/BCM2837…

Oké, op dit punt zou je een paar minuten de tijd moeten nemen voordat je naar de volgende stap gaat om door de datasheet te kijken en te zien welke informatie je kunt vinden.

Stap 6: CODE2:Turn_Led_ON

CODE2:Turn_Led_ON
CODE2:Turn_Led_ON
CODE2:Turn_Led_ON
CODE2:Turn_Led_ON
CODE2:Turn_Led_ON
CODE2:Turn_Led_ON

De raspberry pi 3 53 registreert om de output/input-pinnen (randapparatuur) te besturen. De pinnen zijn gegroepeerd en elke groep is toegewezen aan een register. Voor GPIO moeten we toegang hebben tot het SELECT-register, SET-register en CLEAR-registers. Om toegang te krijgen tot deze registers hebben we de fysieke adressen van deze registers nodig. Wanneer u de datasheet leest, wilt u alleen de offset van het adres (lo byte) noteren en bij het basisadres optellen. Je moet dit doen omdat de datasheet het virtuele linux-adres vermeldt, wat in feite waarden zijn die de besturingssystemen toewijzen. We gebruiken geen besturingssysteem, dus we moeten deze registers rechtstreeks benaderen via het fysieke adres. Hiervoor heeft u de volgende gegevens nodig:

  • Basisadres van randapparatuur: 0x3f200000. De pdf (pagina 6) zegt dat het basisadres 0x3f000000 is, maar dit adres zal niet werken. Gebruik 0x3f200000
  • Offset van FSEL2(SELECT) niet het volledige adres van het register. De pdf vermeldt FSEL2 op 0x7E20008 maar dit adres verwijst naar het virtuele linux-adres. De offset zal hetzelfde zijn, dus dat is wat we willen opmerken. 0x08
  • Offset van GPSET0 (SET): 0x1c
  • Offset van GPCLR0 (CLEAR): 0x28

Dus je hebt waarschijnlijk gemerkt dat de datasheet 4 SELECT-registers, 2 SET-registers en 2 CLEAR-registers vermeldt, dus waarom heb ik degene gekozen die ik heb gekozen? Dit komt omdat we GPIO 21 en FSEL2-besturingen GPIO 20-29 willen gebruiken, SET0 en CLR0-besturingen GPIO 0-31. De FSEL-registers wijzen drie bits toe aan elke GPIO-pin. Aangezien we FSEL2 gebruiken, betekent dit dat bits 0-2 GPIO 20 besturen, en bits 3-5 GPIO 21 besturen, enzovoort. De Set- en CLR-registers wijzen een enkele bit toe aan elke pin. Bit 0 in SET0 en CLR0 besturen bijvoorbeeld GPIO 1. Om GPIO 21 te besturen, zou u bit 21 instellen in SET0 en CLR0.

Oké, we hebben het gehad over hoe toegang te krijgen tot deze registers, maar wat betekent dit allemaal?

  • Het FSEL2-register wordt gebruikt om GPIO 21 op uitvoer in te stellen. Om een pin als output in te stellen, moet je de lo-order-bit van de drie bits op 1 zetten. Dus als bits 3-5 GPIO 21 besturen, betekent dit dat we de eerste bit, bit 3 op 1 moeten zetten. Dit zal de pi vertellen dat we GPIO 21 als output willen gebruiken. Dus als we naar de 3 bits voor GPIO 21 zouden kijken, zouden ze er zo uit moeten zien nadat we het op output hebben gezet, b001.
  • GPSET0 vertelt de pi om de pin aan te zetten (voer een spanning uit). Om dit te doen, schakelen we gewoon het bit in dat overeenkomt met de GPIO-pin die we willen. In ons geval bit 21.
  • GPCLR0 vertelt de pi om de pin uit te schakelen (geen spanning). Om de pin uit te schakelen, stelt u de bit in op de corresponderende GPIO-pin. In ons geval bit 21

Voordat we bij een knipperende led komen, laten we eerst een eenvoudig programma maken dat de led eenvoudig aanzet.

Om te beginnen moeten we twee richtlijnen toevoegen aan de bovenkant van onze broncode.

  • .sectie.init vertelt de pi waar de code moet worden geplaatst
  • .global _start

Vervolgens moeten we alle adressen die we gaan gebruiken, opmaken. Gebruik.equ om leesbare symbolen toe te wijzen aan de waarden.

  • .equ GPFSEL2, 0x08
  • .equ GPSET0, 0x1c
  • .equ GPCLR0, 0x28
  • .equ BASE, 0x3f200000

Nu gaan we maskers maken om de bits in te stellen die we moeten instellen.

  • .equ SET_BIT3, 0x08 Dit zal bit drie instellen 0000_1000
  • .equ SET_BIT21, 0x200000

Dan moeten we ons _start label toevoegen

_begin:

Laad het basisadres in het register

ldr r0, =BASIS

Nu moeten we bit3 van GPFSEL2 instellen

  • ldr r1, SET_BIT3
  • str r1, [r0, #GPFSEL2] Deze instructie zegt om de bit 0x08 terug te schrijven naar het adres van GPFSEL2

Ten slotte moeten we GPIO 21 inschakelen door bit 21 in het GPSET0-register in te stellen

  • ldr r1, =SET_BIT21
  • str r1, [r0, #GPSET0]

Het eindproduct moet er ongeveer zo uitzien als de afgebeelde code.

De volgende stap is om de code te compileren en een.img-bestand te maken dat de pi kan uitvoeren.

  • Download de bijgevoegde makefile, en kernel.ld en als je de broncode van turn_led_on.s wilt.
  • Zet alle bestanden in dezelfde map.
  • Als je je eigen broncode gebruikt, bewerk dan de makefile en vervang de code = turn_led_on.s door code =.s
  • Sla het make-bestand op.
  • Gebruik de terminal (linux) of cmd-venster (windows) om naar uw map met de bestanden te navigeren en typ make en druk op enter
  • Het make-bestand zou een bestand met de naam kernel.img. moeten genereren
  • Kopieer kernel.img naar je mini-sd-kaart. De inhoud van je kaarten moet zijn zoals afgebeeld (foto 3):bootcode.bin, start.elf, fixup.dat en kernel.img.
  • Werp de mini-SD-kaart uit en plaats deze in de pi
  • Sluit pi aan op stroombron
  • LED moet oplichten!!!

LICHT BELANGRIJKE OPMERKING: Blijkbaar hadden instructables een probleem met de makefile zonder extensie, dus ik heb hem opnieuw geüpload met een.txt-extensie. Verwijder de extensie wanneer u deze downloadt, zodat deze correct werkt.

Aanbevolen: