打印

学习嵌入式的最佳路线ARM7—汇编(转)

[复制链接]
1441|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huzixian|  楼主 | 2011-3-2 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学习嵌入式的最佳路线ARM7—汇编  本章将通过一个实例来训练汇编,及C与汇编,汇编与C互相调用。
  实例内容:在lpc2114开发板上用汇编实现LED灯闪烁功能。
  8.1   C内嵌汇编
  /*
  *文件名:Led_C_Asm.c
  *功能:通过内嵌汇编实现延时,IO初始化,led控制
  *作者:parson
  *创建日期:2010-04-28
  *版本:Ver10.04
  *版权:ShangHai Somy Technology LTD.
  */
  #include  "config.h"
  #define LED   1 << 0                     //led所在位置p0.0
  #define LED_PINSEL  0x0 << 0             //选择GPIO
  #define LED_PINSLE_MASK  0x3 << 0       //占PINSEL0[1:0]两个位
  /*******************************************************************************
  *函数名delay
  *功能:延时
  *参数 time:要延时的时间
  *返回值:无
  ********************************************************************************/
  void delay(int time)
  {
  __asm
  {
  LOOP1:
  MOV R1,#50000
  LOOP2:
  SUBS R1,R1,#1
  BNE LOOP2
  SUBS R0,R0,#1
  BNE LOOP1
  }
  /*
  int i,j;
  for(i=0;i<time;i++)
  for(j=0;j<5000;j++);
  */
  }
  /*******************************************************************************
  *函数名led_on
  *功能:实现led亮
  *参数 :无
  *返回值:无
  ********************************************************************************/
  void led_on(void)
  {
  __asm
  {
  MOV R2,#LED
  STR R2,[0xE002800C]
  }
  /*
  IO0CLR  = LED;
  */
  }
  /*******************************************************************************
  *函数名led_off
  *功能:实现led灭
  *参数:无
  *返回值:无
  ********************************************************************************/
  void led_off(void)
  {
  __asm{
  MOV  R2,#LED
  STR R2,[0xE0028004]
  }
  /*
  IO0SET  = LED;
  */
  }
  /*******************************************************************************
  *函数名init_system
  *功能:初始化IO,并使led初始状态为亮
  *参数 time:要延时的时间
  *返回值:无
  ********************************************************************************/
  void init_system()
  {
  __asm
  {
  LDR R1,[0xE002C004]
  MVN R2,#LED_PINSLE_MASK
  AND R3,R1,R2
  ORR R3,R3,#LED_PINSEL
  STR R3,[0xE002C004]  
  MOV R2,#LED
  STR R2,[0xE0028008]  
  MOV R2,#LED
  STR R2,[0xE002800C]
  }
  /*
  PINSEL0 = PINSEL0 & (~LED_PINSLE_MASK) | LED_PINSEL;
  IO0DIR  = LED;
  IO0CLR  = LED;
  */
  }
  /*******************************************************************************
  *函数名main
  *功能:通过一个while语句实现led的轮流闪烁功能
  *参数:无
  *返回值:0(int类型)
  ********************************************************************************/
  int main (void)
  {
  init_system();
  while(1)
  {
  led_on();
  delay(10);
  led_off();
  delay(10);
  }
  return 0;
  }
  8.2   C调用汇编0
  8.2.1  汇编部分
  ;*******************************************************************************
  ;文件名:LedPlay.s
  ;功能:通过调用汇编函数实现延时,IO初始化,led控制
  ;作者:xiajiashan
  ;创建日期:2010-04-28
  ;版本:Ver10.04
  ;版权:ShangHai Somy Technology LTD.
  ;*********************************************************************************
  LED         EQU   0x1                     ;led所在位置p0.0
  LED_PINSEL     EQU  0x00                  ;选择GPIO
  LED_PINSLE_MASK EQU    0x3              ;占PINSEL0[1:0]两个位
  PINSEL1      EQU   0xE002C004
  IO0CLR       EQU   0xE002800C
  IO0SET       EQU   0xE0028004
  IO0DIR       EQU   0xE0028008
  EXPORT init_system
  EXPORT led_on
  EXPORT delay
  EXPORT led_off   
  AREA    LEDDELAY,CODE,READONLY
  ENTRY
  CODE32
  init_system
  MOV R4,LR
  LDR R1,=PINSEL1
  MVN R2,#LED_PINSLE_MASK
  AND R3,R1,R2
  ORR R3,R3,#LED_PINSEL
  STR R3,[R1]
  LDR R1,=IO0DIR
  MOV R2,#LED
  STR R2,[R1]
  LDR R1,=IO0CLR
  MOV R2,#LED
  STR R2,[R1]
  MOV PC,R4
  led_on
  MOV R4,LR
  LDR R1,=IO0CLR
  LDR R2,=LED
  STR R2,[R1]
  MOV PC,R4
  led_off
  MOV R4,LR
  LDR R1,=IO0SET
  LDR R2,=LED
  STR R2,[R1]
  MOV PC,R4
  delay
  MOV R4,LR
  LOOP1
  MOV R1,#0xc000
  LOOP2
  SUBS R1,R1,#1
  BNE LOOP2
  SUBS R0,R0,#1
  BNE LOOP1
  MOV PC,R4
  END
  8.2.2  C语言部分
  /*
  *文件名:Led_C_Asm.c
  *功能:通过调用汇编函数实现延时,IO初始化,led控制
  *作者:parson
  *创建日期:2010-04-28
  *版本:Ver10.04
  *版权:ShangHai Sincere Technology LTD.
  */
  #include  "config.h"
  extern void init_system(void);
  extern void led_on(void);
  extern void delay(int time);
  extern void led_off(void);
  /*******************************************************************************
  *函数名main
  *功能:通过一个while语句实现led的轮流闪烁功能
  *参数:无
  *返回值:0(int类型)
  ********************************************************************************/
  int main (void)
  {
  init_system();
  while(1)
  {
  led_on();
  delay(10);
  led_off();
  delay(10);
  }
  return 0;
  }
系统分类: 嵌入式系统   |   用户分类: 无分类   |   来源: 原创

相关帖子

沙发
yoyowodeai| | 2011-3-2 22:08 | 只看该作者
拿回去好好分析去!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

1534

帖子

2

粉丝