Raspberry Pi OK04

实验目标

利用timer使ACT灯闪烁

背景补充

timer的相关地址与其功能

根据流程图我们可以知道,timer实际上是每隔1s钟自加1,直到与其比较的寄存器相同时结束。

代码分析

ldr r0,=100000
bl Wait

main.s文件中我们可以看到,这两句代码是通过r0设置等待时间,然后调用新函数实现timer的计时等待功能。

delay .req r2
mov delay,r0
push {lr}
bl GetTimeStamp

systemTimer.s中的Wait函数中,将r0传入的参数保存到r2中

.globl GetSystemTimerBase
GetSystemTimerBase:
ldr r0,=0x20003000
mov pc,lr

通过这个函数在r0中获取到timer的基地址,并使用lr返回。

ldrd r0,r1,[r2,#4]

在这里我们使用的计数器counter有8字节,但是实际上每个寄存器只有4字节大小,所以每个counter都需要2个寄存器,所以使用ldrd指令,一次可以向一个地址中加载两个寄存器的值,r1是高字节,r0是低字节,非常方便。

此时我们就可以通过loop函数进行逐次比较了。

结果展示

与上个实验现象相同