Linux下给arm的引脚电平,【嵌入式Linux+ARM】GPIO操作

1.GPIO介绍

GPIO(general purpose i/o ports)意思为通用输入/输出端口,通俗的说就是一些引脚。

我们可以通过它们输出高低电平 或 读入引脚的状态。

s3c2440中有130个I/O端口,分为A~J共9组,GPA、GPB、..... GPJ

0818b9ca8b590ca3270a3433284dd417.png

2.GPIO寄存器

既然要操作GPIO,必须对相应的寄存器进行操作,2440中gpio寄存器有:

GPxCON——选择引脚功能(输入、输出、保留等)

GPxDAT——用来读写引脚

GPcUP ——某一位是1时,相应的引脚无内部上拉电阻;为0时,有内部上拉电阻

3.原理图

LED:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

按键:

0818b9ca8b590ca3270a3433284dd417.png

4.实验代码:

>>使用汇编语言实现点灯:

led_on.S

.text

.global _start

_start:

LDR R0, =0x56000050 //GPFCON寄存器地址

MOV R1, #0x00001500 //见技术手册相应的配置,一般01为输出引脚

STR R1, [R0] //设置为输出

LDR R0, =0x56000054 //GPFDAT寄存器

MOV R1, #0x00000000

STR R1, [R0] //往GPFDAT寄存器写值

MAIN_LOOP:

B MAIN_LOOP //循环等待Makefile:

led_on.bin:led_on.S

arm-linux-gcc -g -c led_on.S -o led_on.o

arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf //-Ttext表示设置连接地址

arm-linux-objcopy -O binary -S led_on_elf led_on.bin //把elf文件转换为.bin文件

clean:

rm -rf *.bin *.o *elf

>>使用C语言实现点灯

使用c语言来写,需要一个启动文件,可以用来关闭看门口,设置堆栈等。

crt0.S

.text

.global _begin

_begin:

LDR R0, =0x53000000 //看门狗寄存器地址

MOV R1, #0x00000000 //写0禁止看门狗

STR R1, [R0]

LDR SP, =1024*4 //设置堆栈,注意不能大于4K,因为现在可用的SRAM空间只有4K

BL main //调用main函数,最后注意,汇编语言大小写无所谓的

_LOOP:

B _LOOP

led_on_c.c

#define GPFCON *(volatile unsigned long *)0x56000050

#define GPFDAT *(volatile unsigned long *)0x56000054

int main()

{

GPFCON=0x00001500;//简单的配置为输出

GPFDAT=0x00000000;//简单的输出0,通过上面的原理图可知,相应的led会亮

return 0;

}

Makefile

led_on_c.bin : crt0.S led_on_c.c

arm-linux-gcc -g -c -o crt0.o crt0.S

arm-linux-gcc -g -c -o led_on_c.o led_on_c.c

arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elf

arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin

arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis //把elf文件转换为反汇编文件

clean:

rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

>>使用按键+c语言实现点灯

看上面的原理图,原理就是把按键的引脚配置为输入引脚,以读取引脚的状态;

但按键被按下时,引脚读到的是低电平;当按键松开时,读取到高电平;

crt0.S同上;

key_led.c

/*

GPF4 GPF5 GPF6 --led

GPF0 GPF2 GPG3 --key

*/

#define GPFCON (*(volatile unsigned long *)0x56000050)

#define GPFDAT (*(volatile unsigned long *)0x56000054)

#define GPGCON (*(volatile unsigned long *)0x56000060)

#define GPGDAT (*(volatile unsigned long *)0x56000064)

#define GPF4_out (1<

#define GPF5_out (1<

#define GPF6_out (1<

#define GPF4_msk (3<

#define GPF5_msk (3<

#define GPF6_msk (3<

#define GPF0_in (0<

#define GPF2_in (0<

#define GPG3_in (0<

#define GPF0_msk (3<

#define GPF2_msk (3<

#define GPG3_msk (3<

int main()

{

unsigned long dwDat;

//1 output pin

GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);

GPFCON |= (GPF4_out | GPF5_out | GPF6_out);

//input pin

GPFCON &= ~(GPF0_msk | GPF2_msk);

GPFCON |= (GPF0_in | GPF2_in);

GPGCON &= ~GPG3_msk;

GPGCON |= GPG3_in;

while(1)

{

dwDat = GPFDAT;

if(dwDat & (1<<0))

GPFDAT |= (1<<4);

else

GPFDAT &= ~(1<<4);//light

if(dwDat & (1<<2))

GPFDAT |= (1<<5);

else

GPFDAT &= ~(1<<5);

dwDat = GPGDAT;

if(dwDat & (1<<3))

GPFDAT |= (1<<6);

else

GPFDAT &= ~(1<<6);

}

return 0;

}

Makefile相应的修改即可;

上面的程序编译都会得到bin文件,我们把它烧录进nand flash中即可,烧录可以使用工具,也可以通过固化在nor flash中的Uboot来烧录,方法很多,烧录后,上电,2440CPU会自动把nand flash前4k的内容,拷贝到2440片内4k的SRAM中运行,这块内存俗称stepping stone区。

注:原创文章,转载请注明出处:http://blog.csdn.net/scottly1/article/details/38960309

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值