start.s文件
.align 2 //以2的n次方对齐
.text //代码段
.global _start //定义一个全局的标号
_start:
mov r0,#0x70000000 //外设开始的空间
orr r0,#0x13 //外设空间的大小
mcr p15,0,r0,c15,c2,4 //修改协处理器的值
mov sp,#0x2000 //确定栈顶地址
bl main //跳转到标号main
regs.h文件
#ifndef __REGS_H__
#define __REGS_H__
#define GPMCON (*(volatile unsigned int *)0x7F008820)
#define GPMDAT (*(volatile unsigned int *)0x7F008824)
#endif
main.c文件
#include "regs.h"
int main(void)
{
led_init();
for(i = 0; i < 4; i++)
{
led_on(i);
delay();
led_off();
}
return 0;
}
led.c文件
#include "regs.h"
void led_init(void)
{
GPMCON &= ~(0xffff);
GPMCON |= 0x1111;
GPMDAT |= 0xf;
}
void led1_on(int nu)
{
GPMDAT &= ~(1 << nu);
}
void led_off(void)
{
GPMDAT |= 0xf;
}
delay.c文件
void mysleep(void)
{
int i, j;
for(i = 0; i < 100; i++)
{
for(j = 0; j < 100; j++);
}
}
裸板上的延时是通过空语句占用处理器来完成的
纯汇编的流水灯
.align 2
.text
.global _start
_start:
mov r0,#0x70000000
orr r0,#0x13
mcr p15,0,r0,c15,c2,4
//关闭看门狗
ldr r0,=0x7E004000
mov r1,#0
str r1,[r0]
//init
ldr r0,=0x7F008820
ldr r1,=0x7F008824
ldr r2,[r0]
ldr r3,[r1]
ldr r4,=0xffff
bic r2,r4 //位清零
ldr r4,=0x1111
orr r2,r4
str r2,[r0]
mov r4,#0xf
orr r3,r4
str r3,[r1]
loop:
mov r5,#0
mov r6,#1
led:
mov r0,#0
ldr r3,[r1]
orr r3,r4
str r3,[r1]
cmp r5,#4 // 每次比较都会引起cpsr的改变
ldrlt r3,[r1]
movlt r7,r6,lsl r5
biclt r3,r7
strlt r3,[r1]
addlt r5,#1
blt delay
beq loop
delay:
cmp r0,#0x10000
addlt r0,#1
blt delay
b led