步驟1:設置/填充文件
好吧。..第一步是獲取硬件。您可以單獨購買零件,也可以使用工具包附帶足夠的零件。 LINK
此工具包隨附了設置raspberry pi 3以及更多內容所需的一切!該套件中唯一沒有包括的是一張額外的迷你SD卡。等待!暫時不要再購買。如果您不打算使用卡上預裝的linux安裝程序,則只需復制隨附的mini sd卡的內容以備后用,然后重新格式化該卡即可(稍后再介紹)。重要提示:請確保將文件保存在隨附的卡上,以備日后使用!
接下來是時候安裝軟件了。本教程將不包括有關如何安裝軟件的詳細說明。在線上有許多資源和教程,它們是如何安裝這些軟件的:
WINDOWS用戶:
下載并安裝gcc。
LINUX/MAC
Linux發行版預裝了gcc
下載并安裝GNU ARM嵌入式工具鏈。
好的,如果一切順利,那么您應該可以打開終端機(linux/mac)或cmd行(windows),然后嘗試輸入
arm-none -eabi-gcc
輸出應類似于第一張圖片。這只是為了驗證它是否已正確安裝。
現在,前提條件已不復存在,現在該開始學習有趣的東西了。
步驟2:電路
電路時間!電路很簡單。我們將在pi上連接一個led到GPIO 21(引腳40)(見圖2和3)。電阻也串聯連接,以防止損壞LED。電阻將連接到面包板上的負極,負極將連接到pi上的GND(引腳39)。連接LED時,請確保將短端連接到負極??吹阶詈笠粡垐D片
步驟3:BOOTABLE Mini SD
有三個步驟可讓您的pi 3識別空白的迷你SD卡。我們需要找到并復制bootcode.bin,start.elf和fixup.dat。如果您購買了canakit或為linux發行的pi 3制作了可啟動的sd卡,則可以在隨附的mini sd卡上獲得這些文件。無論哪種方式,這些文件都是必需的,以允許pi將sd卡識別為可引導設備。接下來,將mini sd格式化為fat32(大多數mini sd卡都格式化為fat32。我從sandisk使用了便宜的mini sd卡),將bootcode.bin,start.elf,fixup.dat移到sd卡上。完成了!好了一次,按照圖片的順序,步驟是:
找到bootcode.bin,start.elf,fixup.dat。
確保您的SD卡格式化為fat32。
將bootcode.bin,start.elf和fixup.dat移至格式化的sd卡上。
這是我如何解決這個問題,請鏈接。
第4步:檢查Mini SD
好的,我們有一個可引導的迷你SD卡,希望您此時有一個pi 3。因此,現在我們應該對其進行測試,以確保pi 3能夠識別出迷你sd卡是可啟動的。
在pi上,靠近迷你USB端口的地方有兩個小led。一個是紅色的。這是電源指示燈。當pi接通電源時,該指示燈應亮起。因此,如果您現在沒有任何迷你sd卡插入pi,它就會亮起紅色。好的,現在拔下pi的插頭,然后插入上一步中創建的可啟動迷你sd卡,然后將pi插入。您是否看到另一盞燈?在紅色旁邊,應該有一個綠色指示燈,指示它正在讀取SD卡。該指示燈稱為ACT指示燈。插入可行的sd卡時,它會亮起。訪問迷你SD卡時,它將閃爍。
好吧,因此,在插入可引導的迷你sd卡并將pi插入后,應該發生了兩件事:
紅色指示燈應亮起,指示受電
》
綠色指示燈應亮起,表明它已插入迷你SD卡中。
如果出現問題,請嘗試重復上述步驟或單擊下面的鏈接以獲取更多信息。
鏈接是一個很好的參考。
步驟5:CODE1
該項目是用ARM匯編語言編寫的。本教程假定您對ARM匯編有基本的了解,但是您應該了解以下幾點:
.equ:為符號分配一個值,即abc .equ 5 abc現在代表五
ldr:從內存中加載
str:寫入內存
cmp:通過執行減法比較兩個值。設置標志。
b:分支到標簽
添加:執行算術
如果您對Arm組裝沒有任何經驗,請觀看此文章視頻。它將使您對Arm匯編語言有很好的了解。
好吧,現在我們有一個連接到樹莓派3的電路,并且有一個pi可以識別的sd卡,所以我們的下一個任務是弄清楚如何通過加載樹莓派來與電路交互帶有可執行程序的pi。通常,我們需要做的是告訴pi從GPIO 21(連接到紅線的引腳)輸出電壓。然后,我們需要一種方法來切換led使其閃爍。為此,我們需要更多信息。到目前為止,我們還不知道如何告訴GPIO 21輸出,這就是為什么我們必須閱讀數據手冊的原因。大多數微控制器都有數據表,這些數據表準確指定了所有工作方式。不幸的是,pi 3沒有官方文檔!但是,有一個非正式的數據表。這是指向它的兩個鏈接:
https://github.com/raspberrypi/documentation/files 。..
https://web.stanford.edu/class/cs140e/docs/BCM2837 。..
在這一點上,您應該花幾分鐘的時間才能進入下一步瀏覽數據表,看看您能找到什么信息。
步驟6:CODE2:Turn_Led_ON
raspberry pi 3 53寄存器用于控制輸出/輸入引腳(外圍設備)。引腳分組在一起,每組分配給一個寄存器。對于GPIO,我們需要能夠訪問SELECT寄存器,SET寄存器和CLEAR寄存器。要訪問這些寄存器,我們需要這些寄存器的物理地址。在閱讀數據手冊時,您只需要記下地址的偏移量(低字節)并將其添加到基址即可。您必須執行此操作,因為數據表列出了Linux虛擬地址,這些地址基本上是操作系統分配的值。我們沒有使用操作系統,因此我們需要使用物理地址直接訪問這些寄存器。為此,您需要以下信息:
外圍設備的基地址:0x3f200000。 pdf(第6頁)表示基本地址為0x3f000000,但是該地址不起作用。使用0x3f200000
FSEL2(SELECT)的偏移量而不是寄存器的完整地址。 pdf在0x7E20008處列出了FSEL2,但該地址是linux虛擬地址。偏移量將相同,因此我們要注意。 0x08
GPSET0(SET)的偏移量: 0x1c
O GPCLR0(CLEAR)的偏移量:0x28
因此,您可能會注意到數據表中列出了4個SELECT寄存器,2個SET寄存器和2個CLEAR寄存器,那么為什么選擇我所做的那些呢?這是因為我們要使用GPIO 21,而FSEL2控制GPIO 20-29,SET0和CLR0控制GPIO 0-31。 FSEL寄存器為每個GPIO引腳分配了三個位。由于我們使用的是FSEL2,這意味著位0-2控制GPIO 20,位3-5控制GPIO 21,依此類推。 Set和CLR寄存器為每個引腳分配一個位。例如,SET0和CLR0中的位0控制GPIO1。要控制GPIO 21,您需要在SET0和CLR0中設置位21。
好的,所以我們已經討論了如何訪問這些寄存器,但是該怎么做呢?
FSEL2寄存器將用于將GPIO 21設置為輸出。要設置引腳輸出,您需要將三個位的lo順序位設置為1。因此,如果位3-5控制GPIO 21,則意味著我們需要將第一個位(位3)設置為1。這將告訴pi我們想要使用GPIO 21作為輸出。因此,如果要查看GPIO 21的3位,將其設置為b001后,它們應該看起來像這樣。
GPSET0告訴pi開啟引腳(輸出電壓)。為此,我們只需切換與所需GPIO引腳對應的位即可。在我們的情況下,位21。
GPCLR0告訴pi關閉該引腳(無電壓)。要關閉該引腳,請將此位設置為相應的GPIO引腳。在我們的示例中,第21位
在出現閃爍的led之前,首先讓我們編寫一個簡單的程序,該程序只需打開led。
首先,我們需要在源代碼的頂部添加兩個指令。
.section .init告訴pi將代碼放置在哪里
.global _start
接下來,我們需要布置將要使用的所有地址。使用.equ為值分配可讀符號。
.equ GPFSEL2,0x08
.equ GPSET0,0x1c
.equ GPCLR0,0x28
.equ BASE,0x3f200000
現在,我們將創建掩碼以設置需要設置的位。
.equ SET_BIT3,0x08這將設置第三個位0000_1000
.equ SET_BIT21,0x200000
然后我們需要添加_start標簽
_start:
將基地址加載到寄存器
ldr r0,= BASE
現在我們需要設置GPFSEL2的bit3
ldr r1,SET_BIT3
str r1,[r0,#GPFSEL2]該指令表示將位0x08寫回GPFSEL2
最后,我們需要通過將GPSET0寄存器中的位21置1來設置GPIO 21
ldr r1,= SET_BIT21
str r1,[r0,#GPSET0]
最終產品應類似于所示的代碼。
下一步是編譯代碼并創建一個.img pi可以運行的文件。
下載附件makefile,kernel.ld,以及是否需要turn_led_on.s源代碼。
將所有文件放在同一文件夾中。
如果使用自己的源代碼,請編輯makefile并將代碼= turn_led_on.s替換為code = .s
保存makefile。
使用終端(linux)或cmd窗口(windows)導航至包含以下內容的文件夾文件,然后鍵入make并按Enter鍵。
make文件應生成一個名為kernel.img的文件。
將kernel.img復制到您的迷你SD卡中。卡的內容應如圖所示(圖3):bootcode.bin,start.elf,fixup.dat和kernel.img。
彈出迷你sd卡并將其插入pi
將pi插入電源中
LED應該亮起?。?/p>
重要提示:顯然可指導人員遇到了問題makefile沒有擴展名,因此我將其擴展名為.txt。
第7步:CODE3:BLINKY_LED
最后,是時候讓LED閃爍了!
與之前的步驟相比,這相對簡單。我們需要做的就是編寫一個無限循環,在該循環內打開LED,然后打開DELAY,然后關閉LED延遲并循環。
打開turn_led_on.s,然后將其另存為blinky_led .s
在.equ部分中添加.equ COUNTER,0xf0000。
在循環之前的下一個地方添加ldr r2,= COUNTER
在文件末尾添加新標簽Inifinite_loop:
在下一行添加b Inifinite_loop。這意味著代碼將無限期地跳轉回Inifinite_loop標簽。
在循環中打開led:str r1,[r0,#GPSET0],然后將0放入r10:mov r10,#0
添加標簽延遲:
在下一行上添加:添加r10,r10,#1,這將使r10在下一行上增加1
在下一行上添加:cmp r10 ,r2這會將r10與COUNTER的值進行比較
延遲,這意味著程序將陷入循環,直到r10遞增到COUNTER為止,這將延遲程序。
現在我們需要關閉LED:str r1,[r0,#GPCLR0]這會將CLEAR寄存器中的位21置1。關閉LED。
接下來從上方復制延遲循環,并將delay更改為delay2
打開makefile并將第4行的turn_on_led.s更改為blinky_led.s或您的文件名選擇。
執行與上一步相同的操作。
用新的kernel.img
將SD卡插入pi并替換新卡上的kernel.img。通電!
LED應該以大約每秒閃爍1次的速度閃爍!
略有重要的注意事項:顯然,指示人員有問題makefile沒有擴展名,因此我將其擴展名為.txt。下載擴展程序后,請刪除該擴展程序,以使其正常運行。
步驟8:完成
就是這樣。希望您現在指示燈閃爍!
責任編輯:wv
-
led
+關注
關注
242文章
23362瀏覽量
663220 -
樹莓派
+關注
關注
117文章
1710瀏覽量
105880
發布評論請先 登錄
相關推薦
評論