ARM课设.docx
《ARM课设.docx》由会员分享,可在线阅读,更多相关《ARM课设.docx(23页珍藏版)》请在冰豆网上搜索。
ARM课设
目录
目录1
第一章绪论2
1.1设计题目2
1.2设计目的2
1.3设计器材2
1.4任务分析2
第二章设计原理3
2.1设计原理简述3
2.2嵌入式操作系统的概述3
2.2.1嵌入式操作系统的特性3
2.2.2嵌入式操作系统的分类3
2.2.3嵌入式操作系统的特点4
第三章系统设计5
3.1系统需求分析5
3.1.1课程设计内容5
3.1.2课程设计要求5
3.2硬件设计5
3.2.1ARM处理器5
3.2.2ARM硬件结构6
3.3软件设计9
3.3.1启动Keil10
第四章系统代码13
第五章系统调试20
5.1硬件检测20
5.2功能调试20
第一章绪论
1.1设计题目
日历电子钟设计。
1.2设计目的
1、本次课程设计的主要目的是实现日历,电子钟的显示以及调整,充分调动学生的积极性和创造性,重视学生实际动手能力的培养;
2、了解并掌握掌握相关专业课程知识和设计能力;
3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技术;
4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
5、加深对专业课的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为将来工作的学习打下坚实基础。
1.3设计器材
本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:
1硬件要求:
LPC教学开发板一块。
②软件配置:
windowsXP。
1.4任务分析
由于网络与通信技术的发展,嵌入式系统在经历了近20年的发展历程后,又进入了一个新的历史发展阶段,即从普通的低端应用进入到一个高,低端并行发展,并且不断提升低端应用技术水平的时代,其标志是近年来32位MCU的发展。
时钟的特性:
带日历和时钟功能;提供秒,分,小时,月,年和星期;可调节数字。
通过LPC开发板来显示并调节日历和时间数值。
第二章设计原理
2.1设计原理简述
实时时钟提供一套计数器,在系统工作时对时间进行测量。
RTC消耗的功率非常低,这使其合适于由电池供电的,CPU不连续工作的系统。
在设计过程中,需要有定时报警功能。
当RTC的当前时间与报警时间相匹配时,就会引发中断。
关于闰年的计算,RTC执行一个简单的位比较,观察年计数器的最低2位是否为0。
如果为0,那么RTC认为这一年为闰年。
RTC认为所有能被4整除的年份都为闰年。
闰年对RTC的影响只是改变2月份的长度,日期和年的计数值。
2.2嵌入式操作系统的概述
嵌入式系统是集成电路发展过程中的一个标志性成果,它把计算机直接嵌入到应用系统中,融合了计算机软/硬件技术、通信技术和微电子技术,是一种微电子产业和信息技术产业的最终产品。
微电子产业是许多国家优先发展的产业。
以超深亚微米工艺和IP核复用技术为支撑的系统芯片技术是国际超大规模集成电路发展的趋势和21世纪集成技术的主流。
2.2.1嵌入式操作系统的特性
随着计算机技术和产品向其它行业的广泛渗透,由于嵌入式系统具有小巧、高度自动化、响应速度快的特点,因而非常适应信息家电和现代控制设备的需要,嵌入式技术成为了一个研究热点。
嵌入式系统,是将计算机直接嵌入至系统中,是信息IT的最终产品。
它根据应用的要求,将操作系统和功能软件集成于计算机硬件系统中,实现软件与硬件一体化。
2.2.2嵌入式操作系统的分类
嵌入式操作系统是随着嵌入式系统的发展出现的。
从应用范围角度大致可以分为可分为专用型(如Ucos、WindowsCE、VxWorks、嵌入式Linux等)和通用型(如PalmOS、Symbian)的嵌入式操作系统等。
从实时性的角度大致可以分为实时嵌入式操作系统和一般嵌入式操作系统。
2.2.3嵌入式操作系统的特点
嵌入式操作系统是对通用操作系统的继承和发展,具有操作系统的基本功能,包括指令执行、任务调度、存储器管理、设备管理和中断处理等。
但是,由于嵌入式系统的硬件环境和程序运行需求有很大限制,所以嵌入式操作系统又有如下并不同于一般操作系统的特点。
(1)资源限制。
嵌入式操作系统一般只有64MB内存,而且非易失性FLASH通常也就32MB,因此,操作系统运行时,就不能像在PC上那样使用资源了。
(2)安全性限制。
在嵌入式领域,系统在运行之后一般都不能在短时期内停机或者重启,因此死机、蓝屏是绝对不允许的。
(3)可移植性。
在设计过程中常采用通用的程序设计语言和运行支撑环境,尽量不用与系统的底层相关性强的语言。
第三章系统设计
3.1系统需求分析
3.1.1课程设计内容
采用LPC嵌入式开发板,控制其上的LCD液晶屏显示日历和日期,并可以对其修改。
3.1.2课程设计要求
(1)熟悉LPC开发板平台。
(2)熟悉LCD液晶屏的工作原理。
(3)熟悉RTC原理。
(4)时间可调,走时准确,有报时功能。
3.2硬件设计
3.2.1ARM处理器
ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对微处理器的通称,还可以认为是一种技术的名字。
ARM处理器是一个32位元精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。
(1)ARM处理器系列
ARM7系列 、ARM9系列、 ARM9E系列 、ARM10E系列 、SecurCore系列 Intel的Xscale Intel的StrongARMARM11系列,其中,ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。
(2)ARM处理器特点
1、体积小、低功耗、低成本、高性能;
2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;
3、大量使用寄存器,指令执行速度更快;
4、大多数数据操作都在寄存器中完成;
5、寻址方式灵活简单,执行效率高;
6、指令长度固定。
(3)指令结构
ARM微处理器的在较新的体系结构中支持两种指令集:
ARM指令集和Thumb指令集。
其中,ARM指令为32位的长度,Thumb指令为16位长度。
Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%~40%以上的存储空间,同时具备32位代码的所有优点。
3.2.2ARM硬件结构
飞利浦半导体推出了一系列非常方便使用ARM核心的嵌入式芯片。
飞利浦半导体部门现在已经成为一家独立的公司,采用了新的名称NXP。
智林测控的Z2101/03开发板分别使用NXP的ARM嵌入式处理器LPC2101/03两种芯片。
LPC2101/2102/2103基于一个支持实时仿真的ARM7TDMI-SCPU,并带有8kB和32kB嵌入的高速Flash存储器。
128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。
这可以使得中断服务程序和DSP算法中重要功能的性能较Thumb模式提高30﹪。
对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。
由于LPC2101/2102/2103非常小的尺寸和极低的功耗,它们非常适合于那些将小型化作为主要要求的应用,多个UART、SPI到SSP和2个I2C总线组成的混合串行通信接口和片内2kB/4kB/8kB的SRAM一起作用,可使得LPC2101/2102/2103非常适合用来实现通信网关和协议转换器、数学协处理器以及足够大空间的缓冲区的强大处理功能。
而多个32位和16位的定时器、一个经改良后的10位ADC、PWM特性(通过所有定时器上的一个输出匹配来实现)和32个快速GPIO(含有多达9个边沿或电平有效的外部中断管脚)使它们特别适用于工业控制和医疗系统。
开发板实物图如下所示:
图3.1开发板实物图
ARM的主要特性如下:
(1)16/32位ARM7TDMI‐S处理器,极小型LQFP48封装
(2)2kB/4kB/8kB的片内静态RAM,8kB/16kB/32kB的片内Flash程序存储器,128位宽的接口/加速器使其实现了70MHz的高速操作。
(3)通过片内Boot‐loader软件实现在系统/在应用编程(ISP/IAP)。
Flash编程时间:
1ms,可编程256字节,单个Flash扇区擦除或整片擦除只需400ms。
(4)EmbeddedICERT通过片内RealMonitor软件来提供实时调试。
(5)10位的A/D转换器含有8个模拟输入,每个通道的转换时间低至2.44µs,专用的结果寄存器使中断开销降到最低。
(6)2个32位的定时器/外部事件计数器,具有7路捕获和7路比较通道。
(7)2个16位的定时器/外部事件计数器,具有3路捕获和7路比较通道。
(8)低功耗实时时钟(RTC),有独立的供电电源和专门的32kHz时钟输入。
(9)多个串行接口,包括2个UART(16C550),2个快速I2C总线(400kbits/s)以及带缓冲和可变数据长度功能的SPI和SSP。
(10)向量中断控制器,可配置优先级和向量地址。
(11)多达32个可承受5V的通用I/O口。
(12)高达13个边沿或电平有效的外部中断管脚。
(13)通过可编程的片内PLL(可能的输入频率范围:
10MHz~25MHz)可实现最大为70MHz的CPU时钟频率,设置时间为100us。
(14)片内集成的振荡器,工作在1MHz~25MHz的外部晶体下。
(15)节电模式包括空闲模式、RTC有效的睡眠模式和掉电模式。
(16)CPU运行电源电压范围:
3.0V到3.6V(3.3V±10%),I/O口可承受5V电压;
(17)通过外设功能的单独使能/禁止和调节外设时钟来实现功耗的最优化。
(18)通过外部中断或RTC将处理器从掉电模式中唤醒。
ARM结构框图如下所示:
图3.2ARM结构框图
ARM管脚排列如下图所示:
图3.3ARM管脚排列
3.3软件设计
很多人都很很熟悉Keil的C51开发环境,当看到KeilforARM的开发环境时,你会发现一切是那么熟悉,我们几乎不用关心汇编语言,可以直接进入C语言编程。
我们所要学习和了解的主要内容是熟悉片上设备的用法。
KeiluVision调试器可以帮助用户准确地调试ARM器件的片内外围功能(I2C、CAN、UART、SPI、中断、I/O口、A/D转换器、D/A转换器和PWM模块等功能)。
ULINKUSB‐JTAG转换器将PC机的USB端口与用户的目标硬件相连(通过JTAG或OCD),使用户可在目标硬件上调试代码。
通过使用KeiluVisionIDE/调试器和ULINKUSB‐JTAG转换器,用户可以很方便地编辑、下载和在实际的目标硬件上测试嵌入的程序。
支持Philips、Samsung、Atmel、AnalogDevices、Sharp、ST等众多厂商ARM7内核的ARM微控制器。
KeilforARM的开发环境运行界面如下图所示:
图3.4KeilforARM用户界面
3.3.1启动Keil
进入Keil开发环境,Keil会自动加载上次开发的项目。
现在我们可以在Keil环境中使用ARM的编译器了,所以在建来新项目前,我们要注意一下当前编译器是什么,点击Project项的弹出窗口点击“Folders/Extensions”,勾选UseRealViewCompiler,我们使用ARM公司的最新发行的编译器RealVfiew。
点击主菜单的Projcet项的NewProject。
弹出文件对话窗如下所示:
图3.5弹出会话窗
选择新项目的文件夹,输入新项目名称,点击保存。
出现设备选择窗口,找到NXP(foundedbyPhilips)分类,点击前面的加号“+”展开,选择我们开发板对应的CPU型号,例如LPC2103,如下图所示:
图3.6设备选择窗口
选择后设备如下图所示:
图3.7设备选择
点击“确定”按钮,弹出对话框,这是在询问是否需要把启动代码拷贝到目标文件夹并添加到项目中,我们选择“是”,这时候,开发环境已经为我们建立了一个只包含启动代码的空项目,对话框如下图所示:
图3.8弹出对话框
我们看到这个项目目前只包含一个汇编文件Startup.s是启动代码,除非非常必要,否则我们不必修改这个文件,我们只要写C语言就可以了,这是Keil环境做的方便之处。
第四章系统代码
#include
#include"TFT018.h"
#include
#defineBP2(1<<14)
#defineBUZZER(1<<7)
#defineBP9(1<<2)
#defineLED(1<<3)
unsignedintdata,data2;
//引入相关芯片的头文件
//发光管接在P0.3引脚
#defineLED(1<<3)
#defineFPCLK60000000/*----------------------------------------------------------*\
|TYPEDEFINE|
\*----------------------------------------------------------*/
typedefcharS8;
typedefunsignedcharU8;
typedefshortS16;
typedefunsignedshortU16;
typedefintS32;
typedefunsignedintU32;
typedeflonglongS64;
typedefunsignedlonglongU64;
typedefunsignedcharBIT;
typedefunsignedintBOOL;
chars[20];
charz[20];
//intq=0;
//intp=1;
inti=0;//判断响的次数
intFLAG=-1;
enumweekday{sun,mon,tue,wed,thu,fri,sat};
enumweekdayweek=mon;
/*----------------------------------------------------------*\
|nubertostring|
\*----------------------------------------------------------*/
/*----------------------------------------------------------*\
|RealtimeInitial|
\*----------------------------------------------------------*/
voidRTCInit(void){
PCONP|=0x00000200;//RTC使能,默认为1使能,对其供电
CCR=0x00000002;//CCR时钟控制寄存器
CIIR=0x00000000;//ciir计数器增量中断使能寄存器
AMR=0x000000FC;//AMR报警屏蔽寄存器
ILR=0x00000003;//ILR中断位置寄存器
//PREINT=FPCLK/32768-1;
//PREFRAC=FPCLK-(FPCLK/32768)*32768;
CCR=0x00000011;
}
/*----------------------------------------------------------*\
|Setcurrenttime|
\*----------------------------------------------------------*/
voidSetNow(void){
CCR=0x00000002;//开始设置计数器禁止进行初始化
YEAR=2014;
MONTH=1;
DOM=10;
HOUR=0;
MIN=0;
SEC=0;
CCR=0x00000011;/////////////////////完成设置启动
}
/*voidDecStr(char*s,intd){
signedchart[20],i=0,l=0;
if(d==0)
{
s[0]='0';s[1]=0;return;
}
while(d>0){
t[i++]=d%10;
d/=10;
}
s[i--]=0;
for(;i>=0;i--){
s[i]=t[l++]+'0';
}
}*/
/*----------------------------------------------------------*\
|Delayns|
\*----------------------------------------------------------*/
voidDelayNS(U32dly){
U32i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);
}
/*----------------------------------------------------------*\
|ADCInitial|
\*----------------------------------------------------------*/
voidADCInit(void){
PINSEL1|=3<<14;//P0.22连接到AD0.0
}
voiddly()
{intj,i;
for(i=0;i<=65531;i++)
for(j=0;j<=20;j++);
}
/*voidTime1_init(void){
T1TC=0;//定时器1的初值设置为0
T1PR=99;//设置定时器分频为100分频,得600000Hz
T1MCR=0x649;//设置T1MR0、T1MR1、T1MR2、T1MR3匹配后继续计数,并产生中断标志
T1MR0=600000/2;//设置0.5s匹配值
//T1MR1=600000;//设置1.0s匹配值
//T1MR2=600000*1.5;//设置1.5s匹配值
//T1MR3=600000*2.5;//设置2.5s匹配值
T1TCR=0x01;//启动计数
}*/
voidDELAY(longn)//延时程序
{
longi;
for(;n>0;n--)
for(i=0;i<50000;i++);
}
/*voidset()
{
if((IOPIN&BP2)!
=BP2)//判断开关是否按下;开关未按下时P0.14引脚为高电平
{while(p)
{
if(q==1){sprintf(s,"%4u",YEAR);
LCD_PutString(30,50,s,Green,Blue);
YEAR--;
DELAY(200);
p=0;
}
/*Time0_init(20,1000);
IOCLR=LED;
DELAY(200);
Time0_init(6000,12000);
IOCLR=LED;
DELAY(200);
IOSET=LED;
PINSEL0=(PINSEL0&0xFFFF3FFF);
}
}
}*/
voidRTC_ISR(void)__irq//在ADS开发环境中,中断服务程序要这样定义void__irqEINT1_ISR(void)注意irq前面是两个下划线/////////
{FLAG=-FLAG;//修改标志变量
ILR=0x02;//清除中断标志
VICVectAddr=0;//向量中断地址清0,中断结束
}
voidSetAlarm(void){///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CCR=0x00000002;//时间计数器被禁止,此时准备进行初始化
ALYEAR=2014;
ALMON=1;
ALDOM=6;
ALHOUR=22;
ALMIN=0;
ALSEC=0;
CCR=0x00000001;//RTC使能,对晶体振荡器的信号开始计数
}
voidRTC_Init(void){//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//PCONP|=0x00000200;//RTC使能,默认为1使能,对其供电
CCR=0x00000010;//时间计数器被禁止,此时准备进行初始化
CIIR=0x00000000;//设置计数器增量中断,0为禁止增量中断
AMR=0x000000FC;//分钟、秒值与报警寄存器比较
ILR=0x00000002;//清除中断标志。
此句必须写,防止以前的中断标志导致初始化后立即发生中断。
PREINT=FPCLK/32768-1;
PREFRAC=FPCLK-(FPCLK/32768)*32768;
VICIntSelect=VICIntSelect&(~(1<<13));/*RTC中断使用IRQ向量中断;此语句可省略,因为VICIntSelect默认为0,即所有中断源都是IRQ中断*/
VICVectCntl0=0x20|13;//设置为IRQ通道1
VICVectAddr0=(unsignedlong)RTC_ISR;//ir