裸板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

转载于:https://www.cnblogs.com/huoxuhui/archive/2013/04/25/3043717.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值