;================================================
;文件名称:thumb_arm.s
;摘 要:GEC2440开发板,点亮LED灯,相关LED1接GPB5
;当前版本:1.0
;作 者:tzf
;完成日期:2012-6
;================================================
;GPIO寄存器宏定义
GPBCON EQU 0x56000010
GPBDAT EQU 0x56000014
GPBUP EQU 0x56000018
EXPORT THUMBTEST
AREA LEDTESTASM, CODE, READONLY ;该伪指令定义了一个代码段,段名为LEDTESTASM
CODE32 ;32位
ENTRY ;入口
THUMBTEST
;设置GPB5为输出 00:input 01:output
ldr r0, =GPBCON
ldr r1, [r0]
bic r1, r1, #0x0C00 ;b00 0000 0000 1100 0000 0000 0x0C00 0x2000 0xC000 0x20000
orr r1, r1, #0x400 ;b00 0000 0000 0100 0000 0000
str r1, [r0]
;禁止GPB5端口的上拉电阻 0:上拉使能 1:禁止上拉
ldr r0, =GPBUP
ldr r1, [r0]
orr r1, r1, #0x20 ;b000 0010 0000
str r1, [r0]
;looptest
;将数据端口B的数据寄存器的地址赋给寄存器r2
ldr r2, =GPBDAT
led_on
ldr r3, [r2]
bic r3, r3, #0x20 ;b00 0010 0000 -> b11 1101 1111
orr r3, r3, #0x0 ;b00 0000 0000 -> b11 1101 1111
str r3, [r2] ; GPB5输出1
ldr r0, =0x2fffff
adr r4, delay1+1
bx r4 ;调用延时子程序
led_off
ldr r3, [r2]
bic r3, r3, #0x20 ;b00 0010 0000 -> b11 1101 1111 0x2 0x4 0x8 0xA
orr r3, r3, #0x20 ;b00 0010 0000 -> b11 1111 1111
str r3, [r2] ; GPB5输出0
ldr r0, =0x2fffff
adr r4, delay2+1
bx r4 ;调用延时子程序
; b looptest ;实现死循环while(1)
;进入Thumb模式
AREA LEDTESTASM, CODE, READONLY ;该伪指令定义了一个代码段,段名为LEDTESTASM
CODE16 ;16位
delay1
sub r0, r0, #0x1 ;r0 = r0 - 1
cmp r0, #0x0 ;将r0的值与0相比较
bne delay1 ;比较的结果不为0(r0不为0), 继续调用delay1,否则执行下一条语句
ldr r1, =led_off
;bx lr ;BX LR来完成子程序返回
bx r1
delay2
sub r0, r0, #0x1 ;r0 = r0 - 1
cmp r0, #0x0 ;将r0的值与0相比较
bne delay2 ;比较的结果不为0(r0不为0), 继续调用delay2,否则执行下一条语句
ldr r1, =led_on
;bx lr ;BX LR来完成子程序返回
bx r1
END ;程序结束符