Exynos 4412处理器流水灯LED实现代码及过程详解

1.先在厂家给的原理图中找到LED灯模块
Exynos 4412处理器流水灯LED实现代码及过程详解_第1张图片
我们可以看到一共4个led,按照共阳极的接法
如果将led的另外一段设置为低电平的时候,led两端有电位差,led亮,
如果将led的另外一段设置为高电平的时候,led两端没有电位差,led灭
如果给三极管的基极设置为高电平的时候,三级管导通,led5的两端产生电位差,led亮
如果给三极管的基极设置为低电平的时候,三级管不导通,led5的两端没有电位差,led灭

2.找管脚
可以看到
LED2管脚:GPX2_7
LED3管脚:GPX1_0
LED4管脚:GPF3_4
LED5管脚:GPF3_5
且管脚输出低电平,则LED亮

3.看芯片手册
A:芯片控制原理:
B:寄存器
LED2寄存器位GPX2_7
先找到控制寄存器GPX2CON
Exynos 4412处理器流水灯LED实现代码及过程详解_第2张图片
我们可以看到GPX2地址(0x1100 0c40)及下所有的寄存器,然后找到GPX2_7的有效位位[31:28]
此时我们用到的只有0x0=Input 以及 0x1=Output, 通过对应位的设置,可以用来设置对应管脚的输入/出模式;
Exynos 4412处理器流水灯LED实现代码及过程详解_第3张图片
我们GPX2DAT 对应地址位0x1100 0c44
如果对应管脚设置为输出模式的时候:
1) 如果对应位设置为1,则表示输出为高电平;
2) 如果对应位设置为0,则表示输出为低电平;
然后找到数据寄存器GPX2DAT

同理,找到LED3状态寄存器以及数据寄存器
状态寄存器地址: GPX1CON: 0x1100 0c20 GPX1_0:[3:0] //第3位到0位
数据寄存器地址: GPX1DAT : 0x1100 0c24

LED4:
控制寄存器:GPF3ON: 0x1140 01e0 GPF3_4:[19:16]
数据寄存器:GPF3DAT: 0x1140 01e4

LED5:
控制寄存器:GPF3ON:0x1140 01e0 GPF3_5:[23:20]
数据寄存器:GPF3DAT:0x1140 01e4

然后进入Linux系统建立名为start.S的代码:

.global _start
_start:
    //init led2,进入状态寄存器,将对应位改为可写模式
    ldr r0, =0x11000c40    //加载,另一个意思时进入这个地址
    ldr r1, [r0]           //将这个地址保存到r1寄存器
    bic r1, #0xf0000000    //GPX2_7:[31:28] 清零
    orr r1, #0x10000000    //0x1=Input 置1
    str r1, [r0]           //存储

    //init led3
    ldr r0, =0x11000c20
    ldr r1, [r0]
    bic r1, #0xf
    orr r1, #0x1
    str r1, [r0]

    //init led4
    ldr r0, =0x114001e0
    ldr r1, [r0]
    bic r1, #0xf0000
    orr r1, #0x10000
    str r1, [r0]

    //init led5
    ldr r0, =0x114001e0
    ldr r1, [r0]
    bic r1, #0xf00000
    orr r1, #0x100000
    str r1, [r0]

loop:

    //led2 on
    ldr r0, =0x11000c44    //加载GPX2_7对应的数据寄存器
    ldr r1, [r0]
    orr r1, #0x80          //1000 0000 将[31:28]对应位置1,输出高电平,led亮
    str r1, [r0]
    bl delay      //延时

    //led2 off
    ldr r1, [r0]
    bic r1, #0x80        //将[31:28]对应位清0,输出低电平,led灭
    str r1, [r0]
    bl delay

    //led3 on
    ldr r0, =0x11000c24
    ldr r1, [r0]
    orr r1, #0x1
    str r1, [r0]
    bl delay

    //led3 off
    ldr r1, [r0]
    bic r1, #0x1
    str r1, [r0]
    bl delay

    //led4 on
    ldr r0, =0x114001e4
    ldr r1, [r0]
    orr r1, #0x10
    str r1, [r0]
    bl delay

    //led4 off
    ldr r1, [r0]
    bic r1, #0x10
    str r1, [r0]
    bl delay

    //led5 on
    ldr r0, =0x114001e4
    ldr r1, [r0]
    orr r1, #0x20
    str r1, [r0]
    bl delay

    //led5 off
    ldr r1, [r0]
    bic r1, #0x20
    str r1, [r0]
    bl delay


    b loop    //死循环


delay:     //延时函数
    ldr r3, =0xffffff
delay1:
    sub r3, #1
    cmp r3, #0
    moveq pc, lr
    b delay1

Makefile代码

all:
    arm-none-linux-gnueabi-gcc start.S -o start.o -c -g
    arm-none-linux-gnueabi-ld -Ttext 0x40008000 start.o -o start.elf
    arm-none-linux-gnueabi-objcopy -O binary start.elf start.bin
    cp start.bin /mnt/hgfs/Unbantu_file

运行超级终端
Exynos 4412处理器流水灯LED实现代码及过程详解_第4张图片

打开FS4412电源
Exynos 4412处理器流水灯LED实现代码及过程详解_第5张图片
输入:loadb 40008000 然后上传二进制文件(.bin)
Exynos 4412处理器流水灯LED实现代码及过程详解_第6张图片
这里写图片描述

Exynos 4412处理器流水灯LED实现代码及过程详解_第7张图片

最后在超级终端输入命令: go 40008000
到这里,可以看到开发板上四个LED轮流闪瞎了我的眼睛,也预示着我的第一个arm开发板实验大功告成!
最后附上超级终端和芯片原理图用户使用手册及设备版资料
链接:https://pan.baidu.com/s/1mSehx5aMhIhExl-2OgyHjA 密码:sdza

你可能感兴趣的:(arm)