嵌入式系统组件PPT课件_第1页
嵌入式系统组件PPT课件_第2页
嵌入式系统组件PPT课件_第3页
嵌入式系统组件PPT课件_第4页
嵌入式系统组件PPT课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、1概述-组件技术的优越性1.提高开发的效率开发嵌入式系统的软件时,通常一些软件模块如UART的收发器模块在大多数的产品中都需要使用,通过把这些模块封装成组件,后续的开发继续使用,显然可以提高开发的效率。2.提高开发的可靠性新开发的软件模块都需要进行测试,包括实验室测试和公开测试,这些测试都需要时间。使用组件化的方法,可以使用以前被测试过的组件代码,可以大大提高软件的可靠性。3.提高软件的可移植性软件组件的设计尽量采用标准的接口,如果没有标准,可以自己定义完备的接口,便于后续系统的开发时使用。例如液晶显示模块,设计成彩色的功能接口比设计成黑白的有许多优点,彩色可以兼容黑白。4.适合于并行开发通常

2、一个嵌入式系统的软件由许多模块组成,这些模块包括设备驱动模块、算法模块等。良好的组件化设计方法,可以把任务均分,并行开发,提高开发效率。第1页/共57页21 例:嵌入式系统模型 嵌入式处理器 UART串行通信收发器 键盘 液晶显示器 模拟量输入接口 模拟量输出接口 数字量输入接口 数字量输出接口 数码管显示器 日历时钟第2页/共57页3原型系统EMCUmemoryAIAOLCDDI/DOkeyboardUARTOthers第3页/共57页4模型系统的软件组成模块化设计原则 主程序 I/O驱动程序-软件组件第4页/共57页5内容 嵌入式系统模型 键盘 LED显示器 LCD显示器 日历时钟 模拟量

3、输入/输出 开关量输入/输出 异步串行通信 其它第5页/共57页62 键盘第6页/共57页72 键盘第7页/共57页82 键盘 主要接口函数 KeyClear():清除键盘缓冲区 KeyGetKeyCode():读取一个键码 KeyHitKey():检查一个键是否按下 KeyInitKey() :初始化键盘模块第8页/共57页92 键盘 键盘组件的使用void main(void) OSInit(); /* 操作系统初始化 */ KeyInitKey(); /* 键盘模块组件初始化 */ OSStart(); /* 开始多任务运行 */第9页/共57页102 键盘 任务中使用键盘组件模块voi

4、d UserTask(void *data) Integer8 keycode; Data=data; while(1) keycode= KeyGetKeyCode (0); /* 等待用户键盘输入 */ Switch(keycode) /* 根据键的扫描码进行相应的处理 */ 第10页/共57页11内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它第11页/共57页123 LED显示器 利用I/O端口控制LED显示器第12页/共57页133 LED显示器 多路复用LED显示第13页/共57页143 LED显示器 组件内部

5、实现(软件组件的数据结构设计) (1) 系统使用7段LED数码管显示器; (2) 每个LED数码管有一个编号作为地址,编号从0开始; (3) 对应于每一个数码管,使用3个字节作为显示缓冲区,其中第一个存放它的字符代码,为了未来的扩展,字符代码使用ASCII码,虽然目前大多数应用的LED只显示16个16进制字符和部用户定义的图形;第二个存放颜色;第三个存放闪烁属性。 (4)需要为LED的显示模块预留一个定时器(硬件定时器或软件定时器),用于显示的刷新。第14页/共57页153 LED显示器 组件内部实现 接口函数 显示缓冲区 显示字模 定时器 驱动代码 API_LED第15页/共57页163 L

6、ED显示器 接口函数 LedInit();初始化内部数据结构 LedClear(); 清除内部缓冲区 LedDispChar(Unsigned16 position, Unsigned8 c, Unsigned8 color, Unsigned blink);显示字符 LedOff():关闭显示 LedOn() :打开显示第16页/共57页173 LED显示器 组件的实现 Leddef.h 定义组件模块的数据结构和配置 led.c 实现LED组件的所有函数第17页/共57页18内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其

7、它第18页/共57页194 LCD显示器1. LCD显示器被广泛地使用于个人设备中,应用范围还在不断扩大。LCD是一种被动显示技术,它本身不发光,利用反射光显示字符和图形。LCD的功耗非常低,于是在低功耗的场合特别是电池供电的嵌入式设备上得到了广泛的应用。2. 通常LCD使用自然光,反射自然光进行显示,如果周围的光很少或没有光,那么需要在LCD的后面放置一个光源,这个光源叫做背光。3. 背光可以通过场致发光(EL)或LED来实现,EL背光非常微弱,它产生一个非常均匀的光源。用于LED的光源颜色很多,常用白光。EL背光电流很低,但是需要较高的电压,通常在20V以上。EL背光的使用期限有限,通常在

8、20003000小时。LED背光的使用寿命很长,但是耗电较多。通常LED背光嵌在LCD的后面,有很多种颜色可以选择。第19页/共57页204 LCD显示器 LCD显示系统 分类(3类) 字符LCD显示-与LED基本相同; 图形LCD显示器-点阵; 定制LCD显示器-为用户特殊定制-电子台历 第20页/共57页214 LCD显示器 LCD显示系统组件实现LCD控制寄存器LCD显存第21页/共57页224 LCD显示器 接口函数的实现 点阵显示器的种类 黑白 灰度 彩色 方案 为每一种LCD定义接口函数, 优点:裁减性好, 缺点:应用软件的开发需要考虑移植 定义一种接口函数,支持三种LCD 缺点:

9、裁减性不好 优点:应用软件的开发基本不需要考虑移植性问题第22页/共57页234 LCD显示器接口函数的实现-定义一种接口函数,支持三种LCD1.LCD初始化:Unsigned8 LcdInit (struct *LcInitPara)2.关闭和打开显示void LcdOff(),void LcdOn() 3.清除LCD显示屏:void LcdClear() 4.显 示 字 符 串 : v o i d L c d D i s p S t r ( U n s i g n e d 1 6 r o w, Unsigned16 col, Unsigned8 *pStr, Unsigned32 colo

10、r,Unsigned8 font, Unsigned8 size);5.显示象素点:void LcdPixel(Unsigned16 row, Unsigned16 col, Unsigned32 color); 6.画线:void LcdLine(Unsigned16 x1, Unsigned16 y1, Unsigned16 x2, Unsigned16 y2, Unsigned8 Linetype, Unsigned32 color);7.画矩形:LcdRectangle(Unsigned16 x1, Unsigned16 y1, Unsigned16 x2, Unsigned16 y2

11、, Unsigned8 type, Unsigned32 color, Unsigned8 fill, Unsigned32 fillcolor); 8.画弧型:LcdArc(Unsigned16 x, Unsigned y, Unsigned16 radium, Unsigned16 angel1, U n s i g n e d 1 6 a n g e l 2 , U n s i g n e d 3 2 c o l o r, Unsigned8 type);第23页/共57页24内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通

12、信v其它第24页/共57页255 日历时钟 概述 实现方法 专用日历时钟芯片 时钟芯片、电池、32768时钟晶体 软件实现第25页/共57页265 日历时钟 实现原理第26页/共57页275 日历时钟接口函数1. ClockInit(), -时钟组件初始化2. ClockSetDate(), -设置日期3. ClockSetTime(), -设置时间4. ClockSetDateTime(), -设置日期和时间5. ClockGetDate(), -读取日期6. ClockGetTime(), -读取时间7. ClockGetDateTime(), -读取日期时间8. ClockFormatD

13、ate()。-格式化日期第27页/共57页28内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它第28页/共57页296 模拟量输入 模拟输入硬件结构 第29页/共57页306 模拟量输入 读取A/D值的方法1-慢速的A/D转换器件 (1)选择需要进行模数转换的通道; (2)触发进行模数转换 (3)延迟一段时间,延迟的时间大于或等于模数转换的时间加上信号在模数转换器保持稳定的时间 (4)读取模数转换的值 (5)把读取的值提交给应用程序第30页/共57页316 模拟量输入Unsigned16 AnalogInput(Unsig

14、ned8 channel)/* to do: 操作模拟多路开关,选择模数转换的通道 */* 延时,等待模拟信号在模数转换器的输入端稳定 */* 启动模数转换*/*延时,等待模数转换的结束*/* 读取模数转换的结果把返回给调用者*/第31页/共57页326 模拟量输入 方法2:利用模数转换器的结束信号来通知用户-中断方式 Unsigned16 AnalogInput(Unsigned8 channel)/* 选择要读取的输入通道*/* 延时,等待模拟多路开关输入信号的稳定*/ /* 启动模数转换*/ /* 等待信号量SemaAD or 超时 */ if (超时) /*模数转换出错处理;*/ el

15、se /*读取转换的结果并返回调用者*/ void IsrAD() /* 发出SemaAD(模数转换结束信号)*/第32页/共57页336 模拟量输入 方法3:A/D转换的速度比较快-直接在程序中读取Unsigned16 AnalogInput(Unsigned8 channel)/*选择模拟输入通道*/*延时,等待模拟信号在模数转换器的输入端稳定*/*启动模数转换工作*/*检测是否转换完成,如果完成则读取转换结果*/*把转换的结果返回给调用程序*/第33页/共57页346 模拟量输入 关于移植性的考虑 组件化方法把A/D转换的细节隐藏在组件的内部。 关于A/D的精度:目前的模拟转换器的精度有

16、8位、10位、14位等,甚至有20位、24位或更高。 为了将来技术的发展,可以把转换结果表示成32位,在一定的时期内足够用了,对于小于32位的模数转换器,低位表示转换的结果,高位用0填充,最高位可以作为符号位。第34页/共57页357模拟量输出 D/A的环节 数模转换器 滤波器 放大器 执行器/驱动器第35页/共57页367模拟量输出 主要接口函数 void AnalogOutput(Unsigned8 channel, Unsigned32 value);第36页/共57页377模拟量输出 使用例子void UserTask()Unsigned32 temp;/* 数据来源和处理,得到数据t

17、emp*/AnalogOutput(0,temp);/*此时电压表的指针指示相应的模拟量*/第37页/共57页38内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它第38页/共57页398 开关量输入/输出 压力开关 温度开关 限制开关 继电器触点 邻近探测器 控制 / 监视 系统 第39页/共57页408 开关量输入/输出开关量通常是1位计算机处理的数据以字节为单位接口函数的实现方法1.直接以字节为单位处理开关量 void IOWrite(Unsigned address, Unsigned8 value);Unsigne

18、d8 IORead(Unsigned address) 2.包装以位为单位处理开关量 Unsigned8 SwitchRead(Unsigned16 channel);void Unsigned8 SwitchWrite(Unsigned16 channel, Unsigned8 On_Off); 第40页/共57页418 开关量输入/输出-实现方式比较方式(1)-字节优点程序的代码量小,执行的速度快,缺点程序设计的不直观,程序的移植性不好。 方式(2)-位 优点 可移植性好,把开关进行了抽象化,屏蔽了开关量操作的细节; 程序的可读性好 缺点 程序的代码量比较大,程序的执行时间稍长。 由于现代

19、处理器的速度提高和存储器的空间比较大,方式(2)带来的问题可以完全克服。第41页/共57页428 开关量输入/输出-实现方式比较void UserTask()if(SwitchRead(10)=ON) SwitchWrite(20,ON);else SwitchWrite(20,OFF);第42页/共57页43内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它第43页/共57页449 异步串行通信 接收方法1第44页/共57页459 异步串行通信-接收ISR IsrUartRx(void) /*接收中断服务例程*/Unsig

20、ned8 c;/*保存CPU的寄存器,即把ISR中使用的寄存器压栈*/*从通信控制器中读取收到的字符*/if (接收环形队列不满) 把收到的字节放于环形队列/* 恢复CPU的寄存器,即把压栈的寄存器弹出*/ /*to do: 中断返回*/Unsigned8 UartGetChar(void)/* 从接收环形队列中接收一个字节,返回收到的字节,如果环形队列中没有字节,那么返回空NULL字符*/Unsigned8 c;c=NULL;/* to do:禁止中断 */if(环形队列不空) c=从环形队列中读取的字节;/*to do: 使能中断*/return c;第45页/共57页469 异步串行通信

21、-接收 问题:应用程序以独占的方式访问环形队列的过程中,中断禁止,如果应用程序不及时地取出环形队列中的字节,环形队列将被填满,使以后接收到的字节丢失。 第46页/共57页479 异步串行通信-接收 方法2 1.应用程序等待信号量SemaUartRx; 2.ISR收到一个字节后,得到一个信号量,从串行端口读入字节,把它放到环形队列中; 3.ISR释放一个信号量; 4.任务收到信号量,读取字节;第47页/共57页489 异步串行通信-接收 问题 每次中断发生,中断服务程序会使用信号量SemaUartRx,该操作是操作系统提供的系统调用,执行此调用会消耗一定的时间,也就是说,每次接收到一个字符,都要执行此调用,系统的开销比较大。 解决方案 当收到一定数量的字符或收到特定的字符后,才发出信号量,以减少开销。第48页/共57页499 异步串行通信-发送 方法1:缓冲方式发送第49页/共57页509 异步串行通信-发送VOid UartPutChar(Unsigned8 c)/*to do:禁止CPU的中断*/ if(发送环形队列不满) 把要发送的字符放到环形队列尾部 if (此字符是队列中的第一个字符) 使能发送中断; 使能CPU的中断;ISR UartCharSend(void) /* 发送中断服务例程 */Unsigned8 c;保存处理器的寄存器;if(Uart的发送

温馨提示

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

评论

0/150

提交评论