马然江嵌入式_第1页
马然江嵌入式_第2页
马然江嵌入式_第3页
马然江嵌入式_第4页
马然江嵌入式_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、 东北大学信息学院2010级嵌入式课程设计 东北大学信息学院2010级电子信息工程专业嵌入式系统课程设计报告姓名: 马然江·艾合买提学号:20113079班级:电子1101电话mail:3947250782013年7月 8 日 摘要嵌入式系统应用广泛,涉及通信、网络消费电子产品、医疗仪器、汽车电子、工业控制、仪器仪表、航天军事等各个行业和领域。目前全球嵌入式芯片的年出货量达到了60亿。嵌入式系统在应用数量上已经远远超过了各种通用计算机。可以说嵌入式产品“无处不在”。本次课程设计,使用基于ARM7TDMI内核的华邦W90P710处理器, 它提供了4K的指令缓存

2、和4K的数据缓存,并具有强大的外设资源,同时具有一个AC97控制器,一个双向通道GDMA,一个LCD控制器,两个24位定时器,它的外部总线接口控制器支持SDRAM、ROM/SRAM、FLASH存储器和I/O设备的方便接入,还具有串行通信和以太网接口,以适应通信网关和其他的应用场合。在人们对个人隐私等权益愈发注重的今天,个人信息及所有物的安全性不容忽视。而本次课程设计的题目基于华邦W90P710处理器的电子密码锁设计就是基于这一现状给出的具有使用性的设计。实现了密码设定、三次密码输入、显示电子相册及播放音乐的功能。 关键字:华邦W90P710微处理器、电子密码锁、嵌入式系统目 录目 录3一、题目

3、设计意义及特点4 1.1 设计意义及特点41.2 系统的主要功能4二、系统功能设计52.1 硬件设计及描述52.1.1系统功能模块整体52.1.2各模块作用及硬件连接图52.2 软件设计及描述82.2.1 程序流程框图82.2.2 源程序代码9一、题目设计意义及特点1.1 设计意义及特点(1)设计意义如今个人物品等问题开始暴露,传统的密码锁容易损坏、丢失,实用性、安全性很低,而电子密码锁因其绝对的精度使信息及物品的保密称为可能。此次题目具有很强的实际意义。另外,在老师对程序例子的讲解及自己的理解之后,通过查阅资料在原有程序上进行改写、融合和添加,设计出了电子密码锁,提高了自己的程序阅读能力,并

4、了解了嵌入式系统的开发流程,应用软件的使用方法。增强了自主学习能力,能与课本知识相融合,更加灵活的使用ARM变成语言。(2)特点电子密码锁与电子相册、音乐播放相结合,在登录成功后播放相册及音乐;具有密码设定及三次输入机会。1.2 系统的主要功能(1) 设置密码: LCD显示“请输入密码”,从键盘输入任意6位数字作为密码存入寄存 器,设置成功。(2)通过密码登陆系统: LCD显示“请输入密码”从键盘输入密码,比较键盘输入的密码与Flash 中是否相,每次按键则相应LED灯点亮; 如果密码正确,则LED灯全亮,LCD显示“密码正确”,并且开始切换 图片,播放电子相册,最后播放音频文件; 如果第一次

5、密码不正确,则LED灯闪烁,LCD显示“密码不正确,请重新输入”;如果第二次密码不正确,则LED灯闪烁,LCD显示“密码不正确,您还有一次机会,请重新输入”;如果第三次密码不正确,则LED灯闪烁,LCD显示“对不起,您已经连续三次输入密码错误,系统锁定”,锁定系统,无法进行任何操作。 (3)电子相册 显示“密码正确”后,自动播放电子相册,多张图片顺序播放。并在 播放完成后播放音乐。二、系统功能设计 2.1 硬件设计及描述 2.1.1系统功能模块整体 华邦 嵌入式 处理器芯片 W90P710LCD显示模块LED灯模块键盘输入模块音频模块 2.1.2各模块作用及硬件连接图 (1)华邦嵌入式处理器芯

6、片W90P710 W90P710为此次课程设计的中心和运行平台。 它是基于ARM7TDMI内核的处理器,提供了4K的指令缓存和4K的数据缓存,并具有强大的外设资源,包括一个USB1.1主控制器,一个SD/SDIO主控制器,4个独立的UART接口,一个看门狗定时器,71个可编程I/O口,PS/2键盘控制器和高级中断控制器AIC,同时具有一个AC97控制器,一个双向通道GDMA,一个LCD控制器,两个24位定时器,它的外部总线接口控制器支持SDRAM、ROM/SRAM、FLASH存储器和I/O设备的方便接入,还具有串行通信和以太网接口,以适应通信网关和其他的应用场合。 (2)LCD显示模块 90P

7、710试验板,使用的是AUO 3.0" TFT A030DL01(960x240, 8 位数据总线) 数字式TFT 液晶屏,可以将video/OSD的原始图像数据显示到外部显示设备。TFT液晶屏的显示是对屏上每个像素点进行操作,通过向这些像素点配置不同的值,以显示不同的颜色,由于其内部没有缓存,所要显示的数据要随着时钟脉冲一点一点的传送过来。因此,它需要在中开辟出一片缓冲区,将要显示的数据先存放到的缓冲区中,即存在SDRAM 中,一般按照一维数组的形式进行存储,然后把存储数据的SDRAM的地址送给FIFO,然后送给颜色生成器,进而实现在屏幕上的显示;如果在屏上的定位显示,算出所要显示

8、的内容在屏幕上的位置,然后在相应的SDRAM的地址内存入要显示的数据即可。 (3)键盘输入模块 通过外部键盘输入及软件编程实现键盘对系统的控制(4)LED模块 2.2 软件设计及描述 2.2.1 程序流程框图主函数中,函数调用了KPI、USI、LCD、AC-97、LED初始化程序。第一次输入为设定密码,之后13次为密码匹配,成功则播放相册及音乐,否则三次后锁定密码锁。程序框图如下:NYYY 开始系统初始化 读取密码设定标志是否已设定密码设定密码写入FLASH是否超过三次密码锁锁定 输入密码密码是否正确 电子相册及音乐 结束NN 2.2.2 源程序代码一、主程序部分 int main(void)

9、 int cnt,i; U8 wchar1= "请输入密码" U8 wchar3= "密码不正确,请重新输入" U8 wchar4= "密码不正确,您还有一次机会,请重新输入" U8 wchar5= "对不起,您已经连续三次输入密码错误,系统锁定" /* U32 j;*/U8 LBuffer512=0;U32 ClearLoop;LCD_IMAGE_T LCD_Size;LCD_LOCATION_T LCD_Location;LCDShowParameter LSP;LCD_Size.width = 480;LCD

10、_Size.height = 240;LCD_Location.StartX = 0;LCD_Location.StartY = 0;LCD_Location.EndX = 960;LCD_Location.EndY = 240;LCDInit();LCDShow(LCD_Size, LCD_Location);LCDFIFOBufferSet(shurumima);LCDDisplayOn();printf("*USI测试程序*n");printf("*Flash型号W25P10*n");USIInit();/读器件IDprintf("读器件

11、ID:");USIRead_ID(); /擦除扇区0printf("写使能:n");USIWriteEnable();while(USICheckBusy();USISectorErease(0x0); for(cnt=0;cnt<5;cnt+) acnt =cnt;/发送数据初始化 LSP.StartX = 12; LSP.StartY = 7; LSP.LibPlace = 0x400000; LSP.Color = 0x07ff; LSP.LetterChar = wchar1;/显示汉字"请输入密码" LSP.LCDBuffer

12、= shurumima;/显示图片 LCDOutputShow(LSP,5); Delay(10000000); KPIInit(); /键盘初始化 EBILedInit(0x00); printf("Please press keys.n"); while(1) if(p=1)/输入密码正确 EBILedInit(0xFF);/输入密码正确,灯全亮 LCDFIFOBufferSet(sky); LSP.LCDBuffer = sky; LCDDisplayOn(); LetterConvert(mi, LBuffer);LetterShow(224, 52, LBuffe

13、r, sky);/X、Y,shurumima=LBufferDelay(3000000);LetterConvert(ma, LBuffer);LetterShow(352, 52, LBuffer, sky);Delay(3000000);LetterConvert(zheng, LBuffer);LetterShow(480, 52, LBuffer, sky);Delay(3000000);LetterConvert(que, LBuffer);LetterShow(608, 52, LBuffer, sky);Delay(6000000);LCDFIFOBufferSet(yuansu

14、);temp = (U32)yuansu;Delay(6000000);LCDFIFOBufferSet(yuanyuan);temp = (U32)yuanyuan;Delay(6000000); LCDFIFOBufferSet(shici);temp = (U32)shici;Delay(6000000);LCDFIFOBufferSet(xinshang);temp = (U32)xinshang;Delay(6000000);music();if(p=2)/第一次输入密码不正确,显示"密码不正确,请重新输入" LSP.StartX = 12; LSP.StartY

15、 = 7; LSP.LibPlace = 0x400000; LSP.Color = 0x07ff; LSP.LetterChar = wchar3; LSP.LCDBuffer = shurumima; LCDOutputShow(LSP,11); EBILedInit(0xFF);/灯闪烁 Delay(0x7270E0); EBILedInit(0x00);Delay(0x7270E0); if(p=3)/第二次输入密码不正确,显示"密码不正确,您还有一次机会,请重新输入" LSP.StartX = 6; LSP.StartY = 7; LSP.LibPlace = 0

16、x400000; LSP.Color = 0x07ff; LSP.LetterChar = wchar4; LSP.LCDBuffer = shurumima; LCDOutputShow(LSP,19); EBILedInit(0xFF);/灯闪烁 Delay(0x7270E0); EBILedInit(0x00);Delay(0x7270E0); if(p=4)/第三次输入密码不正确,显示对不起,您已经连续三次输入密码错误,系统锁定 LSP.StartX = 5; LSP.StartY = 7; LSP.LibPlace = 0x400000; LSP.Color = 0x07ff; LS

17、P.LetterChar = wchar5; LSP.LCDBuffer =shurumima; LCDOutputShow(LSP,22); EBILedInit(0xFF); Delay(0x7270E0); EBILedInit(0x00);Delay(0x7270E0); return 0;2、 音乐播放程序部分 /*延时函数*/static void Delay(int nCnt) volatile int loop; for (loop=0; loop<nCnt; loop+);/*播放函数*/INT PlayCallback(UINT8 *pucBuff, UINT32 u

18、DataLen) UINT nLen; nLen = PCM_QUEUE_LEN - _uPcmQHead; /*将数据从PCM队列中取出放到DMA缓存区*/ if (nLen >= uDataLen) memcpy(pucBuff, &PlayData_uPcmQHead, uDataLen); _uPcmQHead = (_uPcmQHead + uDataLen) % PCM_QUEUE_LEN; else memcpy(pucBuff, &PlayData_uPcmQHead, nLen); memcpy(&pucBuffnLen, PlayData, u

19、DataLen - nLen); _uPcmQHead = uDataLen - nLen; return 0;/* 读AC97寄存器*/static UINT16 ac97_read_register(INT nIdx) UINT volatile nWait; /* 置起R_WB位并写入寄存器地址 */ REG_ACTL_ACOS1 = (0x80 | nIdx); /* 设置帧是否有效和有效的时隙 */ REG_ACTL_ACOS0 = 0x11; Delay(100); /* 检查AC_ACTL_ACCON的AC_R_FINISH位是否被置高,若被置高,说明读数据缓存区已经准备好给CP

20、U读取 */ for (nWait = 0; nWait < 0x10000; nWait+) if (REG_ACTL_ACCON & AC_R_FINISH) break; REG_ACTL_ACOS0 = 0; Delay(100); return (REG_ACTL_ACIS2 & 0xFFFF);/* 写AC97寄存器*/static INT ac97_write_register(INT nIdx, UINT16 sValue) volatile UINT nWait; /* 清R_WB位并写入寄存器地址*/ REG_ACTL_ACOS1 = nIdx; /*

21、 写入AC97寄存器的值*/ REG_ACTL_ACOS2 = sValue; /* 设置帧的有效位和有效的时隙*/ REG_ACTL_ACOS0 = 0x13; Delay(100); /* 检查AC_ACTL_ACCON的AC_W_FINISH位,若被清零,说明AC-LINK控制数据输出缓存已经被CPU移到编解码器*/ for (nWait = 0; nWait < 0x10000; nWait+) if (!(REG_ACTL_ACCON & AC_W_FINISH) break; /*若读回的值和写入的值相同,则说明写入成功*/ if (ac97_read_registe

22、r(nIdx) != sValue) while(1) ; REG_ACTL_ACOS0 = 0; return 0;/*初始化AC97*/UINT8 Initac97() /*使能音频控制器和AC-LINK接口*/ REG_ACTL_CON = REG_ACTL_CON | IIS_AC_PIN_SEL | AUDIO_EN | ACLINK_EN | PFIFO_EN | RFIFO_EN | T_DMA_IRQ | R_DMA_IRQ | DMA_EN; Delay(1000); /*stereo模式*/ REG_ACTL_RESET = REG_ACTL_RESET | 0x3000;

23、 /* 重启音频控制器 */ REG_ACTL_RESET = REG_ACTL_RESET | ACTL_RESET_BIT; Delay(1000); REG_ACTL_RESET = REG_ACTL_RESET & ACTL_RESET_BIT;Delay(1000); /* 重启AC97接口 */ REG_ACTL_RESET = REG_ACTL_RESET | AC_RESET; Delay(1000); REG_ACTL_RESET = REG_ACTL_RESET & AC_RESET; Delay(1000); /* 冷启动AC97 */ REG_ACTL_

24、ACCON = REG_ACTL_ACCON | AC_C_RES; Delay(1000); REG_ACTL_ACCON = REG_ACTL_ACCON & AC_C_RES; Delay(1000); /* 检查AC97的ACTL_ACIS0的CODEC_READY位,若置起则说明AC97准备好了 */ if (!(REG_ACTL_ACIS0 & 0x10) while(1); Delay(100); /*选择麦克 1;3D控制 关;looback 关*/ ac97_write_register(AC97_GENERAL_PURPOSE, 0); return 0;

25、UINT8 StartPlay(INT nSamplingRate) /* 使能VRA(variable rate audio)并设置播放采样率*/ ac97_write_register(AC97_EXT_AUDIO_CTRL, ac97_read_register(AC97_EXT_AUDIO_CTRL)|0x1); ac97_write_register(AC97_FRONT_DAC_RATE, nSamplingRate); /*设置DMA基地址和目的地址长度*/ REG_ACTL_PDSTB = base_addres; REG_ACTL_PDST_LENGTH = 0x1000;

26、PlayLastBlock = 0; /* 开始播放 */ REG_ACTL_ACOS0 = 0x1c; /设置数据传输时隙有效 REG_ACTL_PSR = 0x3; REG_ACTL_RESET = REG_ACTL_RESET | AC_PLAY; return 0; /* 设置音量 */INT SetPlayVolume(UINT8 ucLeftVol, UINT8 ucRightVol) INT nLData, nRData; if (ucLeftVol = 0) nLData = 0x80; else nLData = 31 - (ucLeftVol & 0x1f); if

27、 (ucRightVol = 0) nRData = 0x80; else nRData = 31 - (ucRightVol & 0x1f); sPlayVolume = (nLData << 8) | nRData; if (ucLeftVol = 0) nLData = 0x80; else nLData = 62 - ucLeftVol*2; if (ucRightVol = 0) nRData = 0x80; else nRData = 62 - ucRightVol*2; _uPlayVol = (nLData << 8) | nRData; /*

28、设置音量 */ ac97_write_register(AC97_PCM_OUT_VOLUME, sPlayVolume ); /PCM数据输出音量 ac97_write_register(AC97_AUX_OUT_VOLUME, _uPlayVol); /耳机音量设置 ac97_write_register(AC97_MASTER_VOLUME, _uPlayVol); /全局音量设置return 0;UINT8 StopPlay() /* 停止播放 */ REG_ACTL_RESET = REG_ACTL_RESET & AC_PLAY; REG_ACTL_ACOS0 = 0; /

29、*关闭音频播放中断 */ REG_AIC_MDCR = REG_AIC_MDCR | 0x40; return 0;void music(void) PCM_QUEUE_LEN = sizeof (PlayData); _uPcmQHead = 0; /* 设置I/O连接到音频 */ REG_GPIO_CFG0 = 0x155; /*/ GPIO4,1:输入 GPIO0,2,3:输出 */ REG_GPIO_DIR0 = 0xd; /*使能音频时钟 */ REG_CLKSEL = REG_CLKSEL|0x10000; Initac97(); /* 使能AC97播放中断 */ REG_AIC_

30、SCR6 = 0x41; REG_AIC_MECR = 0x40; SetPlayVolume(30,30); StartPlay(8000); /* 检查是否播放完成 */ while(1) if (_uPcmQHead >= (PCM_QUEUE_LEN-4096) break; StopPlay();3、 键盘及验证密码部分 void KPI_Handler(void) /int i;U8 KeyValue, tmp;int cnt,sum=0;tmp = REG_KPISTATUS; /取按键值tmp &= 0x0000000f; /因为硬件连接关系,需要对按键进行处理i

31、f(tmp > 0x7) && (tmp < 0xC)KeyValue = tmp - 4;else if(tmp > 0x3) && (tmp < 0x8)KeyValue = tmp + 4;elseKeyValue = tmp;switch(KeyValue)/实现按0-7,灯从左向右对应亮,按8,左边两个灯亮,按9,右边两个灯亮case 0:EBILedInit(0x01);/0000 0001,0对应灯亮break;case 1:EBILedInit(0x02);/0000 0010break;case 2:EBILedInit(0x04);/0000 0100break;case 3:EBILedInit(0x08);/0000 1000break;case 4:EBILedInit(0x10);/0001 0000bre

温馨提示

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

评论

0/150

提交评论