2.点亮一盏LED(Thumb和ARM语言实现)
2012-06-07 19:37
225 查看
;================================================
;文件名称: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
4000
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 ;程序结束符
;文件名称: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
4000
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 ;程序结束符
相关文章推荐
- 1.点亮一盏LED(ARM汇编实现)
- 用I2C通信实现点亮一盏小灯(包含应答)---汇编语言
- 一步步点亮LED5_汇编编写延时函数并实现LED闪烁效果
- Tiny4412使用汇编点亮LED,实现流水灯效果
- MINI2440 LED驱动的汇编语言实现
- gcc编译编写ARM最简单的c程序_S3C2440点亮LED
- [ARM]第01次作业_建立Keil工程__点亮LED灯
- 我的第一个GPIO实验,点亮一盏LED
- ARM+Linux驱动----点亮开发板的LED
- Esp8266的 物联网又一股清流,8266接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。
- Esp8266进阶之路10 【小实战下篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)
- 【iCore1S 双核心板_ARM】例程七:通用定时器实验——定时点亮LED
- [ARM]第01次作业_建立Keil工程__点亮LED灯
- ARM嵌入式编程(无操作系统、基于MDK)之最简单的程序:点亮一个LED灯
- ARM学习篇一 点亮LED
- linux一个led点亮功能的实现流程
- arm wince 如何点亮ep9315的两个led灯
- 关于ok6410的c语言环境初始化,以及点亮led程序
- micropython之动手搭建自己的MQTT服务器并实现通信(点亮led)
- winCE点亮一盏LED