Raspberry PI 系列 —— 裸机点亮LED灯

背景

近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了解底层的启动流程。通过几天的研究,发现最底层部分的启动是由官方提供的bootcore.bin和start.elf文件来执行(应该是对硬件设备的初始化。如MMU等),之后由下一部分kernel.img的_start接管。

为了真正验证此流程,于是想利用GPIO控制LED灯,几经折腾最终成功点亮LED,现记录于此。

外设地址编码

要想控制GPIO管脚就必须知道GPIO管脚的地址,在ARM架构中外设IO一般採用统一编码。BCM2835将外设地址0x7E00000映射到RAM的0x20000000。如0x7E200000则为0x20200000。以下是总线地址、物理地址、虚拟地址关系图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc21hbGxtdW91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

GPIO扩展口

本次我们要通过板子上预留的GPIO管脚来控制LED灯,这里必须了解这些管脚的含义,B+版本号的GPIO口扩展到了40脚,下图是B与B+的GPIO管脚差别:

GPIO寄存器

在BCM2835中,共同拥有54个GPIO管脚。当中GPIO寄存器有GPFSELn、GPSETn、GPCLRn等,以下详细描写叙述这些寄存器的作用:

·        寄存器 GPFSEL0 ~ GPFSEL5 ----
位决定一个管脚:

o   000 = GPIO Pin 9 is aninput

o   001 = GPIO Pin 9 is anoutput

o   100 = GPIO Pin 9 takesalternate function 0

o   101 = GPIO Pin 9 takesalternate function 1

o   110 = GPIO Pin 9 takesalternate function 2

o   111 = GPIO Pin 9 takesalternate function 3

o   011 = GPIO Pin 9 takesalternate function 4

o   010 = GPIO Pin 9 takesalternate function 5

当中:(寄存器---地址---描写叙述)

* GPFSEL0 --- 0x7E200000 ---
决定GPIO0-GPIO9管脚的功能

* GPFSEL1 --- 0x7E200004 ---
决定GPIO10-GPIO19管脚的功能

* GPFSEL2 --- 0x7E200008 ---
决定GPIO20-GPIO29管脚的功能

* GPFSEL3 --- 0x7E20000c ---
决定GPIO30-GPIO39管脚的功能

* GPFSEL4 --- 0x7E200010 ---
决定GPIO40-GPIO49管脚的功能

* GPFSEL5 --- 0x7E200014 ---
决定GPIO50-GPIO53管脚的功能

·        寄存器 GPSET0 - CPSET1 ----
设为1,
每一位决定一个管脚

o   0 = No effect

o   1 = Set GPIO pin n

当中:(寄存器---地址---描写叙述)

* GPSET0 --- 0x7E20001C ---
决定GPIO0-GPIO31管脚

* GPSET1 --- 0x7E200020 ---
决定GPIO32-GPIO53管脚

·        寄存器 GPCLR0 - GPCLR1 ----
设为0,
每一位决定一个管脚

o   0 = No effect

o   1 = Clear GPIO pin n

当中:(寄存器---地址---描写叙述)

* GPSET0 --- 0x7E200028 ---
决定GPIO0-GPIO31管脚

* GPSET1 --- 0x7E20002C ---
决定GPIO32-GPIO53管脚

样例 --- 设置GPIO16为低电平

不多说了。该介绍的,前面已经介绍过了。直接上代码:

.section .init

.globl _start

_start:

ldr r0,=0x20200000

/* Set GPIO16 to output mode(001) */

mov r1,#1

lsl r1,#18

str r1,[r0,#4] /* GPFSEL1(决定GPOI10 - GPIO19) */

/* Clear GPIO16 */

mov r1,#1

lsl r1,#16

str r1,[r0,#40] /* GPCLR0(决定GPOI0 - GPIO31) */

/*

* Loop over this forevermore

*/

loop$:

b loop$

结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc21hbGxtdW91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

总结

经过了多次的尝试最终点亮了LED灯。尽管如今想起。可能非常easy,当这毕竟是零的突破,在这一小步中,掌握了非常多知识,如总线地址、物理地址的关系,怎样看GPIO寄存器,ARM的汇编指令等等,有了这一步的成功我就能进行很多其它复杂的实验。

Raspberry PI 系列 —— 裸机点亮LED灯的更多相关文章

  1. 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  2. 30个物联网传感器小实验:三行代码点亮LED灯

    30个物联网传感器小实验:三行代码点亮LED灯 三行代码点亮LED灯 LED灯闪烁 LED灯调亮度 LED淡入淡出 不写一行代码点亮LED灯 全彩RGB灯 面包板 30个物联网传感器小实验:三行代码点 ...

  3. 初探RT-Thread系统在GD32E103x芯片上的使用,点亮LED灯

    初探RT-Thread系统在GD32E103x芯片上的使用,点亮LED灯 前言 ​ 随着中美贸易战的加剧,很多公司越来越重视使用国产技术的重要性.使用国产技术,一方面可规避国外对技术的封锁造成产品核心 ...

  4. 第二章之S5PV210在BL1中点亮LED灯

    1,u-boot中第一个入口在./arch/arm/cpu/armv7/start.S 翻到153行:如下图 前面都是进行一些基本设置,不用管. cpu_init_cp15设置协处理器, cpu_in ...

  5. 第7章 使用寄存器点亮LED灯

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  6. C语言版——点亮LED灯,深入到栈

    在上一篇进行了汇编语言的编写之后,我们采用C语言来编写程序,毕竟C语言才是我们使用最多的语言. 仅仅是点亮LED灯显然太过于简单,我们需要分析最后的反汇编,了解函数调用栈,深入C语言骨髓去分析代码,并 ...

  7. 字符型设备驱动程序-first-printf以及点亮LED灯(三)

    根据  字符型设备驱动程序-first-printf以及点亮LED灯(二) 学习 修改函数 中的printf 为 printk. #include <linux/module.h> /* ...

  8. JZ2440开发板:用按键点亮LED灯(学习笔记)

    本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...

  9. JZ2440裸机点亮LED【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 一.我们首先来做第一个实验,用汇编语言点亮板子上的LED. 1.1 LED的原理图 从下面的原理图可知LED1是 ...

随机推荐

  1. 继续过Hard题目.0207

    接上一篇:http://www.cnblogs.com/charlesblc/p/6364102.html 继续过Hard模式的题目吧.   # Title Editorial Acceptance ...

  2. python的urlencode与urldecode

    ```python3.x中urlencode在urllib.parse模块中``` 当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的call ...

  3. 网页爬虫框架jsoup介绍

    序言:在不知道jsoup框架前,因为项目需求.须要定时抓取其它站点上的内容.便想到用HttpClient方式获取指定站点的内容.这样的方法比較笨,就是通过url请求指定站点.依据指定站点返回文本解析. ...

  4. tensorflow利用预训练模型进行目标检测(一):安装tensorflow detection api

    一.tensorflow安装 首先系统中已经安装了两个版本的tensorflow,一个是通过keras安装的, 一个是按照官网教程https://www.tensorflow.org/install/ ...

  5. 求区间连续不超过K段的最大和--线段树+大量代码

    题目描述: 这是一道数据结构题. 我们拥有一个长度为n的数组a[i]. 我们有m次操作.操作有两种类型: 0 i val:表示我们要把a[i]修改为val; 1 l r k:表示我们要求出区间[l,r ...

  6. lightoj--1354-- IP Checking(水题)

    IP Checking Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Submit Sta ...

  7. 给centos重新安装yum的base-repo源

    转自:https://blog.csdn.net/lovemysea/article/details/79552952 如果自己的centos的系统yum源出现问题了,如何才能修复? 方式一:使用国内 ...

  8. 解析RecyclerView(2)——带顶部View和底部View的RecyclerView

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  9. c/s winform打包和部署

    1:vs2010新建  安装项目  左边出现3个文件夹 2:点击 第一个文件夹-> “应用程序文件夹”    将 bin 目录下的所以文件  拖进 右边的空白处:c:\windows\syste ...

  10. OpenGL编程(八)3D数学与坐标变换

    笛卡尔坐标 一维坐标系 以一个点为原点,选定一个方向为正方向(相反的方向为反方向),以一定的距离为标尺建立一维坐标系.一维坐标系一般应用于描述在一维空间中的距离. 举个例子:一维坐标系好比一条拉直的电 ...