ARM裸机之点亮LED

声明:本文由个人学习过程中整理而成,转载请注明出处

实验开发版:S5PV210

1、什么是GPIO?

General Purpose Input Output (通用输入/输出)简称为GPIO,属于芯片引脚的一部分。

嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。

2、点亮LED的原因

点亮LED要求正极与负极之间有一定的正向电压差。

熄灭LED就是让正极与负极之间没有电压差。

3、查询原理图

D22:正极接3.3v,负极接引脚GPJ0_3。

D23:正极接3.3v,负极接引脚GPJ0_4。

D24:正极接3.3v,负极接引脚GPJ0_5。

D25:正极接3.3v,负极接引脚PWMTOUT1(GPD0_1)。

D26:正极接5V,负极接地。

可以通过编程控制GPIO引脚输出低电平,产生电压差。

4、查询数据手册

设置GPJ0CON控制寄存器,GPJ0_3、GPJ0_4、GPJ0_5引脚为Output工作模式,使其能输出电压。

设置GPJ0DAT数据寄存器,GPJ0_3、GPJ0_4、GPJ0_5引脚相应位为0(低电平)。

5、点亮LED的步骤:

(1)设置GPJ0CON控制寄存器,GPJ0_3、GPJ0_4、GPJ0_5引脚为Output工作模式,使其能输出电压。

(2)设置GPJ0DAT数据寄存器,GPJ0_3、GPJ0_4、GPJ0_5引脚相应位为0(0为低电平,1为高电平)。

6、汇编代码实现LED流水灯

global _start//链接属性改为外部_start://配置GPJ0_3 ~ GPJ0_5为输出模式ldr r0, =0xE0200240ldr r1, =0x00111000str r1, [r0] //配置GPD0_1为输出模式ldr r0, =0xE02000A0ldr r1, =0x00000010str r1, [r0] loop_led://配置GPJ0_3为低电平ldr r0, =0xE0200244ldr r1, =((0<<3) | (1<<4) | (1<<5))str r1, [r0]//延时bl delay //配置GPJ0_4为低电平ldr r0, =0xE0200244ldr r1, =((1<<3) | (0<<4) | (1<<5))str r1, [r0]//延时bl delay //配置GPJ0_5为低电平ldr r0, =0xE0200244ldr r1, =((1<<3) | (1<<4) | (0<<5))str r1, [r0]//延时bl delay //配置GPJ0_3 ~ GPJ0_5为高电平ldr r0, =0xE0200244ldr r1, =((1<<3) | (1<<4) | (1<<5))str r1, [r0]

//配置GPD0_1为低电平ldr r0, =0xE02000A4ldr r1, =(0<<1)str r1, [r0]

//延时bl delay

//配置GPD0_1为高电平ldr r0, =0xE02000A4ldr r1, =(1<<1)str r1, [r0] b loop_led

// 延时功能delay:ldr r1, =0ldr r2, =7777777loop_delay:sub r2, r2, #1cmp r1, r2bne loop_delaymov pc, lr

7、C语言代码实现流水灯

// 寄存器宏定义#defineGPJ0CON(0xE0200240)#defineGPJ0DAT(0xE0200244) #define GPD0CON(0xE02000A0)#define GPD0DAT(0xE02000A4)

#define rGPJ0CON(*(volatile unsigned int *)GPJ0CON)#define rGPD0CON(*(volatile unsigned int *)GPD0CON) #definerGPJ0DAT(*(unsigned volatile int *)GPJ0DAT)#definerGPD0DAT(*(unsigned volatile int *)GPD0DAT) // 延时函数void delay_time(void){    volatile unsigned int i = 0;    for(i=0; i<40000; i++)    for(i=0; i<600000; i++);} void illumine_led(void){    // 配置为输出模式    rGPJ0CON = 0x00111000;    rGPD0CON = 0x00000010;        while(1)    {    //点亮LED1、延迟    rGPJ0DAT = ~(1 << 3);    delay_time();        //点亮LED2、延迟    rGPJ0DAT = ~(1 << 4);    delay_time();        //点亮LED3、延迟    rGPJ0DAT = ~(1 << 5);    delay_time();        //熄灭LED1~LED3    rGPJ0DAT = ((1<<3) | (1<<4) | (1<<5));        //点亮LED4、延迟    rGPD0DAT = ~(1<<1);    delay_time();        //熄灭LED4    rGPD0DAT = (1<<1);    }}

参考资料:《朱老师物联网大讲堂---ARM裸机全集》

时间: 2024-10-17 06:11:15

ARM裸机之点亮LED的相关文章

裸机循环点亮LED(运行在片内ram中)

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992476.html .globl _start_start: /*硬件相关的设置-该设置是ARM11中特有的,告诉CPU外围设备的基地址*/    ldr r0, =0x70000000    orr r0, r0,  #0x13/*设置协寄存器,在ARM11内核手册中有说明*//*r0 = 0x70000013 表示 长度为256M*/    mcr p15, 0, r0, c15, c2,

2440 裸机学习 点亮LED

1.首先需要知道 led 是受哪一个gpio口控制 从上图可以看出,两个led灯是受GPF4 GPF5控制的,低电平有效. 2.怎么控制GPF4 GPF5 通过2440的芯片手册可以看出,需要设置GPF的引脚只需要设置,两个寄存器就可以了.GPFCON  GPFDAT. C语言部分: void delay(volatile int d)//延时函数 { while (d--); } int led_on(int which) { unsigned int *pGPFCON = (unsigned

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

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

ARM裸机程序之LED灯

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

嵌入式Linux裸机开发(一)——点亮Led

嵌入式Linux裸机开发(一)--点亮Led 开发板:友善之臂smart210 一.电路图查阅 1.底板电路图 查阅开发板底板电路图,查阅LED相关部分 LED电路工作原理: LED的正极接3.3V,负极接地时导通,LED发光. 开发板共有四颗LED,正极接3.3V,负极接开发板的LED1_LED4引脚,如果LED要点亮则需要输入低电平. 2.核心板电路图 查阅核心板电路图可知,LED1-LED4接在SoC的GPJ2_0-GPJ2_3,通过控制GPJ2_0-GPJ2_3的寄存器使对应GPIO引脚

ARM学习篇一 点亮LED

要点亮LED,先决条件是什么,当然得有相应的硬件设施.板子的整个电路图比较大,我就直接取相关部分. 给发光二级管加上3.3v电压后,通过1k电阻,直接与S3C2440连接.至于为什么要加电阻,大家应该都知道,发光二极管的正向电阻很小,管子很容易因电流过大而烧坏.至于具体多少,可以看你买的管子的说明. 具体的烧写驱动安装,ARM集成开发环境安装我就不说了.一般都有手册,手册里面说得很清楚. 下面是代码实现: AREA LED,CODE,READONLY ENTRY CODE32GPFCON EQU

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

背景 最近刚买了Raspberry PI B+,配置运行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了解底层的启动流程,通过几天的研究,发现最底层部分的启动是由官方提供的bootcore.bin和start.elf文件来执行(应该是对硬件设备的初始化,如MMU等),之后由下一部分kernel.img的_start接管.为了真正验证此流程,于是想利用GPIO控制LED灯,几经折腾终于成功点亮LED,现记录于此. 外设地址编码 要想控制GPIO管脚就必须知道

嵌入式学习笔记002-点亮led

正如编写第一个程序所打印"hello world"那样,对TQ2440开发板的初次使用也是从最简单的部分入手,点亮led灯无疑是最简单的,起码只要设置几个寄存器就好,比起打印容易得多了,后续会讲到串口部分再来实现我们这句金典的对白~~~~ 板子共有4个led灯,如果能够成功点亮其中一个,那么其他几个将不是问题,故而我们的目标是先点亮第一个先,在此我们必须理清几个问题: a. led的引脚连接的相关寄存器 b. 编写的语言 c. 用什么来编译链接成可执行文件 d. 怎么download到

arm9 点亮led程序优化导致全亮问题

如需转载请注明出处 本实验是arm9 裸板程序,主要功能是循环点亮4个led. 参考伟山东的<嵌入式linux应用开发>点亮led节. 电路图如下: 代码如下: head.s .text .global _start _start: ldr r0, =0x56000010 @ WATCHDOG寄存器地址 mov r1, #0x0 str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启 ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内