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,下面是总线地址、物理地址、虚拟地址关系图:

GPIO扩展口

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

GPIO寄存器

在BCM2835中,共有54个GPIO管脚,其中GPIO寄存器有GPFSELn、GPSETn、GPCLRn等,下面具体描述这些寄存器的作用:

·        寄存器 GPFSEL0 ~ GPFSEL5 ----
功能寄存器,指定管脚为输入、输出等,  每3位决定一个管脚:

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$

结果:

总结

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

时间: 2024-08-02 10:59:27

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

TQ2440按键点亮LED灯的裸机程序

一,说到做ARM的裸机程序,很多人马上就会联想到一个名为ADS的开发工具,但是我们在linux下同样也可以做ARM的裸机程序,下面来说说其具体实施过程: 步骤一:编辑代码,这个没什么好说的. 步骤二:编译代码,编译代码分为三个方面的内容:1.链接脚本 2.用命令行确定链接时的文件顺序 3.用命令行编译.这三部分的内容可以全部写成一个Makefile文件,编译的时候执行make命令就可以了. 步骤三:把编译后的".bin"文件烧写进开发板,重新上电观察效果. 二,TQ2440按键点亮LE

ARM裸机程序之LED灯

从3月份开始看arm的裸机程序,到现在一个半月了,做到后来,发现自己越做到综合的程序,越吃力,还是得回头看看,为了最终写一个bootloader打下点基础吧,所以以这篇文章为开始,总结一下之前做过的裸机程序,希望会有所收获,我用的开发板是友善之臂的mini2440. 首先声明一点我都是在linux环境下写裸机程序的,因为这样能知道更多底层的东西,不过在这里面写就是有点不方便的是调试的时候,所以你程序要是调试不出来,你得把程序移植到一些编译器里调试(请注意移植的时候格式有点不同),所以偶尔在kei

第二章之在BL1中点亮LED灯

1,u-boot中第一个入口在./arch/arm/cpu/armv7/start.S 翻到153行:如下图 前面都是进行一些基本设置,不用管. cpu_init_cp15设置协处理器, cpu_init_crit则跳转到其它地方,所以要点板子上电点灯要在152行之前. 2,通过板子资料,通过设置GPIO点亮LED灯,因为了 start.S是用汇编语言写的,所以点亮LED灯也要用汇编语言 代码如下: 1 gpin_out: 2 ldr r11,=0xE0200280 3 ldr r12,=0x0

1.2.第一个实验——点亮LED灯

1.2.第一个实验--点亮LED灯 预备知识: (1)位.字节.IO端口.IO口 字节是内存管理的最小单位,一个字节是八位,每一位可以存放一个二进制位(0或者1).一个IO端口包括一组IO口,一般一组是八个,一个端口就是一组IO引脚.一个IO口对应一个二进制位,一个IO端口对应一个字节. (2)二进制和十六进制的转换 一个十六进制位等于四个二进制位,比如0xff对应二进制是1111 1111 实验目的:点亮八颗LED灯 实验过程分析: (1)八颗LED分别由八位二进制位来控制,二进制位是1时LE

树莓派点亮LED灯需要几行代码?3行。小孩子都能学会

目录 点亮LED灯 硬件连接 代码 闪烁的LED灯 呼吸灯 其他 点亮LED灯 硬件连接 找一个LED灯,连接如上图,注意长短引脚,经过这些年的狂轰乱炸,大家对于这个应该不漠视,毕竟Arduino都进教材了. 代码 我们先来看图形化的版本: from gpiozero import LED led = LED(17) led.on() 是的你没有看错,树莓派点亮LED只需要3行代码.只需要像Python的turtle编程一样导入需要用到的LED类,然后生成一个表示连接在17号GPIO引脚的LED

【树莓派】实验1:GPIO点亮led灯

详细请参考网友博文. 实验目的:控制GPIO,点亮一个led灯 实验步骤: 1.使用wiscp传输GPIO的库文件(下载地址)到树莓派中,并解压(可以像windows操作一样解压,或者使用命令行解压). 2.解压后,可以看到其中有一个文件setup.py 使用命令行切换到此文件的路径:cd /home/pi/Downloads/RPi.GPIO-0.6.3 再使用命令行安装setup.py: sudo python setup.py install 3.编写GPIO程序 1 import RPi

我的 FPGA 学习历程(02) —— 实验点亮 LED 灯

关于 Quartus 的操作可以使用 Quartus 自带的帮助,帮助中有全套的操作教程. 中文网络教程链接(链接至altera中文官网,点击观看) Quartus II 软件设计系列:基础 Quartus II 软件中的原理图设计 SignalTap II 嵌入式逻辑分析器 使用Nios II 处理器 系统控制台 Nios II 处理器开发软件:设计流程 Nios II 处理器开发软件:MMU和MPU 无论是英文帮助还是网络中文教程,他们的前提是你是有基础的,这些教程之会教给你我们的 quar

三、点亮LED灯

目标:让LED每秒闪烁1次 材料: 1.SAGOO UNO板1块 2.USB线1根 步骤: 1.用USB线连接Arduino板和PC,电源LED灯亮: 2.启动Arduino IDE软件,打开“File"->"Examples"->"01.Basics"->"Blink"; 3.点击“编译Verify"->"下载Upload"; 4.看到电路板上L标示的LED灯每秒闪烁. 原理图 代

嵌入式linux——点亮led灯(二)

刚才在jz2440板子上写了一个点亮中间led的程序,前前后后十几分钟才好.最终代码 .text .global _start _start: /* 在这个程序中,完成点亮中间的led灯D11 * GPF5 从原理图得知,低电平点亮 * GPFCON 0x56000050 * GPFDAT 0x56000054 */ ldr r0, =0x56000050 ldr r1, =0x400 str r1, [r0] mov r0, #0 ldr r1, =0x56000054 str r0, [r1