用汇编点亮一个led
1看原理图GPK4=0,led亮GPK4=1,led灭
2怎么让GPK4输出高低电平(看芯片手册,操作寄存器实现)
配置功能:输入/输出/其他
设置其输出高/低电平
3查看芯片手册
GPK4[19:16]
0000=Input 0001=Output
0010=HostI/FDATA[4] 0011=HSITXREADY
0100=Reserved 0101=DATA_CF[4]
0110=Reserved 0111=Reserved
GPKDAT在第4位写写0就对应GPK4
GPK[15:0][15:0]
Whentheportisconfiguredasinputport,thecorrespondingbitisthepinstate.
Whentheportisconfiguredasoutputport,thepinstateisthesameasthe
correspondingbit.Whentheportisconfiguredasfunctionalpin,theundefined
valuewillberead.
RegisterAddressR/WDescriptionResetValue
GPKCON00x7F008800R/WPortKConfigurationRegister00x22222222
GPKCON10x7F008804R/WPortKConfigurationRegister10x22222222
GPKDAT0x7F008808R/WPortKDataRegisterUndefined
GPKPUD0x7F00880CR/WPortKPull-up/downRegister0x55555555
RegisterAddressR/WDescriptionResetValue
WTCON0x7E004000R/WWatchdogtimercontrolregister0x8021
示例代码如下:
start.S文件
..globl_start
_start:
/*硬件的相关设置:把外设的基地址告诉cpu*/
ldrr0,=0x70000000
orrr0,r0,#0x13
mcrp15,0,r0,c15,c2,4
/*关闭看门狗*/
ldrr0,=0x7E00400
movr1,#0
strr1,[r0]
/*设置GPKCONGPK4作为输出引脚*/
ldrr1,=0x7F008800
movr0,#0x1000
strr0,[r1]
/*设置GPKDAT让GPK4输出0*/
ldrr1,=0x7F008808
movr0,#0
strr0,[r1]
halt:
bhalt
Makefile文件
led.bin:start.o
arm-linux-ld-Ttext0-oled.elfstart.o
arm-linux-objcopy-Obinaryled.elfled.bin
arm-linux-objdump-Dled.elf>led.dis
start.o:start.S
arm-linux-gcc-ostart.ostart.S-c
clean:
rm*.oled.elfled.binled.dis
编译make
将led_on.bin烧写到nandflash中,如同烧写linux类似,将led_on.bin放到images目录下
修改friendlyARM.ini
Action=install
OS=UserBin
UserBin-Image=led_on.bin
点亮四个led灯,示例代码如下:
start.S文件
.globl_start
_start:
/*硬件相关设置*/
ldrr0,=0x70000000
orrr0,r0,#0x13
mcrp15,0,r0,c15,c2,4
/*关闭看门狗*/
ldrr0,=0x7e004000
movr1,#0
strr1,[r0]
/*设置GPKCONGPK4/5/6/7作为输出*/
ldrr1,=0x7F008800
ldrr0,=0x11110000
strr0,[r1]
/*设置GPKDAT让GPM4输出0*/
ldrr1,=0x7F0088080
movr0,#0
loop:
strr0,[r1]
addr0,r0,#1
cmpr0,#16
moveqr0,#0
bldelay
bloop
delay:
movr2,#0x10000000
delay_loop:
subr2,r2,#1
cmpr2,#0
bnedelay_loop
movpc,lr
halt:
bhalt
Makefile文件同上
用c语言来实现点灯
1硬件相关设置
2调用c函数
示例代码如下:
voiddelay(){
volatileinti=0x10000000;
while(i--);
}
intmain(){
inti=0;
volatileunsignedlong*gpkcon=(volatileunsignedlong*)0x7F008800;
volatileunsignedlong*gpkdat=(volatileunsignedlong*)0x7F008808;
*gpkcon=0x11110000;
while(1){
*gpkdat=i;
i++;
if(i==16)
i=0;
delay();
}
return0;
}
.globl_start
_start:
/*硬件相关设置*/
ldrr0,=0x70000000
orrr0,r0,#0x13
mcrp15,0,r0,c15,c2,4
/*关看门狗*/
ldrr0,=0x7E00400
movr1,#0
strr1,[r0]
/*设置栈*/
ldrsp,=8*1024
blmain
Halt:
Bhalt
led.bin:start.oled.o
arm-linux-ld-Ttext0-oled.elfstart.oled.o
arm-linux-objcopy-Obinaryled.elfled.bin
arm-linux-objdump-Dled.elf>led.dis
start.o:start.S
arm-linux-gcc-ostart.ostart.S-c
led.o:led.c
arm-linux-gcc-oled.oled.c-c
clean:
rm*.oled.elfled.binled.dis