iTop4412 裸机开发 LED

平台:iTop4412 SCP 2G

开发板有两个可控制的LED灯:分别接到引脚:KP_COL0和VDD50_EN

KP_COL0就是GPL2_0    

 

VDD50_EN就是GPK1_1    

配置GPX_CON对应位为输出功能,设置GPX_DAT相应管脚输出为1,就可以点亮LED灯了。

 

 

实现代码如下:

源码1:start.S 

.global _start
#include "s3c4412_gpio.h"
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
_start:
    ldr r0, =0x1002330C
    ldr r1, [r0]
    orr r1, r1, #0x300
    str r1, [r0]

    ldr r0, =0x11000C08
    ldr r1, =0x0
    str r1, [r0]

    ldr r0, =GPL2CON
    mov r1, #(0x01 << 0)
    str r1, [r0]
    
    ldr r0, =GPK1CON
    mov r1, #(0x01 << 4)
    str r1, [r0]

1:
    ldr r0, =GPK1DAT
    mov r1, #0x2
    str r1, [r0]

    ldr r0, =GPL2DAT
    mov r1, #0x0
    str r1, [r0]

    b 1b

halt:
    b halt

源码2: s3c4412_gpio.h 

#ifndef S3C4412_GPIO_H
#define S3C4412_GPIO_H

#define GPX1CON (0x11000000 + 0x0C20)
#define GPX1DAT (0x11000000 + 0x0C24)
#define GPX1PUD (0x11000000 + 0x0C28)
#define GPX1DRV (0x11000000 + 0x0C2C)

#define GPK1CON (0x11000000 + 0x0060)
#define GPK1DAT (0x11000000 + 0x0064)
#define GPK1PUD (0x11000000 + 0x0068)
#define GPK1DRV (0x11000000 + 0x006C)

#define GPL2CON (0x11000000 + 0x0100)
#define GPL2DAT (0x11000000 + 0x0104)
#define GPL2PUD (0x11000000 + 0x0108)
#define GPL2DRV (0x11000000 + 0x010C)

#endif

源码3: link.lds 

SECTIONS
{
    . = 0x0;
    .text : {
        * (.text)
    }
    .rodata ALIGN(4) : {
        * (.rodata*)
    }
    .data ALIGN(4) : {
        * (.data*)
    }
    .bss ALIGN(4) : {
        * (.bss)
        * (COMMON)
    }
}

源码4: 

CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
%.o : %.S
    $(CROSS_COMPILE)gcc -o $@ $< -c
%.o : %.c
    $(CROSS_COMPILE)gcc -o $@ $< -c

led.bin : start.o
    $(CROSS_COMPILE)ld -T link.lds -o led.elf $^
    $(CROSS_COMPILE)objcopy -O binary led.elf led.bin
    $(CROSS_COMPILE)objdump -D led.elf > led.dis

.PHONY : clean
clean :
    rm -rf *.o *.elf *.bin *.dis

工程压缩包链接: https://download.csdn.net/download/c54255787/11234582

 

完成或修改了源代码需每次重复操作以下三个步骤:

步骤1: 编译生成目标文件,执行  make led.bin

步骤2:因为这个裸机是s3c4412 datasheet 中所描述的 bl1, 所以编译出的led.bin头16个字节需要处理下,才能正常运行。 执行 ./mk4412 led.bin

步骤3:烧写处理好的led.bin到sd卡里头,执行 

sudo mkfs.vfat -F 32 -I /dev/sdb
sudo dd if=/dev/zero of=/dev/sdb bs=512 seek=1 iflag=dsync oflag=dsync count=2048
sudo dd if=./led.bin of=/dev/sdb bs=512 seek=1 iflag=dsync oflag=dsync

   请注意加粗标红得"sdb", 也可能是sdc,没插U盘执行df -l,再插入U盘执行df -l,观察多出来得就是sdx就是你的U盘。

 

最后就能看到开发板上led2灭,led3被点亮了。

如果需要LED2也点亮,则start.S中修改:

 ldr r0, =GPL2DAT
    mov r1, #0x1
    str r1, [r0]

 

参考链接:https://blog.csdn.net/suz_cheney/article/details/45974139

posted @ 2019-06-10 22:12  取名字脑壳疼  阅读(754)  评论(0编辑  收藏  举报