您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 嵌入式系统常用外设驱动编程实例
1嵌入式系统原理及应用第五讲嵌入式系统常用外设驱动编程实例2嵌入式系统常用外设除了存储设备以外还包括:通信总线及接口(如UART、USB、I2C、SPI等)、人机交互设备(如LCD、键盘、触摸屏等)、其他输入输出设备(如A/D、D/A、PWM等)。3本章提要132546触摸屏模块设计实例UART异步串口模块实例A/D转换器应用实例LCD模块设计LPC1768简介7PWM控制实例GPIO与键盘实例45.1.1LPC1768概述LPC1768是NXP公司推出的基于ARMCortex-M3内核的微控制器LPC17XX系列中的一员。LPC17XX系列Cortex-M3微处理器用于处理要求高度集成和低功耗的嵌入式应用。LPC1700系列微控制器的操作频率可达100MHz(新推出的LPC1769和LPC1759可达120MHz)。ARMCortex-M3CPU具有3级流水线和哈佛结构。LPC17XX系列微控制器的外设组件包含高达512KB的flash存储器、64KB的数据存储器、以太网MAC、USB主机/从机/OTG接口、8通道DMA控制器、4个UART、2条CAN通道、2个SSP控制器、SPI接口、3个IIC接口、2输入和2输出的IIS接口、8通道的12位ADC、10位DAC、电机控制PWM、正交编码器接口、4个通用定时器、6输出的通用PWM、带有独立电池供电的超低功耗RTC和多达70个的通用IO管脚。5引脚连接模块寄存器映射引脚功能选择寄存器0(PINSEL0)PINSEL0寄存器控制端口0低半部分的位功能。仅当引脚选择使用GPIO功能时,FIO0DIR寄存器中的方向控制位才有效。引脚功能选择寄存器1(PINSEL1)PINSEL1寄存器控制端口0高半部分的位功能。仅当引脚选择使用GPIO功能时,FIO0DIR寄存器中的方向控制位才有效。LPC1768的引脚功能选择寄存器1的位功能描述如表3-7所列。引脚功能选择寄存器2(PINSEL2)PINSEL2寄存器控制端口1低半部分的位功能,包含以太网相关功能引脚。仅当引脚选择使用GPIO功能时,FIO1DIR寄存器中的方向控制位才有效。引脚功能选择寄存器3(PINSEL3)PINSEL3寄存器控制端口1高半部分的位功能。仅当引脚选择使用GPIO功能时,FIO1DIR寄存器中的方向控制位才有效。6引脚连接模块寄存器映射引脚功能选择寄存器4(PINSEL4)PINSEL4寄存器控制端口2低半部分的位功能。仅当引脚选择使用GPIO功能时,FIO2DIR寄存器中的方向控制位才有效。引脚功能选择寄存器7(PINSEL7)PINSEL7寄存器控制端口3高半部分的位功能。仅当引脚选择使用GPIO功能时,FIO3DIR寄存器中的方向控制位才有效。引脚功能选择寄存器9(PINSEL9)PINSEL9寄存器控制端口4高半部分的位功能。仅当引脚选择使用GPIO功能时,FIO4DIR寄存器中的方向控制位才有效。引脚功能选择寄存器(PINSEL10)PINSEL10寄存器用于控制P2.2~P2.6的跟踪功能。7本章提要132546触摸屏模块设计实例UART异步串口模块实例A/D转换器应用实例LCD模块设计LPC1768简介7PWM控制实例GPIO与键盘实例85.2.1LPC1768的GPIO概述1.LPC1768GPIO简介LPC1768其引脚数为100,其中用做GPIO功能的引脚达70个。具体分配如下:P0端口28个:P0.0~P0.11,P0.15~P0.30。P1端口24个:P1.0~P1.1,P1.4,P1.8~P1.10,P1.14~P1.31。P2端口14个:P2.0~P2.13。P3端口2个:P3.25,P3.26。P4端口2个:P4.27,P4.28。95.2.1LPC1768的GPIO概述LPC1768的GPIO特性如下:加速GPIO功能:GPIO寄存器被转移到外设AHB总线上,以实现高速的I/O时序;屏蔽寄存器允许将某些端口位作为一组进行操作,而其他位不变;所以GPIO寄存器可以以字节、半字和字的方式进行读/写操作;GPIO寄存器可由GPDMA进行访问。置位和清零寄存器允许用一条指令置位和清零操作一个端口的任意位。所有GPIO寄存器支持位带操作功能。单个端口的方向可控制。所有I/O端口在复位后默认为上拉输入端。P0和P2端口的每个引脚提供了中断功能。每个端口的中断可被编程为上升沿、下降沿或边沿产生中断。边沿检测支持异步操作。P0和P2端口的每个引脚支持掉电唤醒功能。105.2.1LPC1768的GPIO概述2.GPIO寄存器描述通用名称描述访问复位值PORTn寄存器名称和地址FIODIR高速GPIO端口方向控制寄存器。该寄存器可单独控制每个端口引脚的方向R/W0FIO0DIR:0x2009C000FIO1DIR:0x2009C020FIO2DIR:0x2009C040FIO3DIR:0x2009C060FIO4DIR:0x2009C080FIOPIN高速GPIO端口引脚状态寄存器。该寄存器真实反映数字端口引脚的当前状态R/W0FIO0PIN:0x2009C014FIO1PIN:0x2009C034FIO2PIN:0x2009C054FIO3PIN:0x2009C074FIO4PIN:0x2009C094FIOSET高速GPIO端口输出置位寄存器。写1使相应的端口引脚输出高电平;写0没有影响R/W0FIO0SET:0x2009C018FIO1SET:0x2009C038FIO2SET:0x2009C058FIO3SET:0x2009C078FIO4SET:0x2009C098FIOCLR高速GPIO端口输出清零寄存器。写1使相应的端口引脚输出低电平;写0没有影响R/W0FIO0CLR:0x2009C01CFIO1CLR:0x2009C03CFIO2CLR:0x2009C05CFIO3CLR:0x2009C07CFIO4CLR:0x2009C09CFIOMASK高速GPIO端口屏蔽寄存器R/W0FIO0MASK:0x2009C010FIO1MASK:0x2009C030FIO2MASK:0x2009C050FIO3MASK:0x2009C070FIO4MASK:0x2009C090115.2.2基于GPIO的矩阵键盘设计1.常用键盘工作原理(1)独立式按键接口优点:电路配置灵活,软件实现简单。缺点:每个按键需要占用一根口线,若按键数量较多.资源浪费将比较严重应用:主要用于按键较少或对操作速度要求较高的场合,软件实现时,可以采用中断方式,也可采用查询方式12(2)行列式按键接口优点:相对于独立接口方式可以节省很多I/O资源,相对于专用芯片键盘可以节省成本,且更为灵活;缺点:需要用软件处理消抖、重键等应用:行列式按键接口适应于按键数量较多,又不想使用专用键盘芯片的场合。13键盘扫描阵列:一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。扫描次数输出(行)输入(列)键刚按下时000110第一次扫描011111第二次扫描101111第三次扫描110110键9按下时扫描过程143.专用芯片式设计专用键盘处理芯片一般功能比较完善.芯片本身能完成对按键的编码、扫描、消抖和重键等问题的处理,甚至还集成了显示接口功能。专用键盘处理芯片的优点很明显,可靠性高,接口简单,使用方便,适合处理按键较多的情况。但在很多应用场合,考虑成本因素.可能并不是最佳选择。152.3×3矩阵键盘电路设计(1)功能要求利用LPC1768的P1.24~P1.29引脚外接3×3矩阵键盘,将键盘的值通过连接在P2.0~P2.5引脚上的LED按照键盘按键的编号顺序点亮显示。(2)硬件电路3×3矩阵键盘识别实例的硬件电路如图5-5所示。K1~K9的9个轻触式按键以3行3列的形式分别连接到P1.24~P1.29引脚上,其中P1.24~P1.26引脚用于连接矩阵键盘的行,P1.27~P1.29引脚用于连接矩阵键盘的列。8个LED发光二极管连接到LPC1768的P2.0~P2.7引脚上显示按键编号。162.3×3矩阵键盘电路设计175.2.3键盘驱动程序设计在图5-3中,KR0~KR2连接到P1.24~P1.26作为输出,KL3~KL5连接到P1.27~P1.29作为输入。如果采用了中断,还要初始化中断寄存器。3×3矩阵键盘的识别过程是由以下几个步骤构成:判断按键是否按下。若有键按下,则延时5~10ms,消除按键抖动。再判断按键是否真的按下。若确实有键按下,则执行该按键的功能事件。判断按键是否释放,若没有释放则等待按键释放。键号二进制代码十六进制代码键号二进制代码十六进制代码K1XX1101100x36K6XX0111010x1DK2XX1011100x2EK7XX1100110x33K3XX0111100x1EK8XX1110110x3BK4XX1101010x35K9XX0110110x1BK5XX1011010x2D3×3矩阵键盘键值代码表185.2.3键盘驱动程序设计1.寄存器宏定义将32位GPIO寄存器分成4个8位的子寄存器进行访问,其他例子则采用开发板自带寄存器定义方式来访问。#definerFIO1DIR3(*(volatileunsignedchar*)0x2009C023)//P1.24~P1.31口方向控制寄存器#definerFIO1PIN3(*(volatileunsignedchar*)0x2009C037)//P1.24~P1.31口状态寄存器#definerFIO1SET3(*(volatileunsignedchar*)0x2009C03B)//P1.24~P1.31口输出置位寄存器#definerFIO1CLR3(*(volatileunsignedchar*)0x2009C03F)//P1.24~P1.31口输出清零寄存器#definerFIO2DIR0(*(volatileunsignedchar*)0x2009C020)//P2.0~P2.7口方向控制寄存器#definerFIO2SET0(*(volatileunsignedchar*)0x2009C058)//P2.0~P2.7口输出置位寄存器#definerFIO2CLR0(*(volatileunsignedchar*)0x2009C058)//P2.0~P2.7口输出清零寄存器195.2.3键盘驱动程序设计2.键盘初始化函数键盘初始化函数主要针对键盘所用的端口属性进行初始化。在键盘工作之前,根据行列键盘电路设计原理将P1.24~P1.26配置为输出,P1.27~P1.29配置为输入。如果采用了中断,还要初始化中断寄存器。voidKeyInit()//该函数对键盘使用的端口进行初始化{rFIO1DIR3|=0x07;//设置P1.24~P1.26配置为输出,P1.27~P1.29//配置为输入;其中1为输出。rFIO1CLR3|=0x07;//设置P1.24~P1.26输出为0。}203.键盘扫描程序根据扫描原理,设置的P1.24~P1.26按如表5-5所示的顺序输出,比较每次扫描P1.27~P1.29的输入值是否等于键刚被按下的输入值,如果相等,找出输出为零的行,则该行即为被按下的行。扫描次数输出(行)第一次扫描110第二次扫描101第三次扫描011是否等于第一次列输入值将行值放入临时变量低4位,返回读取结果是否获取键盘列输入值,放入临时变量高4位按表5-5依次改变行输出值读取键盘列输入值21BYTEGetKey()//键盘扫描子程序{BYTEi,keytemp;keytemp=rFIO0PIN0&0x38;//将列的值存入keytemp的3~6位for(i=1;i=4;i=1){rFIO1CLR3|=0x3F;rFIO1SET3=~i&0x
本文标题:嵌入式系统常用外设驱动编程实例
链接地址:https://www.777doc.com/doc-2440418 .html