ARM裸机之点亮LED

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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, =0xE0200240
ldr r1, =0x00111000
str r1, [r0]
 
//配置GPD0_1为输出模式
ldr r0, =0xE02000A0
ldr r1, =0x00000010
str r1, [r0]
 
loop_led:
//配置GPJ0_3为低电平
ldr r0, =0xE0200244
ldr r1, =((0<<3) | (1<<4) | (1<<5))
str r1, [r0]
//延时
bl delay
 
//配置GPJ0_4为低电平
ldr r0, =0xE0200244
ldr r1, =((1<<3) | (0<<4) | (1<<5))
str r1, [r0]
//延时
bl delay
 
//配置GPJ0_5为低电平
ldr r0, =0xE0200244
ldr r1, =((1<<3) | (1<<4) | (0<<5))
str r1, [r0]
//延时
bl delay
 
//配置GPJ0_3 ~ GPJ0_5为高电平
ldr r0, =0xE0200244
ldr r1, =((1<<3) | (1<<4) | (1<<5))
str r1, [r0]

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

//延时
bl delay

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

// 延时功能
delay:
ldr r1, =0
ldr r2, =7777777
loop_delay:
sub r2, r2, #1
cmp r1, r2
bne loop_delay
mov 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裸机全集》


以上是关于ARM裸机之点亮LED的主要内容,如果未能解决你的问题,请参考以下文章

S5PV210裸机程序之点亮LED基于九鼎X2103BVS

驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

STM32F407第一步之点亮LED

Linux系统编程二:字符设备控制之点亮LED灯控制蜂鸣器

ESP8266-12F学习之点亮一个LED灯

ARM裸机开发:C语言点亮LED