跑马灯ARM汇编
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开发工具:keil 4,ARM9 S3C2440
今天花了点时间来写了一个系统时钟设置的汇编程序,用led对时钟频率进行了测试,将四个led灯设置成跑马灯形式,本次是将HCLK、FCLK设置成100M,PCLK设置成50M,时钟频率比正常的低了四倍,用不同的延迟时间测试跑马灯,实际情况也是符合的,基本上就是4陪时间的关系:
WTCON EQU 0x53000000 ; 看门狗控制寄存器
LOCKTIME EQU 0X4C000000
PLLCON EQU 0X4C000004 ; 参数设置
CLKDIVN EQU 0x4c000014 ; 分频比寄存器
GPBCON EQU 0x56000010 ; LED控制寄存器
GPBDAT EQU 0x56000014 ; LED数据寄存器
DELAYVAL EQU 0xfff00 ; 延时数值如果用12M,则用0x8fff,如果用50M,则用0x8fff00
AREA SYSTEM_CLOCK, CODE, READONLY
CODE32
ENTRY
START
LDR R0,=WTCON ;关闭看门狗
MOV R1,0X0
STR R1,[R0]
CLOCK_INIT
LDR R0,=LOCKTIME ;设置锁频时间,取得LOCKTIME寄存器地址
LDR R1,=0X0000FFFF ;LOCKTIME寄存器设置数据
STR R1,[R0]
LDR R0,=PLLCON ;MPLL is 100MHz FCLK = 100MHz, HCLK = 100MHz, PCLK = 50MHz
LDR R1,=0X11011
STR R1,[R0]
LDR R0,=CLKDIVN ;取得CLKDIVN寄存器地址
LDR R1,=0X01 ;CLKDIVN寄存器设置数据
STR R1,[R0]
BL LED
LED
; 亮点Led函数
; Led初始化开始
ldr r0,=GPBCON ; 将LED控制寄存器地址放入r0
ldr r1,[r0] ; 将控制寄存器里的值读出放入r1
bic r1,r1,#0x3fc00 ; 将r1里的值(控制寄存器里的值)
; bit[10]~bit[17]清位,其它位不变
orr r1,r1,#0x15400 ; 设置控制寄存器
str r1,[r0] ; 将r1里的值写入控制寄存器
led_loop ; 循环点亮Led
ldr r2,=GPBDAT ; 将LED数据寄存器的地址放入r2
ldr r3,[r2] ; 将数据寄存器(r2)里的值放入r3
bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4
orr r3,r3,#0x1c0 ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led1)str r3,[r2] ; 将控制亮灯数据写入数据寄存器r2
ldr r0,=DELAYVAL ; 设置延迟数
bl delay ; 调用延迟子程序
ldr r3,[r2] ; 将数据寄存器(r2)里的值放入r3
bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4
orr r3,r3,#0x1a0 ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led2)str r3,[r2] ; 将控制亮灯数据写入数据寄存器r2
ldr r0,=DELAYVAL ; 设置延迟数
bl delay ; 调用延迟子程序
ldr r3,[r2] ; 将数据寄存器(r2)里的值放入r3
bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4
orr r3,r3,#0x160 ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led3)str r3,[r2] ; 将控制亮灯数据写入数据寄存器r2
ldr r0,=DELAYVAL ; 设置延迟数
bl delay ; 调用延迟子程序
ldr r3,[r2] ; 将数据寄存器(r2)里的值放入r3
bic r3,r3,#0x1e0 ; 清除bit[5]~bit[8],bit[n]代表led1~led4
orr r3,r3,#0xe0 ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led4)str r3,[r2] ; 将控制亮灯数据写入数据寄存器r2
ldr r0,=DELAYVAL ; 设置延迟数
bl delay ; 调用延迟子程序
bled_loop
delay
sub r0,r0,#1 ; r0=r0-1
cmp r0,#0x0 ; 将r0的值与0相比较
bne delay ; 比较的结果不为0,继续调用delay movpc,lr ; 返回
END。