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