ARM课程设计报告.docx

上传人:b****4 文档编号:3388189 上传时间:2022-11-22 格式:DOCX 页数:29 大小:573.19KB
下载 相关 举报
ARM课程设计报告.docx_第1页
第1页 / 共29页
ARM课程设计报告.docx_第2页
第2页 / 共29页
ARM课程设计报告.docx_第3页
第3页 / 共29页
ARM课程设计报告.docx_第4页
第4页 / 共29页
ARM课程设计报告.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

ARM课程设计报告.docx

《ARM课程设计报告.docx》由会员分享,可在线阅读,更多相关《ARM课程设计报告.docx(29页珍藏版)》请在冰豆网上搜索。

ARM课程设计报告.docx

ARM课程设计报告

目录

一、设计目的………………………………………………3

 

二、设计原理

1、GPIO—流水灯……………………………………3

2、SPI…………………………………………………7

3、定时器………………………………………………10

4、实时时钟……………………………………………12

 

三、所用仪器…………………………………………………18

 

四、EasyARM2131开发套件功能介绍………………………18

 

五、设计内容:

万年历-定时器-流水灯-SPI

1、功能描述………………………………………………21

2、流程图…………………………………………………22

3、程序设计………………………………………………22

 

六、心得体会……………………………………………………28

 

七、参考文献……………………………………………………29

 

一、设计目的

1、根据要求,复习巩固ARM的基础知识。

2、掌握ARM系统的设计方法,特别是熟悉模块化的设计思想。

3、熟练掌握ARM软件和2131开发板的使用。

4、提高综合运用所学的理论知识独立分析和解决问题的能力;

二、设计原理

1、GPIO—流水灯

(1)LPC2131具有多达47个通用I/O口(GPIO,GeneralPurposeI/Oports),分别为P0[31:

0]、

P1[31:

16],其中,P0.24未用,P0.31仅为输出口。

由于口线与其它功能复用,因而需要进行相关的管脚连接模块(PINSEL0、PINSEL1、PINSEL2)选择连接GPIO,然后通过IODIR进行输入/输出属性设置后才能操作。

当管脚选择GPIO功能时,有IOSET、IOCLR和IOPIN3个寄存器用于控制GPIO的使用。

IOSET用于口线置位,而IOCLR则用于口线清零,IOPIN则反映当前IO口的状态,读回IOSET则反映当前IO口设定状态。

(2)GPIO的特性和应用

特性:

单个位的方向控制;

单独控制输出的置位和清零;

所有I/O口在复位后默认为输入。

应用:

通用I/O口

驱动LED或其它指示器

控制片外器件

检测数字输入

(3)GPIO引脚描述

GPIO管脚描述见表4.1。

表4.1GPIO管脚描述

管脚连接设置

将相应管脚的PINSELn位设置为00,即选择GPIO功能;大部分管脚复位后默认为GPIO。

3、GPIO寄存器

LPC2138有2个32位的通用I/O口。

PORT0使用了30个管脚,PORT1有多达16个管脚可用GPIO功能。

PORT0和PORT1由2组(4个)寄存器控制,如表4.2所示。

表4.2GPIO寄存器映射

4.GPIO输出实验——流水灯实验

EasyARM2131开发板上的8路LED(LED8~LED1)分别可选择P1[25:

18]进行控制,电路如图1所示。

图1

当跳线JP12全部选择LED8~LED1后,P1.25~P1.18分别控制这8路LED,就可以进行流水灯实验。

流水灯显示花样可以通过数组人为定义,亦可通过一定的算法计算,流程图如图2所示。

图2

流水灯程序:

/

#include"config.h"

/*LED8~LED18个LED分别由P1.25~P1.18控制*/

constuint32LEDS8=(0xFF<<18);//P1[25:

18]控制LED8~LED1,低电平点亮

/*

*********************************************************************************************************

**函数名称:

DelayNS()

**函数功能:

长软件延时

**入口参数:

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

**出口参数:

*********************************************************************************************************

*/

voidDelayNS(uint32dly)

{

uint32i;

for(;dly>0;dly--)

for(i=0;i<100000;i++);

}

/*

*********************************************************************************************************

**函数名称:

main()

**函数功能:

流水灯显示实验。

**调试说明:

连接跳线JP12至LED8~LED1。

*********************************************************************************************************

*/

/*流水灯花样,低电平点亮,注意调用时候用了取反操作*/

constuint32LED_TBL[]={

0x00,0xFF,//全部熄灭后,再全部点亮

0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依次逐个点亮

0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,//依次逐个叠加

0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,//依次逐个递减

0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两个靠拢后分开

0xA0,0x50,0x7e,0x28,0x14,0x0A,0x05,0x82,

0x81,0xC3,0xE7,0xFF,0xFF,0xE7,0xC3,0x81//从两边叠加后递减

};

intmain(void)

{

uint8i;

//PINSEL1=0x00000000;//设置管脚连接GPIO

PINSEL2=PINSEL2&(~0x08);//P1[25:

16]连接GPIO

IO1DIR=LEDS8;//设置LED1控制口为输出

while

(1)

{

for(i=0;i<42;i++)

{/*流水灯花样显示*/

IO1SET=~((LED_TBL[i])<<18);

DelayNS(20);

IO1CLR=((LED_TBL[i])<<18);

DelayNS(20);

}

}

return0;

}

2.SPI主机实验-7段数码管显示

实验使用LPC2131的SPI接口作为主机向74HC595发送数据,数据内容由7段数码管显示,同时SPI主机接收74HC595的移位输出数据,即接收回前一个显示数据。

实验硬件连接如图3所示

图3 SPI接口控制74HC595硬件连接图

图中已经将最高位输出(SQH)连接到LPC2131的SPI接口的MISO0,可用来读回74HC595移位输出的数据。

该实验演示在7段数码管上显示一些字符,字符的字模表存于一数组中,流程图如图4所示。

 图4 LED数码管显示实验流程图

SPI程序:

#include"config.h"

voidDelayNS(uint32dly)

{

uint32i;

for(;dly>0;dly--)

{

for(i=0;i<50000;i++);

}

}

voidSSP_Init(void)

{

SSPCR0=(0x01<<8)|//SCR设置SPI时钟分频

(0x00<<7)|//CPHA时钟输出相位,仅SPI模式有效

(0x01<<6)|//CPOL时钟输出极性,仅SPI模式有效

(0x00<<4)|//FRF帧格式00=SPI,01=SSI,10=Microwire,11=保留

(0x07<<0);//DSS数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位

SSPCR1=(0x00<<3)|//SOD从机输出禁能,1=禁止,0=允许

(0x00<<2)|//MS主从选择,0=主机,1=从机

(0x01<<1)|//SSESSP使能,1=允许SSP与其它设备通信

(0x00<<0);//LBM回写模式

SSPCPSR=0x52;//PCLK分频值

//SSPIMSC=0x07;//中断屏蔽寄存器

SSPICR=0x03;//中断清除寄存器

}

uint8SSP_SendData(uint8data)

{

//IOCLR=SLAVE_CS;//选择从机

SSPDR=data;

while((SSPSR&0x01)==0);//等待TFE置位,即发送FIFO空

//IOSET=SLAVE_CS;

return(SSPDR);

}

uint8constDISP_TAB[16]={

//0123456789

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,

//AbCdEF

0x88,0x83,0xC6,0xA1,0x86,0x8E};

volatileuint8rcv;

intmain(void)

{

uint8i;

PCONP|=1<<10;

//PINSEL1=0x000002A8;//设置SSP管脚连接

//PINSEL1=0xAA<<2;

PINSEL1=(PINSEL1&(~(0xFF<<2)))|(0xAA<<2);

//IO0DIR=SLAVE_CS;

//IO0SET=SLAVE_CS;

SSP_Init();//初始化SSP接口

while

(1)

{

for(i=0;i<16;i++)

{

rcv=SSP_SendData(DISP_TAB[i]);//发送显示数据

DelayNS(80);//延时

}

}

return(0);

}

3、定时器

(1)LPC2131具有2个32位可编程定时/计数器,均具有4路捕获、比较路匹配并输出电

路。

定时器对外设时钟(pclk)周期进行计数,可选择产生中断或根据4个匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低电平、翻转或者无动作)。

它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。

可用于对内部事件进行计数的间隔定时器,或者通过捕获输入实现脉宽调制,亦可作为

自由运行的定时器。

定时器0和定时器1除了外设基地址以外,其它都相同。

(2)定时器0定时实验——查询方式

用定时器0实验0.5秒定时,查询标志位等待定时时间到达,对蜂鸣器进行控制,让蜂鸣器每秒钟响一次。

程序在T0MR0中设定定时常数,在T0MCR中设置定时器0匹配后复位TC并产生中断标志,接下来程序查询等待中断标志置位。

若定时时间到,先清除Timer0中断标志,然后取反BEEP控制口的输出状态,流程图如图5所示。

图5定时器0定时实验流程图

定时器程序:

/

#include"config.h"

#defineBEEP1<<7/*P0.7控制蜂鸣器,低电平蜂鸣*/

/*

*********************************************************************************************************

**函数名称:

main()

**函数功能:

使用定时器实现0.5秒钟定时,控制蜂鸣器鸣叫。

**调试说明:

需要将跳线JP11连接BEEP。

*********************************************************************************************************

*/

intmain(void)

{

PINSEL1=0x00000000;/*设置管脚连接GPIO*/

IO0DIR=BEEP;/*设置BEEP控制口输出*/

/*定时器0初始化*/

T0TC=0;/*定时器设置为0*/

T0PR=0;/*时钟不分频*/

T0MCR=0x03;/*设置T0MR0匹配后复位T0TC,并产生中断标志*/

T0MR0=Fpclk/2;/*0.5秒钟定时*/

T0TCR=0x01;/*启动定时器*/

while

(1)

{

while((T0IR&0x01)==0);/*等待定时时间到*/

T0IR=0x01;/*清除中断标志*/

if((IO0SET&BEEP)==0)

IO0SET=BEEP;/*BEEP停止蜂鸣*/

else

IO0CLR=BEEP;/*BEEP蜂鸣*/

}

return0;

}

4、实时时钟

(1)实时时钟(RTC,RealTimeClock)提供一套计数器在系统上电和关闭操作时对时间进行测量,RTC消耗的功率非常低。

LPC2131的RTC时钟可由独立的32.768KHz振荡器或基于VPB时钟的可编程预分频器来提供。

另外,RTC还具有专用的电源管脚Vbat,可连接到电池或其它器件使用的相同的3.3V电压上。

要使RTC中断能够唤醒掉电的CPU,必须选择外部时钟源。

RTC功能结构图如图6所示:

图6RTC方框图

(2)LPC2131的实时时钟,可用来进行定时报警,日期及时分秒计时等等。

RTC具有独立的电源和时钟源,电源消耗很低,特别适合于电池供电,CPU不连续工作(掉电模式)的系统。

通过设置中断唤醒寄存器(INTWAKE),RTC中断还能将CPU从掉电模式下唤醒。

设置时钟控制寄存器(CCR)可以选择RTC的计数时钟,由独立的32.769KHz振荡器提供或将Fpclk进行分频得到。

当使用Fpclk作为时钟源时,它的基准时钟分频器允许调节任何频率高于65.536KHz的外设时钟源产生一个32.768KHz的基准时钟,实现准确计时操作。

RTC寄存器功能框图如图7所示:

图7RTC寄存器功能框图

(3)万年历显示实验

实验需要使用提供的EasyARM.exe软件。

程序读取RTC内部的时钟,送到上位机在EasyARM.exe的万年历终端上显示,流程图见图8

图8万年历显示实验流程图

万年历程序:

#include"config.h"

//定义串口模式设置的数据结构

typedefstructUartMode

{

uint8datab;//字长度5/6/7/8

uint8stopb;//停止位1/2

uint8parity;//奇偶校验0-无校验,1-奇校验,2-偶校验

}UARTMODE;

uint8UART0_Init(uint32baud,UARTMODEset)

{

uint32bak;

//参数过滤

if((0==baud)||(baud>115200))return(0);

if((set.datab<5)||(set.datab>8))return(0);

if((0==set.stopb)||(set.stopb>2))return(0);

if(set.parity>4)return(0);

//设置串口波特率

U0LCR=0x80;//DLAB=1

bak=(Fpclk>>4)/baud;

U0DLM=bak>>8;

U0DLL=bak&0xff;

//设置串口模式

bak=set.datab-5;

if(2==set.stopb)bak|=0x04;

if(0!

=set.parity)

{

set.parity=set.parity-1;

bak|=0x08;

}

bak|=set.parity<<4;

U0LCR=bak;

return(0);

}

voidSendByte(uint8data)

{

U0THR=data;

while((U0LSR&0X20)==0);//等待数据发送

}

voidPC_DispChar(uint8no,uint8chr)

{

SendByte(0xff);

SendByte(0x81);

SendByte(no);

SendByte(chr);

SendByte(0x00);

}

uint8constSHOWTABLE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

voidSendTimeRtc(void)

{

uint32datas;

uint32times;

uint32bak;

times=CTIME0;//读取完整的时钟寄存器

datas=CTIME1;

bak=(datas>>16)&0xfff;//获取年

PC_DispChar(0,SHOWTABLE[bak/1000]);

bak=bak%1000;

PC_DispChar(1,SHOWTABLE[bak/100]);

bak=bak%100;

PC_DispChar(2,SHOWTABLE[bak/10]);

PC_DispChar(3,SHOWTABLE[bak%10]);

bak=(datas>>8)&0x0f;//获取月

PC_DispChar(4,SHOWTABLE[bak/10]);

PC_DispChar(5,SHOWTABLE[bak%10]);

bak=datas&0x1f;//获取日

PC_DispChar(6,SHOWTABLE[bak/10]);

PC_DispChar(7,SHOWTABLE[bak%10]);

bak=(times>>24)&0x07;//获取星期

PC_DispChar(8,SHOWTABLE[bak]);

bak=(times>>16)&0x1f;//获取小时

PC_DispChar(9,SHOWTABLE[bak/10]);

PC_DispChar(10,SHOWTABLE[bak%10]);

bak=(times>>8)&0x3f;//获取分钟

PC_DispChar(11,SHOWTABLE[bak/10]);

PC_DispChar(12,SHOWTABLE[bak%10]);

bak=times&0x3f;//获取秒钟

PC_DispChar(13,SHOWTABLE[bak/10]);

PC_DispChar(14,SHOWTABLE[bak%10]);

}

voidRTCInit(void)

{

PREINT=Fpclk/32768-1;//设置基准时钟分频器

PREFRAC=Fpclk-(Fpclk/32768)*32768;

CCR=0x00;//禁止时间计数器

YEAR=2005;

MONTH=01;

DOM=10;

DOW=4;

HOUR=8;

MIN=30;

SEC=59;

CIIR=0x01;//设置秒值的增量产生1次中断

CCR=0x01;//启动RTC

}

intmain(void)

{

UARTMODEuart0_set;

PINSEL0=0x00000005;//连接IO到UART0

PINSEL1=0x00000000;

uart0_set.datab=8;

uart0_set.stopb=1;

uart0_set.parity=0;

UART0_Init(115200,uart0_set);

U0FCR=0x01;//FIFO使能

RTCInit();

while

(1)

{

while(0==(ILR&0x01));//等待RTC增量中断

ILR=0x01;//清除中断标志

SendTimeRtc();

}

return(0);

}

三、实验仪器

1、2138开发板2、ARM软件3、微型计算机

四、EasyARM2131开发套件功能介绍

定位

选用LPC213x系列ARM开发产品的工程师;

组建嵌入式系统教学与开发实验室;

有购买能力的个人。

概述

EasyARM2131开发板是广州周立功公司设计的EasyARM系列开发套件之一,采用了PHILIPS公司基于ARM7TDMI-S核、单电源供电、LQFP64封装的LPC2131,具有JTAG仿真调试、ISP编程等功能。

开发板上提供了一些键盘、LED、蜂鸣器等常用功能部件,还具有RS232接口电路、I2C存储器电路。

另外,用户也可以更换兼容的CPU进行仿真调试,如LPC2132、LPC2138、LPC2142等。

灵活的跳线组合(开发板内使用的所有I/O均可断开连接),还有用户I/O接口,极大地方便了用户进行

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

当前位置:首页 > 人文社科 > 法律资料

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

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