Gpio实验
一 用汇编点亮一个led
1 看原理图 GPK4=0 ,led亮 GPK4=1,led灭
2 怎么让GPK4输出高低电平 (看芯片手册,操作寄存器实现)
配置功能:输入/输出/其他
设置其输出高/低电平
3 查看用户手册
GPK4[19:16]
0000 = Input 0001 = Output
0010 = Host I/F DATA[4] 0011 = HSI TX READY
0100 = Reserved 0101 = DATA_CF[4]
0110 = Reserved 0111 = Reserved
GPKDAT 在第4位写写0就对应GPK4
GPK[15:0] [15:0]
When the port is configured as input port, the correspondingbit is the pin state.
When the port is configured as output port, the pin state isthe same as the
corresponding bit. When the port is configured as functionalpin, the undefined
value will be read.
Register Address R/W Description Reset Value
GPKCON0 0x7F008800 R/W PortK Configuration Register 0 0x22222222
GPKCON1 0x7F008804 R/W PortK Configuration Register 1 0x22222222
GPKDAT 0x7F008808 R/W Port K Data Register Undefined
GPKPUD 0x7F00880C R/W Port K Pull-up/downRegister 0x55555555
协处理器
查看arm11芯片手册:
Cpu 访问的地址:内存0-0x6fff ffff
外设0x7000 0000-0x7fff ffff
c15 0 c2 4 Peripheral Port Memory
Remap
R/W, B, X R/W 0x00000000 page3-174
CRn Op1 CRm Op2 Register oroperation S type
NS
type
Reset
value
Page
b10011 = 256MB
For example:
MRC p15, 0, <Rd>, c15, c2,4 ; Read Peripheral Port Memory Remap Register
MCR p15, 0, <Rd>, c15, c2,4 ; Write Peripheral Port Memory Remap Register
查看6410用户手册
Register Address R/W Description Reset Value
WTCON 0x7E004000 R/W Watchdogtimer control register 0x8021
示例代码如下:
start.S文件
.globl _start
_start:
/*硬件的相关设置:把外设的基地址告诉cpu*/
ldr r0,=0x70000000 @伪汇编指令
orrr0,r0,#0x13 @按位逻辑或操作
mcrp15,0,r0,c15,c2,4 @b10011 = 256MB ,arm寄存器到协处理寄存器的数据传输
/*关闭看门狗*/
/*往往WTCON(0x7E004000)写0*/
ldrr0,=0x7E004000 @字数据读取指令
mov r1,#0 @数据传送指令
strr1,[r0] @将寄存器中数据写入到内存单元
/*设置GPKCON GPK4作为输出引脚*/
ldr r1,=0x7F008800 @gpkcon的地址
movr0,#0x10000000 @设为输出引角
strr0,[r1] @将寄存器数据写入到内存单元
/*设置GPKDAT让GPK4输出0*/
ldr r1,=0x7F008808 @gpkdat的地址
mov r0,#0
str r0,[r1]
halt:
b halt
Makefile文件
1 Windows下的makefile文件
all : led.bin
led.bin:start.o
arm-elf-ld -Ttext 0 -o led.elf start.o
arm-elf-objcopy -O binary led.elf led.bin
arm-elf-objdump -D led.elf > led.dis
start.o :start.S
arm-elf-gcc -o start.o start.S -c
clean:
rm *.o led.elf led.bin led.dis
2 Linux下的makefile文件
led.bin: start.o
@-Ttext 0 表示代码段的地址为0
@nandFlash前4k数据会放到sram中,cpu从0地址开始读取
arm-linux-ld-Ttext 0 -o led.elf start.o
@输出二进制文件
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led.dis
start.o : start.S
arm-linux