您的位置 首页 设计

s3c2440硬件篇之一:GPIO

S3C2440共有130个IO端口,共分为GPA,GPB,,GPJ对于这几组GPIO引脚,他们的寄存器是相似的:GPxCON:用于配置(configure),选择引脚的功

S3C2440共有130个I/O 端口,共分为GPA,GPB,…,GPJ.关于这几组GPIO引脚,他们的寄存器是类似的:

GPxCON:用于装备(configure),挑选引脚的功用。
GPxDAT:用于读/写数据。
GPxUP:确认是否运用内部上拉电阻。(没有GPAUP寄存器。)
PORTB~PORTJ在寄存器操作方面完全相同。GPxCON中每两位操控一根引脚:00表明输入,01表明输出,10表明特别功用,11保存不必。
一。运用汇编代码点亮一个LED。参照韦东山大哥的,上图是从韦大哥的书中截图的,而我的开发板对应的是GPF接口。仅此差异。
(1)led_on.S汇编代码。

@******************************************************************************
@ File:led_on.S
@ 功用:LED点灯程序,点亮LED1
@******************************************************************************

.text@伪代码指令,指定下面开端是代码段,
.global _start
_start:
LDR R0,=0x56000050 @ R0设为GPFCON寄存器。此寄存器
@ 用于挑选端口F各引脚的功用:.
@ 是输出、是输入、仍是其他
MOVR1,#0x00000001
STRR1,[R0] @ 设置GPF0为输出口,位[1:0]=0b01

LDR R0,=0x56000058 @ R0设为GPFUP寄存器。此寄存器
@ 用于挑选端口F使能制止上拉的功用:
MOVR1,#0x00000000
STRR1,[R0] @ 使能GPF0上拉

LDR R0,=0x56000054 @ R0设为GPFDAT寄存器。此寄存器
@ 用于读/写端口F各引脚的数据
MOVR1,#0x00000000 @ 此值改为0x00000001,
@ 可让LED1平息
STRR1,[R0] @ GPF0输出0,LED1点亮

MAIN_LOOP:
B MAIN_LOOP

(2)Makefile文件:

led_on.bin:led_on.S
arm-linux-gcc-g-c-o led_on.o led_on.S
arm-linux-ld-Ttext 0x0000000-g led_on.o-o led_on_elf
arm-linux-objcopy-O binary-S led_on_elf led_on.bin
clean:
rm-f led_on.bin led_on_elf*.o

其间:arm-linux-ld-Ttext 0x0000000-g led_on.o-o led_on_elf:指定了代码段的运转地址为0x0000_0000,并指定生成衔接文件led_on_elf,由于没有界说数据段和BSS段的开端地址,它们呗顺次放在代码段的后边。arm-linux-objcopy-O binary-S led_on_elf led_on.bin:由衔接文件出产可履行文件led_on.bin,下载进开发板即可观察到led1点亮了。

重要说明:玩单片机的时分咱们一般是把程序下载到单片机的自身带的flash中,而s3c2440不是这样的,咱们是把程序下载到它的外部存储器中,如Norflash或许NandFlash.只要s3c2440是不能运转的,它的最小体系包含了,SDRAM(即内存),FLASH(Nand或许Nor,即相当于硬盘)。咱们把程序下载到NandFlash中而不是CPU自身,那么当挑选从NandFlash发动CPU的时分(即OM0,OM1设置为00的时分)S3C2440会主动依据内部的硬件结构将NandFlash中的前4K代码复制到S3C2440的内部RAM中,此刻内部RAM的地址为0,程序将从0开端履行。

一。运用C言语点亮一个LED。
(1)crt0.S

@******************************************************************************
@ File:crt0.S
@ 功用:经过它转入C程序
@******************************************************************************

.text
.global _start
_start:
ldr r0,=0x56000010 @ WATCHDOG寄存器地址
movr1,#0x0
strr1,[r0]@ 写入0,制止WATCHDOG,不然CPU会不断重启

ldr sp,=1024*4 @ 设置仓库,留意:不能大于4k,由于现在可用的内存只要4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只要4K
blmain @ 调用C程序中的main函数
halt_loop:
b halt_loop

(2)len_on.c

#defineGPFCON(*(volatileunsignedlong*)0x56000050)
#defineGPFDAT(*(volatileunsignedlong*)0x56000054)
#defineGPFUP(*(volatileunsignedlong*)0x56000058)

intmain()
{
GPFCON=0x00000004;// 设置GPF1为输出口, 位[3:2]=0b01
GPFUP=0x0;//使能上拉
GPFDAT=0x00000000;// GPF1输出0,LED1点亮

return0;
}

(3)Makefile:

led_on.bin:crt0.S led_on.c
arm-linux-gcc-g-c-o crt0.o crt0.S
arm-linux-gcc-g-c-o led_on.o led_on.c
arm-linux-ld-Ttext 0x0000000-g crt0.o led_on.o-o led_on_elf
arm-linux-objcopy-O binary-S led_on_elf led_on.bin
arm-linux-objdump-D-m arm led_on_elf>led_on.dis
clean:
rm-f led_on.dis led_on.bin led_on_elf*.o

比较疑问的一点是crt0.S中blmain @ 调用C程序中的main函数,怎样完成的,我是这么了解的,arm-linux-ld衔接生成了led_on_elf文件,这是一个文件。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/263369.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部