ARM嵌入式设计实验Word文件下载.docx

上传人:b****6 文档编号:17626249 上传时间:2022-12-07 格式:DOCX 页数:21 大小:20.91KB
下载 相关 举报
ARM嵌入式设计实验Word文件下载.docx_第1页
第1页 / 共21页
ARM嵌入式设计实验Word文件下载.docx_第2页
第2页 / 共21页
ARM嵌入式设计实验Word文件下载.docx_第3页
第3页 / 共21页
ARM嵌入式设计实验Word文件下载.docx_第4页
第4页 / 共21页
ARM嵌入式设计实验Word文件下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

ARM嵌入式设计实验Word文件下载.docx

《ARM嵌入式设计实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《ARM嵌入式设计实验Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。

ARM嵌入式设计实验Word文件下载.docx

END

汇编指令实验二

;

文件名:

TEST4.S

功能:

计算X的n次方的值

说明:

X和n均为无符号整数

XEQU9;

定义X的值为9

nEQU8;

定义n的值为8

AREAExample4,CODE,READONLY;

声明代码段Example4

ENTRY;

CODE32;

STARTLDRSP,=0x40003F00;

设置堆栈(满递减堆栈,使用STMFD/LMDFD指令)

LDRR0,=X

LDRR1,=n

BLPOW;

调用子程序POW,返回值为R0

HALTBHALT

名称:

POW

整数乘方运算。

入口参数:

R0底数

R1指数

出口参数:

R0运算结果

占用资源:

R0、R1

本子程序不考虑溢出问题

POW

STMFDSP!

{R1-R12,LR};

寄存器入栈保护

MOVSR2,R1;

将指数值复制到R2,并影响条件码标志

MOVEQR0,#1;

若指数为0,则设置R0=1

BEQPOW_END;

若指数为0,则返回

CMPR2,#1

BEQPOW_END;

若指数为1,则返回。

(此时R0没有被更改)

MOVR1,R0;

设置DO_MUL子程序的入口参数R0和R1

SUBR2,R2,#1;

计数器R2=指数值减1

POW_L1BLDO_MUL;

调用DO_MUL子程序,R0=R1*R0

SUBSR2,R2,#1;

每循环一次,计数器R2减1

BNEPOW_L1;

若计数器R2不为0,跳转到POW_L1

POW_ENDLDMFDSP!

{R1-R12,PC};

寄存器出栈,返回

 

DO_MUL

32位乘法运算。

R0乘数

R1被乘数

R0计算结果

本子程序不会破坏R1

DO_MULMULR0,R1,R0;

R0=R1*R0

MOVPC,LR;

返回

工程模板应用试验

(1)

Startup.s程序:

起动文件。

初始化C程序的运行环境,然后进入C程序代码。

IMPORT|Image$$RO$$Limit|

IMPORT|Image$$RW$$Base|

IMPORT|Image$$ZI$$Base|

IMPORT|Image$$ZI$$Limit|

IMPORTMain;

声明C程序中的Main()函数

AREAStart,CODE,READONLY;

声明代码段Start

ENTRY;

CODE32;

声明32位ARM指令

ResetLDRSP,=0x40003F00

;

初始化C程序的运行环境

LDRR0,=|Image$$RO$$Limit|

LDRR1,=|Image$$RW$$Base|

LDRR3,=|Image$$ZI$$Base|

CMPR0,R1

BEQLOOP1

LOOP0CMPR1,R3

LDRCCR2,[R0],#4

STRCCR2,[R1],#4

BCCLOOP0

LOOP1LDRR1,=|Image$$ZI$$Limit|

MOVR2,#0

LOOP2CMPR3,R1

STRCCR2,[R3],#4

BCCLOOP2

BMain;

跳转到C程序代码Main()函数

END

TEST.C程序:

#defineuint8unsignedchar

#defineuint32unsignedint

#defineN100

uint32sum;

//使用加法运算来计算1+2+3+...+(N-1)+N的值。

(N>

0)

voidMain(void)

{uint32i;

sum=0;

for(i=0;

i<

=N;

i++)

{sum+=i;

}

while

(1);

}

(2)

ADD.S程序:

加法函数,原型为uint32Add(uint32x,uint32y)。

EXPORTAdd

AREAAddC,CODE,READONLY;

声明代码段AddC

AddADDR0,R0,R1;

输入参数x为R0,y为R1

MOVPC,LR;

返回值为R0

externuint32Add(uint32x,uint32y);

//调用汇编程序Add实现加法运算

{sum=Add(555,168);

GPIO输出控制实验

/*******************************************************************

*文件名:

main.c

*功能:

LED显示控制。

*通过GPIO直接控制8个LED产生流水灯效果

*说明:

将跳线JP23全部短接,JP15跳线全部断开。

*这个警告可忽略,C2892E:

signedconstantoverflow

********************************************************************/

#include"

config.h"

#defineLED11<

<

16//P2.16

#defineLED21<

17//P2.17

#defineLED31<

18//P2.18

#defineLED41<

19//P2.19

#defineLED51<

20//P2.20

#defineLED61<

21//P2.21

#defineLED71<

22//P2.22

#defineLED81<

23//P2.23

#defineLEDCON0x00ff0000

constuint32DISP_TAB[8]={0xff01ffff,0xff02ffff,0xff04ffff,0xff08ffff,

0xff10ffff,0xff20ffff,0xff40ffff,0xff80ffff};

/********************************************************************

*名称:

DelayNS()

长软件延时

*入口参数:

dly延时参数,值越大,延时越久

*出口参数:

voidDelayNS(uint32dly)

for(;

dly>

0;

dly--)

{

5000;

i++);

main()

根据表DISP_TAB来控制LED显示。

intmain(void)

{uint8i;

/*PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰*/

IO2DIR=LEDCON;

//配置LED控制I/O方向

while

(1)

{

8;

IO2CLR=DISP_TAB[i];

//输出LED显示数据

DelayNS(10);

//延时

IO2SET=0xffffffff;

}

return(0);

步进电机实验

*通过GPIO控制步进电机

将跳线JP14和JP19全部短接。

#defineMOTOA1<

24//P2.24

#defineMOTOB1<

25//P2.25

#defineMOTOC1<

26//P2.26

#defineMOTOD1<

27//P2.27

#defineLEDCON0x00ff0000//LED控制字

#defineMOTOCON0x0f000000//MOTO控制字

#defineGPIOSET(PIN)IO2SET=PIN//方便修改置位端口

#defineGPIOCLR(PIN)IO2CLR=PIN//方便修改清位端口

voidDelayNS(uint32dly);

voidMOTO_Mode1(uint8i);

//A-B-C-D

voidMOTO_Mode2(uint8i);

//AB-BC-CD-DA-AB

voidMOTO_Mode3(uint8i);

//A-AB-B-BC-C-CD-D-DA-A

{

IO2DIR=LEDCON|MOTOCON;

//配置LED控制I/O方向

MOTO_Mode1(10);

//MOTO_Mode2(10);

//MOTO_Mode3(10);

MOTO_Mode1()

单四拍程序

uint8i延时参数,值越大,延时越久

voidMOTO_Mode1(uint8i)//A-B-C-D

{

while

(1)

GPIOCLR(LED1);

//点亮LED1,方便监视程序状态

/*A*/

GPIOSET(MOTOA);

DelayNS(i);

GPIOCLR(MOTOA);

/*B*/

GPIOSET(MOTOB);

GPIOCLR(MOTOB);

/*C*/

GPIOSET(MOTOC);

GPIOCLR(MOTOC);

GPIOSET(LED1);

//熄灭LED1,方便监视程序状态

/*D*/

GPIOSET(MOTOD);

GPIOCLR(MOTOD);

MOTO_Mode2()

双四拍程序

voidMOTO_Mode2(uint8i)//AB-BC-CD-DA-AB

{

/*AB*/

/*BC*/

/*CD*/

/*DA*/

MOTO_Mode3()

单双八拍程序

voidMOTO_Mode3(uint8i)//A-AB-B-BC-C-CD-D-DA-A

外部中断实验

使用外部中断3进行B1的控制,每当有一次中断时,即取反B1控制口,

*使用非向量中断方式。

将跳线器JP9、JP22短接,JP20断开。

按下KEY1观察BUZZER效果。

#defineBEEPCON1<

7//P0.7引脚控制B1,低电平蜂鸣,1<

7等价于0x80

IRQ_Eint3()

外部中断EINT3服务函数,取反B1控制口。

void__irqIRQ_Eint3(void)

i=IO0SET;

//读取当前B1控制值

if((i&

BEEPCON)==0)//控制B1输出取反

IO0SET=BEEPCON;

else

IO0CLR=BEEPCON;

/*等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)*/

while((EXTINT&

1<

3)!

=0)

EXTINT=1<

3;

//清除EINT3中断标志,1<

3等价于0x08

VICVectAddr=0;

//向量中断结束

}

初始化

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1