步骤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时,请确保将短端连接到负极。看到最后一张图片
步骤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应该亮起!!
重要提示:显然可指导人员遇到了问题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文章
23306浏览量
661537 -
树莓派
+关注
关注
117文章
1709浏览量
105716
发布评论请先 登录
相关推荐
评论