裸板arm11流水灯的实现(纯C和纯汇编)

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

posted @ 2013-04-25 22:43  生活の艺术  阅读(321)  评论(0编辑  收藏  举报