版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.ARM的串行口驱动程序设计目录一、ARM的串行口驱动程序设计二、键盘驱动程序设计三、I/O驱动程序设计四、ARM的A/D接口驱动程序设计五、LCD的驱动程序设计六、触摸屏驱动程序设计嵌入式组件设计——驱动程序部分一、ARM的串行口驱动程序设计1.了解ARM的串行口通讯工作原理2.掌握ARM串行口的寄存器操作3.编程实现ARMUART(UniversalAsynchronousReceiverandTransmitter)通讯
串行通信概述
串行数据传送模式:单工半双工全双工串行通信方式:异步通信同步通信异步通信必须遵循的3项规定为:1.字符的格式2.波特率3.校验位初始化:设置波特率、停止位、奇偶校验、数据位等参数设置是否启用中断方式,包括接收数据中断和发送数据中断ARM如何实现串口功能熟悉串口通讯原理查阅ARM串口寄存器文档(包括控制、状态和数据寄存器)3.查阅电平转换芯片资料(max3232)4.设计硬件电路图5.设计串口驱动(包括串口寄存器初始化,发送接收函数等)串行工作原理1.串行的方式 异步串行I/O异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线
图1串行通信字符格式
波特率表示每秒传送的二进制位数。如数据传送速率为120字符/秒,一个字符为10位,则波特率为120×10=1200波特。接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:1)奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。2)帧格式错:一个字符从起始位到停止位的总位数不对。3)溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。每一种错误都会给出相应的出错信息,提示用户处理。2、物理层标准 EIA标准:RS-232C ARM电平标准:TTL
电平转换芯片:MAX3232EIARS-232C:美国电子工业协会推荐的一种标准(ElectronicindustriesAssociationRecommendedStandard)。
它在一种25针接插件(DB-25)上定义了串行通信的有关信号。
⑴信号连线图2实用RS-232C连线
⑵信号电平规定RS-232C规定了双极性的信号逻辑电平:-3V到-25V之间的电平表示逻辑“1”。+3V到+25V之间的电平表示逻辑“0”。因此这是一套负逻辑定义。
MAX3232完成EIA电平与
TTL电平双向转换
基于ARM的嵌入式硬件平台体系结构基于ARM架构的32位微处理器SamsungS3C24102MBNORFlash(BIOS)8MBSDRM(系统内存)16MBNANDFlash(硬盘)USB接口USBN9603两个RS-232串行通信接口JTAG调试端口LCD显示键盘输入TCP/IP协议CANBUSARM2410开发平台串口硬件原理图RS-232只能代表通信的物理介质层和链路层,如果要实现数据的双向访问,就必须自己编写通信应用程序。UART收发数据是通过从存储器或I/O端口位置进行读写操作来实现的。通过监控UART状态寄存器中的比特位可以判断字节何时被接收。另一个比特位可用于判断字节何时通过接口传输。这种监控UART状态的方式称为查询方法。S3C2410的每个UART都有7个状态信号:接收FIFO/缓冲区数据准备好、发送FIFO/缓冲区空、发送移位寄存器空、溢出错误、奇偶校验错误、帧错误和中止,所有这些状态都由对应的UART状态寄存器(UTRSTATn/UERSTATn)中的相应位来表现。当接收器要将接收移位寄存器的数据送到接收FIFO,它会激活接收FIFO满状态信号,如果控制寄存器中的接收模式选为中断模式,就会引发接收中断。当发送器从发送FIFO中取出数据送到发送移位寄存器,那么FIFO空状态信号将会被激活。如果控制寄存器中的发送模式选为中断模式,就会引发发送中断。
与FIFO有关的中断
类型FIFO类型非FIFO模式Rx中断每当接收数据达到接收FIFO触发的水平,就产生接收中断;如果FIFO非空且连续3个字时间没有接收到任何数据,就产生超时中断每当接收数据满,接收移位寄存器将产生一个中断Tx中断每当发送数据达到发送FIFO触发的水平,就产生发送中断每当发送数据空,发送保持寄存器将产生一个中断错误中断帧错误、奇偶校验错误和被检测到并按字节接收的中止信号,都将产生错误中断;当达到接收FIFO的顶部,就会产生溢出错误中断所有错误都会立即产生一个错误中断。但两个错误同时发生,只有一个中断会产生
波特率发生器
波特率发生器以MCLK作为时钟源
每个UART的波特率发生器为传输提供了串行移位时钟。波特率时钟由通过时钟源的16分频及一个由UART波特率除数寄存器(UBRDIVn)指定的16位除数决定。
UBRDIVn=(取整)(MCLK/(波特率×16))-1
回送模式与红外通信模式回送模式:S3C2410的UART提供的一个测试模式。在这种模式下,发送出的数据会立即被接收。这一特性用于校验运行处理器内部发送和接收通道的功能,这种模式可以通过设置UART控制寄存器(UCONn)中的回送位来实现。红外通信模式:S3C2410的UART模块支持红外线(IR)发送和接收。可以通过设置UART控制寄存器(UCONn)中的红外模式位来选择这一模式。ARM串行口寄存器:(1)ULCONn: UART线性控制寄存器(2)UCONn
: UART控制寄存器(3)UFCONn: FIFO控制寄存器(4)UMCON:MODEM控制寄存器(5)UTRSTATn:发送/接收状态寄存器
(6)UERSTATn
:错误状态寄存器(7)UFSTAT:FIFO状态寄存器(8)UMSTAT:MODEM状态寄存器(9)UTXH
: 数据发送寄存器(10)URXH
: 数据接收寄存器(11)UBRDIVn
: 波特率除数因子寄存器3、ARM自带的串行口寄存器ARM自带两个串行口,各带16字节的FIFO(先入先出寄存器),最大波特率115.2kbps。ARM内部UART控制器的结构图UART的操作分为:数据发送、数据接收、产生中断、产生波特率、红外模式.数据发送:发送数据帧格式可以编程设置。包含起始位、5~8个数据位,可选的奇偶校验位以及1~2位停止位。这些通过UART的控制寄存器ULCONn来设置.数据接收:同发送一样.UART7种状态中检测溢出出错、奇偶校验出错、帧出错等出错检测,并可设置相应的错误标志,通过错误状态寄存器UERSTATn来设置.接收缓冲区准备好、发送缓冲区空、发送移位缓冲器空通过读写状态寄存器UTRSTATn来设置.寄存器地址读/写描述
复位值ULCON00x01D00000
读/写串口0线性控制寄存器0x00ULCON10x01D04000读/写串口1线性控制寄存器0x00与UART有关的寄存器主要有以下几个:(1)UART线性控制寄存器ULCONn表2-1ULCONn功能定义ULCONn位描述初始化状态保留[7]
0红外模式[6]红外模式位决定是否使用红外模式:0—正常模式;1—红外模式0奇偶校验模式[5:3]奇偶校验模式指定当UART执行发送和接收操作时如何进行奇偶校验的产生和检查:0xx—无奇偶校验;100—奇校验;110=奇偶校验强制为1;111=奇偶校验强制为0000停止位个数[2]每帧停止位的个数:0—1位;1—两位。0数据位长度[1:0]字长位决定每帧发送或接收的数据位数:00—5位;01—6位;10—7位;11—8位;
00参考设置:普通模式,无奇偶校验,1位停止位,8为数据长度。参考设置:Tx电平触发,Rx边沿触发,禁止接收超时中断,允许接收错误中断,发送和接受模式均为01(2)UART控制寄存器UCONn
RegisterAddressR/WDescriptionResetValue
UCON0
0x01D00004
R/W
UARTchannel0controlregister0x00UCON10x01D04004
R/W
UARTchannel1controlregister0x00在发送缓冲区为空时由电平引发中断在发送缓冲区为空时由脉冲边沿引发中断接收缓冲区接收数据时由电平引发中断接收缓冲区接收到数据时由脉冲边沿引发中断决定UARTFIFO模式。其中UFCONn的第0位决定是否启用FIFO。
(3)UARTFIFO控制寄存器UFCONn(4)UARTMODEM控制寄存器UMCONn决定MODEM的模式,UMCONn的第0位是请求发送位显示芯片目前的读写(接收/发送)状态(5)读写状态寄存器
UTRSTATn显示芯片目前的错误状态(6)错误状态寄存器UERSTATn(7)UARTFIFO状态寄存器UFSTATnFIFO状态寄存器UFSTAT可以读出目前FIFO是否满以及其中的字节数;MODEM状态寄存器UMSTAT可以读出目前MODEM的CTS状态。
(8)UARTMODEM状态寄存器UMSTATn(9)数据发送寄存器UTXHn数据发送寄存器存放着发送的数据。一次发送8位数据。数据接收寄存器存放着接收的数据。一次接收8位数据。(10)数据接收寄存器URXHn需要注意的是在发生溢出错误的时候,接收的数据必须要被读出来,否则会引发下次溢出错误。(11)串口波特率设置寄存器UBRDIVn波特率因子计算公式如下:UBRDIVn=(round_off)(MCLK/(bps×16))-1其中MCLK是系统频率,例如在40MHz的情况下,当波特率取115200时,UBRDIVn=(int)(40000000/(115200×16)+0.5-1=(int)(21.7+0.5)-1=22-1=21编写串口驱动函数主函数串口初始化发送数据接收数据从串口读取数据向串口发送数据串口初始化编写串口驱动函数串口初始化UFCONn、UMCONn编写串口驱动函数发送数据接收数据/*44b.hUART的全部功能寄存器*/#definerULCON0 (*(volatileunsigned*)0x1d00000)#definerULCON1 (*(volatileunsigned*)0x1d04000)#definerUCON0 (*(volatileunsigned*)0x1d00004)#definerUCON1 (*(volatileunsigned*)0x1d04004)#definerUFCON0 (*(volatileunsigned*)0x1d00008)#definerUFCON1 (*(volatileunsigned*)0x1d04008)#definerUMCON0 (*(volatileunsigned*)0x1d0000c)#definerUMCON1 (*(volatileunsigned*)0x1d0400c)#definerUTRSTAT0 (*(volatileunsigned*)0x1d00010)#definerUTRSTAT1 (*(volatileunsigned*)0x1d04010)#definerUERSTAT0 (*(volatileunsigned*)0x1d00014)#definerUERSTAT1 (*(volatileunsigned*)0x1d04014)#definerUFSTAT0 (*(volatileunsigned*)0x1d00018)#definerUFSTAT1 (*(volatileunsigned*)0x1d04018)#definerUMSTAT0 (*(volatileunsigned*)0x1d0001c)#definerUMSTAT1 (*(volatileunsigned*)0x1d0401c)#definerUBRDIV0(*(volatileunsigned*)0x1d00028)#definerUBRDIV1(*(volatileunsigned*)0x1d04028)1.不带操作系统的ARM实现串行功能voidUart_Init(intUartnum,intmclk,intbaud)//初始化函数,端口号,时钟,波特率{inti; if(mclk==0) mclk=MCLK; if(Uartnum==0){//UART0 rUFCON0=0x0;//FIFOdisable rUMCON0=0x0;//UART0 rULCON0=0x3;//Normal,Noparity,1stop,8bit rUCON0=0x245;//rx=edge,tx=level,disabletimeoutint.,enablerx //errorint.,normal,interruptorpolling rUBRDIV0=((int)(mclk/16./baud+0.5)-1); } else{ rUFCON1=0x0;rUMCON1=0x0;//UART1 rULCON1=0x3; rUCON1=0x245; rUBRDIV1=((int)(mclk/16./baud+0.5)-1); } for(i=0;i<100;i++);}#defineMCLK(60000000)#include"..\startup\44b.h"#include"..\inc\44blib.h"#include"..\inc\def.h“#include<stdarg.h>/*44blib.c*/staticintwhichUart=0;voidUart_Select(intch){whichUart=ch;}charUart_Getch(void){if(whichUart==0){ while(!(rUTRSTAT0&0x1));//ReceivedatareadreturnRdURXH0();}else{while(!(rUTRSTAT1&0x1));//ReceivedatareadyreturnrURXH1;}}voidUart_SendByte(intdata){if(whichUart==0){ if(data=='\n') { while(!(rUTRSTAT0&0x2)); Delay(10); //becausetheslowresponseofhyper_terminal WrUTXH0('\r'); } while(!(rUTRSTAT0&0x2));//WaituntilTHRisempty. Delay(10); WrUTXH0(data);}else{ if(data=='\n') { while(!(rUTRSTAT1&0x2)); Delay(10); //becausetheslowresponseofhyper_terminal rUTXH1='\r'; } while(!(rUTRSTAT1&0x2));//WaituntilTHRisempty. Delay(10); rUTXH1=data;} } voidUart_SendString(intUartnum,char*pt)//发送字符串函数,端口号,发送数组{while(*pt){ if(*pt=='\n'){ Uart_SendByte(Uartnum,'\r'); Uart_SendByte(Uartnum,*pt++); } else Uart_SendByte(Uartnum,*pt++);}}voidUart_Printf(char*fmt,...)//串行口发送字符串函数,仅向口0发送{ va_listap; charstring[256]; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart_SendString(0,string); va_end(ap);}charUart_GetKey(void){if(whichUart==0){ if(rUTRSTAT0&0x1)//Receivedataready returnRdURXH0();else return0;}else{if(rUTRSTAT1&0x1)//Receivedataready returnrURXH1;else return0;}}voidDelay(inttime){for(;time>0;time--);}⑷在主函数中首先初始化串行口0,然后通过串行口0向外发送字符"U"。/**********************串行口发送主程序************************/#include"..\startup\44b.h"#include"..\inc\44blib.h"#include"..\inc\def.h"intMain(intargc,char**argv){ charc1; Uart_Init(0,115200); while(1) { Uart_SendByte(0xa); Uart_SendByte(0xd); c1=Uart_Getch(); Uart_SendByte(c1); } return0;}2.带操作系统的ARM实现串行口功能当操作系统启动时,将自动初始化各串行口,所以应用程序调用串行口资源将变得非常容易。应用程序往往是多任务系统,为了实时监测串行口信息,在本操作环境中必须单开一个串行口扫描任务,保证信息不丢失。串行口扫描任务的代码如下:voidUart_Scan_Task1(void*Id){ charc1; POSMSGpmsg1; for(;;){ if(Uart_Getch(&c1,0,1)) { pmsg1=OSCreateMessage(NULL,OSM_SERIAL,0,c1); if(pmsg1) SendMessage(pmsg1); } }}//Uart_Scan_TaskPOSMSGOSCreateMessage(POS_CtrlpOSCtrl,U32Message,U32wparam,U32lparam)向指定的控件创建消息,返回指向消息的指针(2)当系统收到串行口信息时,将会自动向主任务发送一个串行口消息。主任务接收到该消息,将会调用响应函数,响应该消息。添加消息响应函数的代码如下:voidonSerial(intportn,charc){ LCD_ChangeMode(DspTxtMode); LCD_printf("%c\n",c); Uart_SendByte(0,c);}小组讨论1:MCS-51单片机的串行通信口驱动程序设计串口控制寄存器SCON(98H)SM0SM1SM2RENTB8RB8TIRI电源控制寄存器PCON(87H)SMOD
-GF1GF0PDIDL
-
-RI接收中断标志TI发送中断标志RB8接收数据第9位TB8发送数据第9位REN接收控制SM2多机通信SM0,SM1工作方式控制1允许0不允许IDL空闲控制位0正常1空闲PD掉电控制位0正常1掉电SMOD波特率选择位1:方式1,2,3波特率加倍
0:复位SM0SM1工作方式说明
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 猜拳游戏毕业论文
- 防洪堤坡面防护加固施工方案
- 《二次根式的加减》数学课件教案
- 【9数一模】2026年安徽合肥市包河区九年级中考一模数学试卷
- 2026《西游记》阅读测试题(带答案)解析
- 电刺激疗法对脑卒中后运动功能障碍康复的研究进展
- 2026年吉林高考文科综合题库含答案
- 2026年高考地理新高考一卷试题及答案
- 2023年诚信的演讲稿
- 2026年安徽省重点学校高一数学分班考试试题及答案
- 贵州省六盘水市2025-2026学年九年级上学期期末语文试题(含答案)
- 一年级数学5以内加减法计算专项练习题(每日一练共42份)
- 2026年山西云时代技术有限公司校园招聘笔试备考题库及答案解析
- 数字孪生智慧管网监测系统构建课题申报书
- 统编版(新版)道德与法治八年级下册课件13.1全面依法治国的指导思想
- 3.长方体和正方体(单元测试)2025-2026学年五年级数学下册人教版(含答案)
- 2023学年完整公开课版船舶防污漆
- 抗菌药物临床应用指导原则(2015版)
- 包装危险货物技术说明书
- 石灰石矿山破碎系统施工方案
- 新教材人教版2019年高中生物课本课后问题参考答案(全集)
评论
0/150
提交评论