ARM课程设计报告.docx
- 文档编号:3388189
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:29
- 大小:573.19KB
ARM课程设计报告.docx
《ARM课程设计报告.docx》由会员分享,可在线阅读,更多相关《ARM课程设计报告.docx(29页珍藏版)》请在冰豆网上搜索。
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接口,极大地方便了用户进行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 课程设计 报告