Raspberry PI 系列 —— 裸机点亮LED灯
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灯的更多相关文章
- 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列
第7章 使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- 30个物联网传感器小实验:三行代码点亮LED灯
30个物联网传感器小实验:三行代码点亮LED灯 三行代码点亮LED灯 LED灯闪烁 LED灯调亮度 LED淡入淡出 不写一行代码点亮LED灯 全彩RGB灯 面包板 30个物联网传感器小实验:三行代码点 ...
- 初探RT-Thread系统在GD32E103x芯片上的使用,点亮LED灯
初探RT-Thread系统在GD32E103x芯片上的使用,点亮LED灯 前言 随着中美贸易战的加剧,很多公司越来越重视使用国产技术的重要性.使用国产技术,一方面可规避国外对技术的封锁造成产品核心 ...
- 第二章之S5PV210在BL1中点亮LED灯
1,u-boot中第一个入口在./arch/arm/cpu/armv7/start.S 翻到153行:如下图 前面都是进行一些基本设置,不用管. cpu_init_cp15设置协处理器, cpu_in ...
- 第7章 使用寄存器点亮LED灯
第7章 使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- C语言版——点亮LED灯,深入到栈
在上一篇进行了汇编语言的编写之后,我们采用C语言来编写程序,毕竟C语言才是我们使用最多的语言. 仅仅是点亮LED灯显然太过于简单,我们需要分析最后的反汇编,了解函数调用栈,深入C语言骨髓去分析代码,并 ...
- 字符型设备驱动程序-first-printf以及点亮LED灯(三)
根据 字符型设备驱动程序-first-printf以及点亮LED灯(二) 学习 修改函数 中的printf 为 printk. #include <linux/module.h> /* ...
- JZ2440开发板:用按键点亮LED灯(学习笔记)
本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...
- JZ2440裸机点亮LED【学习笔记】
平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 一.我们首先来做第一个实验,用汇编语言点亮板子上的LED. 1.1 LED的原理图 从下面的原理图可知LED1是 ...
随机推荐
- Python爬虫之正則表達式
1.经常使用符号 . :匹配随意字符,换行符 \n 除外 * :匹配前一个字符0次或无限次 ? :匹配前一个字符0次或1次 .* :贪心算法.尽可能的匹配多的字符 .*? :非贪心算法 () ...
- Grace Hopper 葛丽丝 霍普
Grace Murray Hopper(1906-1992), COBOL之母, Debug之母, A ship in port is safe, but that is not what ships ...
- Deming管理系列(1)——开车仅仅看后视镜
问题: 当业务经理被要求为未来的业务做计划时,他会提出一个自觉得不错的数字,而董事会往往希望能获得更大的收益,多次与其谈判.而业务经理在这方面不是新手,他有非常多可用的报告. 为什么不能让业务规划流程 ...
- Android 获取屏幕截图 和保存到本地的sd卡路径下
/** * 获取和保存当前屏幕的截图 */ private void GetandSaveCurrentImage() { //1.构建Bitmap WindowManager windowManag ...
- DB-MySQL:MySQL 序列使用
ylbtech-DB-MySQL:MySQL 序列使用 1.返回顶部 1. MySQL 序列使用 MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想 ...
- 12.Matlab神经网络工具箱
概述: 1 人工神经网络介绍 2 人工神经元 3 MATLAB神经网络工具箱 4 感知器神经网络 5 感知器神经网络 5.1 设计实例分析 clear all; close all; P=[ ; ]; ...
- 35.QT蝴蝶飞舞
fly.h #ifndef FLY_H #define FLY_H #include <QObject> #include <QPainter> #include <QG ...
- ios 中生成随机数
ios 有如下三种随机数方法: 1. srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; 2. s ...
- Tomcat 初探(二) server.xml 配置
前言 在上一篇文章中,我们在示例中演示了网站的发布,其中涉及到了 server.xml 的修改,本文中我会给大家详细解释一下 server.xml 文件中的节点及其属性的作用,本片文章参考并摘抄了他人 ...
- 后端向服务器发送客户端请求--HttpWebRequest
HttpWebRequest类与HttpRequest类的区别 HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息. HttpWebReques ...