GPIO即为输入输出及端口,我们可以通过他们输出高低电平或者读入引脚的电平变化。
所使用的S3C2440芯片共有130个IO口,分为A-J九组:GPA、GPB、.....GPJ。我们可以通过设置寄存器来确定这个引脚是用于输入、输出还是其他功能。
对于这些GPIO引脚,他们的寄存器是相似的,GPxCON用于选择功能,GPxDAT用于读/写引脚数据:GPxUP寄存器用于确定是否使用内部上拉电阻。
如图为LED所接引脚——GPF4,那么我们对GPF6引脚的配置进行详细介绍。
由下图可以知道,对于GPF引脚的配置只需要设置如下三个寄存器即可
1)GPFCON寄存器主要用于功能设置。且GPFCON的地址为0X56000050,GPF4需要对GPFCON的8、9位进行配置,00为输入模式,01为输出模式,在这里我们选择配置为 01,
即把0x100写到地址0X56000050上
ldr r1, =0x56000050
mov r0, #0x100 //ldr r0, =0x100
str r0,[r1] //把R0的值写入R1的地址
2)GPFDAT寄存器的配置,GPFDAT寄存器主要用于配置引脚状态。GPFDAT的地址为0X56000054、 对GPFDAT进行配置,需要把0X10写入地址0X56000054上。
3)GPFUP寄存器,选择是否适用上拉电阻,这里我们不进行配置
通过对寄存器的配置,那么代码如下:新建led.S
/*
*点亮LED:GPF4
*/
.text
.global _start
_start:
/*
*配置GPF4为输出引脚
* 吧0x100写到地址0X56000050上
*/
ldr r1, =0x56000050
mov r0, #0x100 //ldr r0, =0x100
str r0,[r1] //把R0的值写入R1的地址
/*
*配置GPF4输出高电平
*把0 写道地址0X56000054上
*/
ldr r1, =0x56000054
mov r0, #0 //ldr r0, =0
str r0,[r1] //把R0的值写入R1的地址
/*死循环*/
halt:
b halt
在完成程序编写后,在Linux系统中进行编译和链接
首先,进行编译,生成.o文件
arm-linux-gcc -c -o led_on.o led_on.S
在进行链接,生成 .elf 文件
arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
在生成二进制文件 .bin
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
注:可以创建一个makefile文本
all:
arm-linux-gcc -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
clean:
rm *.bin *.o *.elf
这样,我们可以直接使用 make all命令来创建.o .bin .elf文件,也可以使用 make clean 来进行清除。最后所生成的.bin文件即我们最后需要烧入开发板的文件。
随后,把.bin文件传入Windows电脑,进入cmd命令
cd ./..../ //bin文件目录
oflash led_on.bin
unsigned int *GPFCON = 0x56000050;unsigned int *GPFDAT = 0x56000054;*GPFCON = 0x100;*GPFDAT = 0;
代码可自行下载:
汇编代码进行点灯
链接:https://pan.baidu.com/s/1-ZEH1Vp3F7VivWkKXdyOOQ
提取码:u06r
--来自百度网盘超级会员V4的分享
C语言进行点灯,包含start.S
链接:https://pan.baidu.com/s/1mAnLkDUK2ukliNyxX9mnUA
提取码:lmzx
--来自百度网盘超级会员V4的分享
C语言进行点灯,包含.h文件对每个寄存器地址进行宏定义
链接:https://pan.baidu.com/s/1Eghti3P4Lathvz7aQJ6Vwg
提取码:5gdy
--来自百度网盘超级会员V4的分享
进行3个LED的流水显示
链接:https://pan.baidu.com/s/1sd3lLvSbgDutTd5CQn0FoA
提取码:xa28
--来自百度网盘超级会员V4的分享