今天写了一下这个代码:
;控制4个LED的亮灭
;寄存器地址
rGPFCON equ 0x56000050
rGPFDAT equ 0x56000054
rGPFUP equ 0x56000058
;常量定义
ledONDATA equ 0xfffffeff
ledOFFDATA equ 0xf0
delayCOUNT equ 0x2ffff
;LED个数
numLED equ 0x4
AREA led_on,CODE,READONLY
CODE32
ENTRY
start
mov sp,#0x0c700000 ;定义堆栈指针
ldr r0,=rGPFCON ;GPFCON
mov r1,#0x5500 ;GPF4~GPF7 out
str r1,[r0] ;GPF4~GPF7设置为输出
ldr r0,=rGPFUP ;GPFUP
ldr r1,=0xffff
str r1,[r0] ;禁止内部上拉
main_loop
ldr r0,=rGPFDAT ;GPFDAT
mov r4,#numLED ;装入LED个数作为循环次数
led_loop
ldr r1,=ledONDATA ;装入LED控制值
mov r1,r1,ror r4 ;循环显示
bl ledon
ldr r3,=delayCOUNT
bl delay
sub r4,r4,#1
cmp r4,#0x0
bne led_loop
ldr r1,=ledOFFDATA
bl ledoff ;全灭
ldr r3,=delayCOUNT
bl delay
b main_loop
;入口参数:
; r0:GPFDAT地址
; r1:LED亮控制值
ledon
ldr r2,[r0] ;读出GPFDAT当前值
and r2,r2,r1 ;进行LED亮控制
str r2,[r0] ;写入GPFDAT
mov pc,lr
;入口参数:
; r0:GPFDAT地址
; r1:LED灭控制值
ledoff
ldr r2,[r0] ;读出GPFDAT当前值
orr r2,r2,r1
str r2,[r0] ;写入GPFDAT
mov pc,lr
;入口参数
; r3:延时常数
delay
sub r3,r3,#1 ;r0=r0-1
cmp r3,#0x0 ;将r0的值与0相比较
bne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句
mov pc,lr ;返回
end
-----------------------------------------------------------------------------------------------------------------------------------------------
对于其他的开发板,可能设计的控制LED的GPIO不同,仅需修改相应的部分即可。
;控制4个LED的亮灭
;寄存器地址
rGPFCON equ 0x56000050
rGPFDAT equ 0x56000054
rGPFUP equ 0x56000058
;常量定义
ledONDATA equ 0xfffffeff
ledOFFDATA equ 0xf0
delayCOUNT equ 0x2ffff
;LED个数
numLED equ 0x4
AREA led_on,CODE,READONLY
CODE32
ENTRY
start
mov sp,#0x0c700000 ;定义堆栈指针
ldr r0,=rGPFCON ;GPFCON
mov r1,#0x5500 ;GPF4~GPF7 out
str r1,[r0] ;GPF4~GPF7设置为输出
ldr r0,=rGPFUP ;GPFUP
ldr r1,=0xffff
str r1,[r0] ;禁止内部上拉
main_loop
ldr r0,=rGPFDAT ;GPFDAT
mov r4,#numLED ;装入LED个数作为循环次数
led_loop
ldr r1,=ledONDATA ;装入LED控制值
mov r1,r1,ror r4 ;循环显示
bl ledon
ldr r3,=delayCOUNT
bl delay
sub r4,r4,#1
cmp r4,#0x0
bne led_loop
ldr r1,=ledOFFDATA
bl ledoff ;全灭
ldr r3,=delayCOUNT
bl delay
b main_loop
;入口参数:
; r0:GPFDAT地址
; r1:LED亮控制值
ledon
ldr r2,[r0] ;读出GPFDAT当前值
and r2,r2,r1 ;进行LED亮控制
str r2,[r0] ;写入GPFDAT
mov pc,lr
;入口参数:
; r0:GPFDAT地址
; r1:LED灭控制值
ledoff
ldr r2,[r0] ;读出GPFDAT当前值
orr r2,r2,r1
str r2,[r0] ;写入GPFDAT
mov pc,lr
;入口参数
; r3:延时常数
delay
sub r3,r3,#1 ;r0=r0-1
cmp r3,#0x0 ;将r0的值与0相比较
bne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句
mov pc,lr ;返回
end
-----------------------------------------------------------------------------------------------------------------------------------------------
对于其他的开发板,可能设计的控制LED的GPIO不同,仅需修改相应的部分即可。