3175.ARM——报时表及闹钟的设计实验_第1页
3175.ARM——报时表及闹钟的设计实验_第2页
3175.ARM——报时表及闹钟的设计实验_第3页
3175.ARM——报时表及闹钟的设计实验_第4页
3175.ARM——报时表及闹钟的设计实验_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、easy arm2131开发板实验报告实验名称:报时表及闹钟的设计实验 系 部:物理与机电工程学院 专业班级:07电子信息工程(2)班 学生姓名: 学 号: 指导教师: 完成时间:2010年5月6日 报告成绩: 报时表及闹钟的设计实验(结合gpio、spi,万年历改装实验)一、 实验目的:1) 设计一个由万年历改装的报时表和闹钟2) 复习gpio、spi的7段数码显示管的工作原理和应用3) 了解和掌握实时时钟的工作原理及应用4) 学会综合以前所学的知识实现新的功能5) 更加熟悉easy-arm2138开发板的结构和使用方法二、 实验仪器:硬件:easy-arm实验开发板一套计算机一台(内装有a

2、ds1.2及easyjtag仿真器)软件:windows xp系统,ads1.2集成开发环境三、 实验原理:1. 概述:1) 实时时钟(rtc,real time clock)提供一套计数器在系统上电和关闭操作时对时间 进行测量,rtc消耗的功率非常低。 2) lpc2131的rtc时钟可由独立的32.768khz 振荡器或基于vpb时钟的可编程预分频器来提供。 3) 另外,rtc还具有专用的电源管脚vbat,可连接到电池或其它器件使用的相同的 3.3v 电压上。 4) 要使rtc中断能够唤醒掉电的cpu,必须选择外部时钟源。 2. rtc的特性:l 测量保持日历或时钟的时间通路; l 超低功

3、耗设计,支持电池供电系统; l 提供秒、分、小时、日、月、年和星期; l 指定的 32khz 振荡器或可编程 vpb 时钟预分频器; z l 专用电源管脚可与电池或 3.3v 的电压相连。3. rtc结构:rtc功能结构如图4.116 所示:4. 时间计数器:(1)时间计数器寄存器: 地址名称规格描述访问0xe0024020sec6秒值 该值的范围为 059r/w0xe0024024min6分值 该值的范围为 059r/w0xe0024028hour5小时值 该值的范围为 023r/w0xe002402cdom5日期(月)值该值的范围为128,29,30 ,31r/w0xe0024030dow

4、3星期值 该值的范围为 06r/w0xe0024034doy9日期(年)值 该值的范围为 1365r/w0xe0024038month4月值 该值的范围为 112r/w0xe002403cyear12年值 该值的范围为 04095r/w(2)时间计数器的关系和值:计数器规格使能最小值最大值秒6clk1(图4.116)059分6秒059小时5分023日期(月)5小时128, 29, 30 或 31星期3小时06日期(年)9小时1365 或 366(闰年)月4日期(月)112年12月或日期(年)040955. 预分频器:预分频器允许从任何频率高于65.536khz(232.768khz)的外设时钟

5、源产生一个32.768khz 的基准时钟。这样,不管外设时钟的频率为多少rtc总是以正确的速率运行。预分频器通过一个包含整数和小数部分的值对外设时钟(pclk)进行分频。这样就产生了一个不是恒定频率的连续输出,有些时钟周期比其它周期多1个pclk周期,但是每秒钟的计数总数总是32768。 基准时钟分频器包含一个13位整数计数器和一个15位小数计数器。使用该规格的原因如下: 1) 对于 lpc2131 所支持的频率,13位整数计数器是必要的。可以这样进行计算:频率160mh除以32768再减去1等于4881,余数为 26,624。保存4881需要13个位。13位实际所能支持的高频率为268.4m

6、hz(327688192)2) 余数的大值为 32767,需要 15 位来保存。6. rtc中断:中断的产生由中断位置寄存器(ilr)、计数器递增中断寄存器(ciir)、报警寄存器和报警 屏蔽寄存器(amr) 控制,只有转换到中断状态才能产生中断。ilr 单独使能ciir和amr中断(ilr 寄存器实际是一个中断标志寄存器)。 ciir中的每个位都对应一个时间计数器,如果ciir使能用于一个特定的计数器,那么该 计数器的值每增加一次就产生一个中断,如图4.118所示。报警寄存器允许用户设定产生中断的日期或时间。amr提供一个屏蔽报警比较的机制,如果所有非屏蔽报警寄存器与它们对应的时间计数器的值

7、相匹配时,则会产生中断,如 图4.119 所示。如果 rtc 使用独立的外部振荡器,rtc 中断可使 lpc2131 退出掉电模式。当 rtc 中 断唤醒使能并且所选中断事件出现时,将启动 xtal 1/2 管脚相关的振荡器,经过一定周期 后,cpu 被唤醒。7. 基本操作:lpc2131 的实时时钟,可用来进行定时报警,日期及时分秒计时等等。rtc 具有独立的电源和时钟源,电源消耗很低,特别适合于电池供电,cpu不连续工作(掉电模式)的系统。通过设置中断唤醒寄存器(intwake),rtc中断还能将cpu从掉电模式下唤醒。设置时钟控制寄存器(ccr)可以选择rtc的计数时钟,由独立的 32.

8、769khz 振荡器提供或将 fpclk 进行分频得到。当使用fpclk作为时钟源时,它的基准时钟分频器允许调节任何频率高于 65.536khz的外设时钟源产生一个32.768khz的基准时钟,实现准确计时操作。如图4.120 所示,实时时钟ctc计数器的时钟源使用由pclk通过基准时钟分频器 (preint、prefrac)调整出的32768hz时钟信号,或者直接使用独立的外部32.768khz振荡器产生的时钟信号。ctc是一个15位的计数器,它位于秒计数器之前,ctc每秒计数 32768个时钟;当有ctc秒进位时,完整时间ctme02、rtc时间寄存器(如sec、min等)将会更新;rtc

9、中断有两种,一种是增量中断,由ciir进行控制,另一种为报警中断,由amr寄存器和各报警时间寄存器控制,如alsec、almin等;报警位置寄存器ilr用来产生相应的中断标志;rtc时钟控制寄存器ccr用于使能实时时钟,ctc复位控制等。 其中,日期寄存器(表示“日”)有两个,分别为doy和dom,doy表示为一年中的 第几日,值为1365(闰年为 366);而dom则为一月中的第几日,值为128/29/30/31,一般日期计数使用dom 即可。rtc 基本操作方法: l 选择时钟源(ccr 寄存器); l 设置 rtc 基准时钟分频器(preint、prefrac)(根据上一步选择执行此步操

10、作); z l 初始化 rtc 时钟值,如 year、month、dom 等; l 报警中断设置,如 ciir、amr 等; l 启动 rtc,即 ccr 的 clken 位置位; l 读取完整时间寄存器值,或等待中断。四、 实验程序流程图:开始选择引脚连接spi;设置连接串口0; p0.7、p1.18、p21:16 选择连接gpio;设置p0.7、p1.18为输出状态,p21:16 为输入状态spi,串口0初始化rtc初始化增量中断标志置位?清除rtc中断读取时钟,送到上位机显示key1按下?key2按下?key3按下?key4按下?key5按下?key6按下?月份大于12?设置基准时钟;

11、设置年、月、日、星期、时、分、秒;设置秒增量产生中断; 启动rtc否否否否否否月份自增month+日期大于30?小时大于23?星期大于7?分钟大于59?month=1dom=1dow=1hour=0min=0是是是是是日期自增dom+星期自增dow+小时自增hour+分钟自增min+年份自增1year+否否否否否a是否min=59?& sec=59?aled1灯闪烁;蜂鸣器鸣叫10声;数码管显示10s倒计时led1灯熄灭;蜂鸣器停止鸣叫;数码管熄灭7点闹钟报警; led2灯亮;蜂鸣器鸣叫;数码管显示7led2灯熄灭;蜂鸣器停止鸣叫;数码管熄灭min & sec=0?&hour=7?是否是否五、

12、 实验内容:结合gpio、spi,用实时时钟实现报时和闹钟的功能。六、 实验步骤:1) 按照开发板说明连接计算机,打开ads1.2和h-jtag软件给开发板上电调试。2) 观察实验现象,看看蜂鸣器是否鸣叫,程序是否正常运作。3) 适当调节定时器的定时时间,观察程序运行现象。4) 修改程序,观察程序运行后,是否符合预计程序的功能。七、 程序:1.程序说明:本程序是结合了gpio、spi和实时时钟设计的一个由万年历改装的报时表和闹钟。2.实验程序(表格内和字体加粗部分为增加修改的程序):#include config.h#define hc595_cs (1 29) / p0.29口为74hc59

13、5的片选#define beep 1 7 / p0.7控制蜂鸣器,低电平蜂鸣const uint32 leds8 = (0xff 18);/ p125:18控制led8led1,低电平点亮const uint32 key1 = 1 16; / p0.16连接key1const uint32 key2 = 1 17;const uint32 key3 = 1 18;const uint32 key4 = 1 19;const uint32 key5 = 1 20;const uint32 key6 = 1 21;uint8 rcv_data;/* 函数名称:mspi_init()* 函数功能:初

14、始化spi接口,设置为主机。* 入口参数:无* 出口参数:无*/void mspi_init(void) /pinsel0 = (pinsel0 & 0xffff00ff) | 0x00005500;pinsel0 = (pinsel0 & (0xff 8) | (0x55 8) ; spccr = 0x52; / 设置spi时钟分频 spcr = (0 3) |/ cpha = 0, 数据在sck 的第一个时钟沿采样 (1 4) |/ cpol = 1, sck 为低有效 (1 5) |/ mstr = 1, spi 处于主模式 (0 6) |/ lsbf = 0, spi 数据传输msb

15、(位7)在先 (0 0; dly-)for (i=0; i 115200)return (0);if (set.datab 8)return (0);if (0 = set.stopb) | (set.stopb 2) return (0);if (set.parity 4)return (0);/ 设置串口波特率u0lcr = 0x80;/ dlab=1bak = (fpclk 4) / baud;u0dlm = bak 8;u0dll = bak & 0xff;/ 设置串口模式bak = set.datab - 5;if (2 = set.stopb)bak |= 0x04;if (0 !

16、= set.parity)set.parity = set.parity - 1;bak |= 0x08;bak |= set.parity 16) & 0xfff; / 获取 年pc_dispchar(0, showtablebak / 1000);bak = bak % 1000;pc_dispchar(1, showtablebak / 100);bak = bak % 100;pc_dispchar(2, showtablebak / 10);pc_dispchar(3, showtablebak % 10);bak = (datas 8) & 0x0f; / 获取 月pc_dispc

17、har(4, showtablebak / 10);pc_dispchar(5, showtablebak % 10);bak = datas & 0x1f; / 获取 日pc_dispchar(6, showtablebak / 10);pc_dispchar(7, showtablebak % 10);bak = (times 24) & 0x07; / 获取 星期pc_dispchar(8, showtablebak);bak = (times 16) & 0x1f; / 获取 小时pc_dispchar(9, showtablebak / 10);pc_dispchar(10, sho

18、wtablebak % 10);bak = (times 8) & 0x3f; / 获取 分钟pc_dispchar(11, showtablebak / 10);pc_dispchar(12, showtablebak % 10);bak = times & 0x3f; / 获取 秒钟pc_dispchar(13, showtablebak / 10);pc_dispchar(14, showtablebak % 10);/* 函数名称 :rtcinit()* 函数功能 :初始化实时时钟* 入口参数 :无* 出口参数 :无*/void rtcinit (void)preint = fpclk

19、 / 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/* 函数名称 :main()* 函数功能 :读取实时时钟的值,通过串口发送出去。*/int main (void)pinsel0 = (pinsel0 & (0xff 8) | (0x55 8)

20、 ;/ 设置spi管脚连接 pinsel1 = 0x00000000; io0dir = hc595_cs| beep;/ 从机片选 io0set = beep; mspi_init(); io0dir = beep; pinsel2 = pinsel2 & (0x08);/ p125:16连接gpioio1dir = leds8;/ leds8控制口 uartmode uart0_set;pinsel0 = 0x00000005;/ 连接io到uart0uart0_set.datab = 8;uart0_set.stopb = 1;uart0_set.parity = 0;uart0_ini

21、t(115200, uart0_set);u0fcr = 0x01;/ fifo使能rtcinit();while (1)while (0 = (ilr & 0x01);/ 等待rtc增量中断if(io0pin & key1)=0) year+; /调节年if(io0pin & key2)=0) if(month12) month+; /调节月 else month=1; sendtimertc( )if(io0pin & key3)=0) if(dom30) dom+; /调节日 else dom=1; sendtimertc( )if(io0pin & key4)=0) if(dow7)

22、dow+; /调节星期 else dow=1; sendtimertc( )if(io0pin & key5)=0) if(hour23) hour+; /调节小时 else hour=0; sendtimertc( )if(io0pin & key6)=0) if(min10;i-) rcv_data = mspi_senddata(disp_tabi);/ 发送显示数据else io0set=beep; io1set=led1;rcv_data = mspi_senddata(disp_tab11);/ 发送显示数据if(min=0&sec=0&hour=7)io0clr=beep;io1clr=led2;rcv_data = mspi_senddata(disp_tab8);/ 发送显示数据else io0set=beep; io1set=led2;rcv_data = mspi_senddata(disp_tab11);/ 发送显示数据while (0 = (ilr & 0x01);/ 等待rtc增量中断

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论