Cuprins:

Bare Metal Raspberry Pi 3: LED intermitent: 8 pași
Bare Metal Raspberry Pi 3: LED intermitent: 8 pași

Video: Bare Metal Raspberry Pi 3: LED intermitent: 8 pași

Video: Bare Metal Raspberry Pi 3: LED intermitent: 8 pași
Video: Mihai Scutaru - From bare-metal programming to Embedded Linux in IoT // Diamond Speaker Siemens 2024, Iulie
Anonim
Bare Metal Raspberry Pi 3: LED intermitent
Bare Metal Raspberry Pi 3: LED intermitent

De moldypizza Urmăriți mai multe de la autor:

Buton Raspberry Pi cu LED-uri Bare Metal
Buton Raspberry Pi cu LED-uri Bare Metal
Buton Raspberry Pi cu LED-uri Bare Metal
Buton Raspberry Pi cu LED-uri Bare Metal
Lăzi
Lăzi
Lăzi
Lăzi
Cum se face o sculptură în relief pentru Ziua Veteranilor
Cum se face o sculptură în relief pentru Ziua Veteranilor
Cum se face o sculptură în relief pentru Ziua Veteranilor
Cum se face o sculptură în relief pentru Ziua Veteranilor

Despre:.oO0Oo. Mai multe despre moldypizza »

Bine ați venit la tutorialul cu LED-uri intermitente BARE METAL pi 3!

În acest tutorial vom parcurge pașii, de la început până la sfârșit, pentru a obține un LED intermitent folosind un Raspberry PI 3, o placă de rezoluție, un rezistor, un led și un card SD gol.

Deci, ce este BARE METAL? BARE METAL nu este o programare simplă. Metalul gol înseamnă că controlăm pe deplin ce va face computerul până la bit. Deci, practic înseamnă că codul va fi complet scris în asamblare, folosind setul de instrucțiuni Arm. Până la sfârșit, vom fi creat un program care va clipi un LED accesând adresa fizică a unuia dintre pinii GPIO ai Raspberry Pi și configurându-l la ieșire și apoi activându-l și oprindu-l. Încercarea acestui proiect este o modalitate excelentă de a începe cu programarea încorporată și, sperăm, de a oferi o mai bună înțelegere a modului în care funcționează un computer.

De ce ai nevoie?

Hardware

  • Raspberry PI 3
  • Card SD preîncărcat cu o imagine bootabilă
  • Pană de pâine
  • Bărbați Femei jumper fire
  • Bărbați Bărbați jumper fire
  • LED
  • Rezistor de 220 ohmi (nu trebuie să fie exact 220 ohmi, majoritatea oricărui rezistor va funcționa)
  • mini card SD
  • card mini SD preîncărcat cu sistemul de operare raspberry pi (de obicei inclus cu pi)

Software

  • Compilator GCC
  • Lanț de instrumente încorporat GNU
  • editor de text
  • formatator card SD

În regulă, începeți!

Pasul 1: SETAREA LUCRURILOR / UTILIZĂRILOR

SETAREA LUCRURILOR / UTILIZĂRILOR
SETAREA LUCRURILOR / UTILIZĂRILOR

Bine, deci … primul pas este să achiziționați hardware. Puteți cumpăra piesele separat sau există un kit care vine cu piese mai mult decât suficiente. LEGĂTURĂ

Acest kit vine cu tot ce este necesar pentru configurarea raspberry pi 3 și mai mult! singurul lucru care nu este inclus în acest kit este un mini card SD suplimentar. Aștepta! Nu cumpărați încă unul încă. Dacă nu intenționați să utilizați instalarea Linux preîncărcată pe card, copiați conținutul cardului mini sd inclus pentru mai târziu și re-formatați cardul (mai multe despre asta mai târziu). NOTĂ IMPORTANTĂ: asigurați-vă că păstrați fișierele pe cardul inclus, veți avea nevoie de ele pentru mai târziu!

Apoi este timpul să configurați software-ul. Acest tutorial nu va include instrucțiuni detaliate despre cum să instalați software-ul. Există multe resurse și tutoriale online despre cum să le instalați:

UTILIZATORI WINDOWS:

Descărcați și instalați gcc

Apoi, descărcați și instalați lanțul de instrumente încorporat GNU ARM

LINUX / MAC

  • Distribuțiile Linux vin cu gcc preinstalat
  • Descărcați și instalați lanțul de instrumente încorporat GNU ARM.

Bine, dacă totul merge bine, atunci ar trebui să puteți deschide terminalul (linux / mac) sau linia cmd (windows) și să încercați să tastați

arm-none-eabi-gcc

Rezultatul ar trebui să arate similar cu prima imagine. Aceasta este doar pentru a verifica dacă este instalat corect.

Bine acum, că nu mai sunt necesare cerințele prealabile, este timpul să începeți cu lucrurile distractive.

Pasul 2: CIRCUIT

CIRCUIT
CIRCUIT
CIRCUIT
CIRCUIT
CIRCUIT
CIRCUIT

Timp de circuit! Circuitul pentru acest lucru este simplu. Vom conecta un led la GPIO 21 (pinul 40) pe pi (vezi imaginea 2 și 3). Un rezistor este, de asemenea, conectat în serie pentru a preveni deteriorarea ledului. Rezistorul va fi conectat la coloana negativă de pe panoul care va fi conectat la GND (pinul 39) de pe pi. Când conectați ledul, asigurați-vă că conectați capătul scurt la partea negativă. Vezi ultima poză

Pasul 3: BOOTABLE Mini SD

BOOTABLE Mini SD
BOOTABLE Mini SD
BOOTABLE Mini SD
BOOTABLE Mini SD
BOOTABLE Mini SD
BOOTABLE Mini SD

Există trei pași pentru a face ca Pi 3 să vă recunoască mini cardul SD gol. Trebuie să găsim și să copiem bootcode.bin, start.elf și fixup.dat. Puteți obține aceste fișiere pe mini cardul SD inclus dacă ați cumpărat canakit sau creați un card SD bootabil pentru pi 3 cu o distribuție Linux. Oricum, aceste fișiere sunt necesare pentru a permite PI să recunoască cardul SD ca dispozitiv de boot. Apoi, formatați mini SD în fat32 (majoritatea mini cardurilor SD sunt formatate în fat32. Am folosit o mini card SD ieftină de la sandisk), mutați bootcode.bin, start.elf, fixup.dat pe cardul SD. Și gata! Bine încă o dată și în ordinea imaginilor pașii sunt:

  1. Găsiți bootcode.bin, start.elf, fixup.dat.
  2. Asigurați-vă că cardul SD este formatat în fat32.
  3. Mutați bootcode.bin, start.elf și fixup.dat pe cardul SD formatat.

Iată cum mi-am dat seama, link.

Pasul 4: VERIFICĂ Mini SD

VERIFICĂ Mini SD
VERIFICĂ Mini SD
VERIFICĂ Mini SD
VERIFICĂ Mini SD

Bine, avem un mini card SD bootabil și, sperăm, aveți un pi 3 în acest moment. Deci, acum ar trebui să-l testăm pentru a ne asigura că pi 3 recunoaște cardul mini sd ca bootabil.

Pe pi, lângă portul mini USB există două leduri mici. Unul este roșu. Acesta este indicatorul de alimentare. Când pi primește energie, această lumină ar trebui să fie aprinsă. Deci, dacă vă conectați pi-ul chiar acum, fără card mini SD, acesta ar trebui să se aprindă în roșu. Bine, acum deconectați-vă de pe pi și puneți-vă mini-cardul SD de boot care a fost creat în pasul anterior și conectați pi-ul. Mai vedeți o lumină? Ar trebui să existe o lumină verde, chiar lângă cea roșie, care să indice că citește cardul SD. Acest led se numește ACT led. Se va aprinde atunci când este introdus un card SD viabil. Va clipi când accesează cartela mini sd.

Bine, așa că ar fi trebuit să se întâmple două lucruri după ce ați introdus mini cardul SD bootabil și ați conectat pi-ul:

  1. Ledul roșu ar trebui să fie aprins indicând recepția puterii
  2. Ledul verde ar trebui să fie aprins, indicând faptul că a pornit pe mini cardul SD

Dacă ceva nu a funcționat corect, încercați să repetați pașii anteriori sau faceți clic pe linkul de mai jos pentru mai multe informații.

Link aici este o referință bună.

Pasul 5: COD 1

Acest proiect este scris în limbajul de asamblare ARM. În acest tutorial se presupune o înțelegere de bază a asamblării ARM, dar iată câteva lucruri pe care ar trebui să le știți:

.equ: atribuie o valoare unui simbol adică abc.equ 5 abc reprezintă acum cinci

  • ldr: se încarcă din memorie
  • str: scrie în memorie
  • cmp: compară două valori prin efectuarea unei scăderi. Setează steaguri.
  • b: ramură la etichetă
  • add: efectuează aritmetica

Dacă nu aveți nicio experiență cu asamblarea brațelor, urmăriți acest videoclip. Vă va oferi o bună înțelegere a limbajului de asamblare al brațului.

Bine, așa că acum avem un circuit conectat la raspberry pi 3 și avem un card SD pe care pi îl recunoaște, așa că următoarea noastră sarcină este să aflăm cum să interacționăm cu circuitul încărcând pi cu un program executabil. În general, ceea ce trebuie să facem este să spunem lui pi să emită o tensiune de la GPIO 21 (pin conectat la firul roșu). Apoi, avem nevoie de o modalitate de a comuta ledul pentru a-l clipi. Pentru a face acest lucru avem nevoie de mai multe informații. În acest moment nu avem nicio idee cum să spunem GPIO 21 să producă, motiv pentru care trebuie să citim fișa tehnică. Majoritatea microcontrolerelor au fișe tehnice care specifică exact cum funcționează totul. Din păcate, pi 3 nu are documentație oficială! Cu toate acestea, există o fișă tehnică neoficială. Iată două linkuri către acesta:

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

Bine, în acest moment, ar trebui să luați câteva minute înainte de a trece la pasul următor pentru a căuta în foaia tehnică și a vedea ce informații puteți găsi.

Pasul 6: COD 2: Turn_Led_ON

COD 2: Turn_Led_ON
COD 2: Turn_Led_ON
COD 2: Turn_Led_ON
COD 2: Turn_Led_ON
COD 2: Turn_Led_ON
COD 2: Turn_Led_ON

Raspberry pi 3 53 se înregistrează pentru a controla pinii de ieșire / intrare (periferice). Pinii sunt grupați împreună și fiecare grup este atribuit unui registru. Pentru GPIO trebuie să putem accesa registrele SELECT, registrul SET și registrele CLEAR. Pentru a accesa aceste registre avem nevoie de adresa fizică a acestor registre. Când citiți fișa tehnică, doriți doar să notați compensarea adresei (lo octet) și să o adăugați la adresa de bază. Trebuie să faceți acest lucru, deoarece foaia tehnică listează adresa virtuală Linux, care sunt practic valori pe care sistemele de operare le atribuie. Nu folosim un sistem de operare, așa că trebuie să accesăm aceste registre direct folosind adresa fizică. Pentru aceasta aveți nevoie de următoarele informații:

  • Adresa de bază a perifericelor: 0x3f200000. PDF-ul (pagina6) spune că adresa de bază este 0x3f000000, însă această adresă nu va funcționa. Utilizați 0x3f200000
  • Decalajul FSEL2 (SELECT) nu adresa completă a registrului. PDF listează FSEL2 la 0x7E20008, dar această adresă se referă la adresa virtuală Linux. Decalajul va fi același, așa că dorim să observăm. 0x08
  • Offset GPSET0 (SET): 0x1c
  • Offset GPCLR0 (CLEAR): 0x28

Așa că probabil ați observat că fișa tehnică listează 4 registre SELECT, 2 registre SET și 2 registre CLEAR, de ce le-am ales pe cele pe care le-am făcut? Acest lucru se datorează faptului că dorim să utilizăm GPIO 21 și FSEL2 controlează GPIO 20-29, SET0 și CLR0 controlează GPIO 0-31. Registrele FSEL atribuie trei biți pentru fiecare pin GPIO. Deoarece folosim FSEL2, asta înseamnă că biții 0-2 controlează GPIO 20, iar biții 3-5 controlează GPIO 21 și așa mai departe. Registrele Set și CLR atribuie un singur bit fiecărui pin. De exemplu, bitul 0 din SET0 și CLR0 controlează GPIO 1. Pentru a controla GPIO 21, ați seta bitul 21 în SET0 și CLR0.

Bine, așa că am vorbit despre cum să accesați aceste registre, dar ce înseamnă totul?

  • Registrul FSEL2 va fi utilizat pentru a seta GPIO 21 la ieșire. Pentru a seta un pin la ieșire, trebuie să setați bitul de ordine lo al celor trei biți la 1. Deci, dacă biții 3-5 controlează GPIO 21 asta înseamnă că trebuie să setăm primul bit, bitul 3 la 1. Acest lucru va spune pi că vrem să folosim GPIO 21 ca ieșire. Deci, dacă ar fi să ne uităm la cei 3 biți pentru GPIO 21, ar trebui să arate așa după ce l-am setat la ieșire, b001.
  • GPSET0 îi spune lui pi să pornească pinul (ieșire o tensiune). Pentru a face acest lucru, trebuie doar să comutăm bitul care corespunde pinului GPIO dorit. În cazul nostru, bitul 21.
  • GPCLR0 îi spune lui pi să oprească pinul (fără tensiune). Pentru a opri pinul, setați bitul la pinul GPIO corespunzător. În cazul nostru bitul 21

Înainte de a ajunge la un led intermitent, mai întâi să facem un program simplu care va porni pur și simplu ledul.

Pentru a începe, trebuie să adăugăm două directive în partea de sus a codului sursă.

  • .secțiunea.init îi spune pi unde să pună codul
  • .global _start

Apoi, trebuie să dispunem toate adresele pe care le vom folosi. Utilizați.equ pentru a atribui simboluri lizibile valorilor.

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

Acum vom crea măști pentru a seta biții care trebuie să fie setați.

  • .equ SET_BIT3, 0x08 Acest lucru va seta bitul trei 0000_1000
  • .equ SET_BIT21, 0x200000

Apoi, trebuie să adăugăm eticheta noastră _start

_start:

Încărcați adresa de bază în registru

ldr r0, = BASE

Acum trebuie să setăm bit3 de GPFSEL2

  • ldr r1, SET_BIT3
  • str r1, [r0, # GPFSEL2] Această instrucțiune spune să scrieți înapoi bitul 0x08 la adresa GPFSEL2

În cele din urmă, trebuie să setăm GPIO 21 la pornit prin setarea bitului 21 în registrul GPSET0

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

Produsul final ar trebui să arate ceva asemănător codului din imagine.

Următorul pas este să compilați codul și să creați un fișier.img pe care pi îl poate rula.

  • Descărcați makefile atașat și kernel.ld și dacă doriți codul sursă turn_led_on.s.
  • Puneți toate fișierele în același folder.
  • Dacă utilizați propriul cod sursă, editați makefile și înlocuiți codul = turn_led_on.s cu codul =.s
  • Salvați makefile-ul.
  • Utilizați terminalul (linux) sau fereastra cmd (windows) pentru a naviga la folderul dvs. care conține fișierele și tastați make și apăsați Enter
  • Fișierul make ar trebui să genereze un fișier numit kernel.img
  • Copiați kernel.img pe cartela mini sd. Conținutul cardurilor dvs. ar trebui să fie așa cum este prezentat (imaginea 3): bootcode.bin, start.elf, fixup.dat și kernel.img.
  • Scoateți cardul mini sd și introduceți-l în pi
  • Conectați pi la sursa de alimentare
  • LED-ul ar trebui să se aprindă !!!

NOTĂ UȘOR IMPORTANTĂ: Aparent instructabile au avut o problemă cu makefile neavând o extensie, așa că l-am reîncărcat cu o extensie.txt. Vă rugăm să eliminați extensia atunci când o descărcați pentru a funcționa corect.

Recomandat: