裸板开发操作系统Baking-Pi教程 一

OK01这个教程会从零开始尝试把树莓派的RCA和USB口附近的那个’ACT’LED点亮,并搭建好环境为接下来的教程做好铺垫。

准备

在实际动手之前,需要你先看完前一篇教程,并下载安装了必要的GUN工具链以及代码的模版文件OS Template

文件结构

在模版文件夹里面你会看到这样的文件目录:

build/
    (empty)
source/
    main.s
kernel.ld
LICENSE
Makefile

找个编辑器打开main.s文件,我们就可以开始写汇编代码了,树莓派使用的汇编是ARMv6,我们要写的汇编也就是ARMv6。

把下面这些代码复制粘贴进去:

.section .init
.globl _start
_start:

这些代码对树莓派没有直接的作用,它们是写给汇编器看的,汇编器是一个把我们将要写的汇编代码转换成树莓派能直接运行的机器码的程序。在汇编代码中,每一行都是一条新的命令,这里的第一行告诉汇编器和链接器把我们的代码放到哪里去,.init这里的代码会和模版文件组合,最终被放到输出代码的最前面。这一点很重要,因为我们要保证哪部分代码首先运行,如果我们不这么做的话,代码会按照字母表的顺序运行。
.section命令只是告诉了汇编器从这一点到下一个.seciton是代码的链接后的位置,而后面的两行告诉了工具链程序的入口。

第一行代码

把下面的代码拷贝粘贴进去

ldr r0,=0x20200000

在汇编代码中,计算机会简单的从上往下运行代码,每一行都是一个指令,除非遇到某些指令发生跳转。 这第一行代码告诉处理器,把0x20200000这个数字存储到r0这个寄存器里面,0x20200000显然是个十六进制的数字,那么什么是寄存器?

寄存器是处理器内部的一些用来存数据的小部件,可以理解成一个个的抽屉,有些寄存器会有一些特定的功能,在树莓派上有13个通用寄存器,每一个可以存储一个32比特的数字(从0到4,294,967,295 ),从r0一直到r12,对于这13个寄存器,做任何操作和运算都没关系,在这一行代码中,换成其他寄存器也没关系。

这行代码把0x20200000存到r0,是为了接下来的控制GPIO,而GPIO控制器的位置恰好就是0x20200000,这一点可以通过参考中的数据手册来查到。

指令

ldr reg,=val  
把val存到对应的寄存器中

设置GPIO的输出模式

mov r1,#1
lsl r1,#18
str r1,[r0,#4]

要让这个ACT LED亮起来,首先和Arduino类似的要先设置这个引脚端口为输出模式,然后再让它输出高电平。
上面的代码就能让ACTLED这个GPIO16设置为输出模式,首先我们把1存到r1,然后通过lsl指令,得到二进制的1000000000000000000,其实也可以直接把这个数存到r1,但是为了后面的操作和代码,这样写更有意义。

在GPIO控制器中,有24个字节用来设置GPIO,前4个对应前10个GPIO,第二个4个对应第二个10个,总共有54个GPIO,所以我们需要6×4总共24个字节。
在4个一组里面,每三个比特对应一个GPIO,我们操作的是16号GPIO,所以我们需要操作第二个4字节中第六个3比特,也就是上面代码中18的由来。
其中的str指令,会把r1中的值,写到地址为r0的值加上4偏移的位置

指令

mov reg, #val  
把val存到对应的reg寄存器  
mov指令比ldr快,因为mov不牵涉到内存,而ldr是从内存把数存到寄存器,但是mov只能对某些数字做操作  

lsl reg, #val  
reg寄存器的值逻辑左移val位

str reg, [dest, #val]  
把reg寄存器重的值写到地址为dest寄存器的值+val

输出高电平

mov r1,#1
lsl r1,#16
str r1,[r0,#40]

 

现在GPIO已经准备好被点亮了,这意味着我们要让GPIO16输出低电平,没错是低电平,板子本身设计就是这样。
上面的指令都已经见过了,为了让GPIO16输出低电平,我们得让一个第十六位是1的数写到偏移GPIO控制器40的地址位置,这样就能输出低电平了。

死循环

需要的代码都写完了,应该结束了,但是假如就那样的话,只要有供电,处理器就会持续工作,如果不给他其他的任务,树莓派就会崩溃。

loop$:
b loop$

 

这里的第一行不是一个命令,是一个标签,或者说名字,这意味着我们可以通过loop$这个名字来找到这一行代码,代码编译完成之后标签都没有意义了会变成地址,对于写代码的我们则是又很重大的意义,b指令的作用是下一条执行的指令跳转到后面的标签所指代的代码块,在这里就会导致树莓派一直循环直到断电。

另外GNU工具链要求代码的最后有一个空行。

编译和运行

编译非常简单,用终端进入到代码的根目录,也就是Makefile的同级目录中,运行make,没什么问题的话,就会生成一个kernel.img的文件。

安装这个系统代码之前,首先需要一个已经装好了常规的Raspbian系统的树莓派SD卡,在SD卡的目录中很容易就能找到一个kernel.img的文件,把它替换成刚刚生成的新文件,然后插上电源,就能看到这个ACTLED亮起来了。

参考

数据手册

教程0_树莓派系统及wiringPi的安装

认识树莓派

树莓派(Raspberry Pi)是一款基于Linux系统的只有信用卡大小的单板机电脑。具有电脑的所有基本功能,它是由英国的树莓派基金会所开发,目的是以低价硬件及自由软件刺激在学校的基本计算机科学教育。

树莓派自问世以后,被越来越多的人所追捧,国外的普及度已经相当高,但由于环境的差异和树莓派开发的难度限制,国内对用树莓派的人相对来说属于小众。这几年赶上国内智能硬件的热潮,arduino这种简单的编程方式被越来越多的人所接受,树莓派也被越来越多的人所了解。为减少树莓派爱好者的开发难度,本基础教程主要介绍在树莓派上使用与arduino编程相似的编程库wiringPi一步步熟悉树莓派的IO操作及linux的基本操作方法。

了解树莓派创客社区

树莓派创客社区是由一群热爱开源、热爱创造的小伙伴们组织的开源社区。旨在与大家分享开源硬件上的点点滴滴,也希望尽我们的微薄之力为广大开源硬件爱好者提供一些帮助。

社区网站:http://www.52pi.net

服务QQ群:233426487

淘宝官方直营店:https://52pi.taobao.com

实验内容

  1. 烧写系统镜像;

  2. 连接电脑串口调试;

  3. 配置wifi无线网络连接;

  4. 安装wiringPi插件;

准备工作

0.树莓派板子

基础实验,树莓派所有版本都可以完成,本教程使用的是树莓派B+版本。

1.树莓派系统镜像

可到树莓派官网:www.raspberrypi.org下载。

2.USBTTL模块 (可到https://52pi.taobao.com购买)

用于电脑和树莓派的连接,通过串口输入命令及代码,也可使用其它连接方式,如:SSH

3. Win32DiskImager软件

用于系统镜像的烧写,其它软件皆可,如:USB Image Tool

4.PuTTY软件

官网:putty.org

电脑与树莓派通信的输入输出串口监视软件,支持快捷键操作(如:Ctrl + c),其它软件也可以使用。

5.USB无线网卡(可到https://52pi.taobao.com购买)

用于联网下载wiringPi和后续的ssh连接树莓派使用。

6.WiringPI

WiringPi(官网: wiringpi.com)是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3wiringPi使用C或者C++开发并且可以被其他语言包转,例如pythonruby或者PHP等。WiringPi中的函数类似于Arduinowiring系统,这使得熟悉arduino的用户使用wringPi更为方便。(树莓派联网后可通过命令下载安装)

7.microSD

用于烧写系统镜像,由于系统较大,尽量使用8GB以上的卡,高速卡更佳,树莓派系统都是放在在储存卡里的,类似于windows电脑的C盘。早期版本树莓派用的是SD卡,注意区分。

8.电源

为适用于多场景使用,建议购买5V 2A左右的电源,电源线为通用的microUSB线。

9.其它实验器件

可到树莓派创客社区https://52pi.taobao.com购买基础套件,包含所有基础实验用的元件,

如面包板、杜邦线、led灯、按键等。

实验步骤

一、烧写树莓派系统镜像

  1. 插入microSD卡到电脑上,打开Win32DiskImager软件,如下图:

1.注意选好盘符,可在电脑文件资源管理器中查看。

2.打开文件夹,选择镜像文件。

2) 选择好下载的镜像文件,点击(Write)进行烧写,如下图:

1.确认选择好的镜像文件版本。

2.点击Write)写入,弹出提醒对话框后点击(Yes)确认写入。

3) 等待系统镜像烧写完毕,会弹出烧写成功对话框,点击确认,系统镜像烧写完成。

二、开机登陆树莓派系统

1.插上烧写好镜像文件的microSD卡,插上USB无线网卡,连接好串口线,串口通信只需连接三根线,GND-GNDTX-RXRX-TX,如下图。

2.将USBTTL串口模块连接电脑,在电脑设备管理器中查看串口号(如:COM3)。

3.打开PuTTY软件,界面如下,先选择串口模式(Serial >> 选择对应的串口号(COM15 >> 选择正确的串口速率(Speed),linux的串口波特率默认都是115200bps树莓派系统也是linux内核,所以选用115200bps点击(Open)打开串口窗口,如下:

4.给树莓派插上电源供电开机,串口监视串口会输出系统开机信息,

输出显示(raspberrypi login:),输入用户名:pi ,输入密码(Password):raspberry 回车(输入密码时无显示,但是是有效的)。

显示输出如上pi@raspberrypi:~$ 开机完成。

配置树莓派连接wifi网络

1.使用wpa_cli命令行配置wifi无线网络

了解wpa_cli命令行

wpa_cli是命令行界面下的无线网连接工具。通过wpa_cli管理备选的网络列表。在备选网络中启用的网络,树莓派会自动试图连接。输入sudo wpa_cli启动wpa_cli的命令行界面(必须sudo提取权限)。常用的指令如下:

status:列出目前的联网状态。

list:列出所有备选网络。目前正连接到的网络会标[CURRENT],禁用的网络会标[DISABLE]

add_network:增加一个备选网络,输出新网络的号码(这个号码替代下文的[network_id])。注意新网络此时是禁用状态。

set_network [network_id] ssid “Your SSID”:设置无线网的名称(SSID)。

set_network [network_id] key_mgmt WPA-PSK:设置无线网的加密方式为WPA-PSK/WPA2-PSK

set_network [network_id] psk “Your Password”:设置无线网的PSK密码。

enable_network [network_id]:启用网络,启用后如果系统搜索到了这个网络,就会尝试连接。

disable_network [network_id]:禁用网络。

save_config:保存配置。

配置方式如下:

中途输出信息可无视,配置完成,输入Ctrl + c退出wpa_cli命令行。

退出后可输入ifconfig查看网络连接,也可以ping IP地址来测试网络是否连接。

四、通过网络使用GIT工具安装wiringPi

1.如果在你的平台上还没有安装GIT工具,可以输入以下命令安装:

sudo apt-get install git-core

若在这个过程中出现错误,请确认Raspbian版本是否为最新的,可以输入以下命令更新:

sudo apt-get update

sudo apt-get upgrade

安装完GIT工具后可通过GIT获得wiringPi的源代码

git clone git://git.drogon.net/wiringPi

若已经安装过wiringPi可输入以下命令更新。

cd wiringPi

git pull origin

进入wiringPi目录并安装wiringPi

cd wiringPi

./build

build脚本会帮助你编译和安装wiringPi

wiringPi安装完毕,基础实验准备工作已经完成,快快进入下一课程继续学习吧。