学习嵌入式的最佳路线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;
}
系统分类: 嵌入式系统 | 用户分类: 无分类 | 来源: 原创 |