《串口UART及编程PPT》由会员分享,可在线阅读,更多相关《串口UART及编程PPT(33页珍藏版)》请在金锄头文库上搜索。
1、第六章S3C2410的串口UART及编程 1 2020 6 16 6 1S3C2410的串口UART概述 6 1 1S3C2410串行通信 UART 单元S3C2410UART单元提供3个独立的异步串行通信接口 皆可工作于中断和DMA模式 使用系统时钟最高波特率达230 4kb s 如果使用外部设备提供的时钟 可以达到更高的速率 每一个UART单元包含一个16字节的FIFO发送缓冲器和一个16字节的FIFO接收缓冲器 用于数据的接收和发送 S3C2410XUART支持可编程波特率 红外发送 接收 只UART2 1个或2个停止位 5位 6位 7位 8位数据宽度和奇偶校验 2 2020 6 16
2、6 1 2波特率的产生 波特率由一个专用的UART波特率分频寄存器 UBRDIVn n 0 2 控制 计算公式如下UBRDIVn int ULK 波特率 16 1或者UBRDIVn int PLK 波特率 16 1 3 2020 6 16 6 1 3UART通信操作 下面简略介绍UART操作 关于数据发送 数据接收 中断产生 波特率产生 查询检测模式 红外模式和自动流控制的详细介绍 请参照相关教材和数据手册 发送数据帧是可编程的 一个数据帧包含1个起始位 5 8个数据位 1个可选的奇偶校验位和1 2位停止位 停止位位数通过行控制寄存器ULCONn配置 4 2020 6 16 6 2UART的控
3、制寄存器 6 2 1UART线路控制寄存器ULCONn该寄存器的位6决定是否使用红外模式 位5 位4和位3决定校验方式 位2决定停止位长度 位1和位0决定每帧的数据位数 具体如表6 1所示 5 2020 6 16 6 2020 6 16 6 2 2UART控制寄存器UCONn该寄存器决定UART的各种模式 见表6 2所示 7 2020 6 16 6 2 3UARTFIFO控制寄存器UFCONn S3C2410UART每通道有16个字节的先入先出 FIFO 接收缓冲器和16个字节的先入先出 FIFO 发送缓冲器 如果在程序中使用它们 必须要对UARTFIFO控制寄存器UFCONn进行定义 UFC
4、ONn的配置如表6 3所示 8 2020 6 16 9 2020 6 16 6 2 4UART调制解调器控制寄存器UMCONn n 0或1 10 2020 6 16 6 2 5发送寄存器UTXH和接收寄存器URXH 这两个寄存器存放发送和接收的数据 当然只有1字节 8位数据 需要注意的是 在发生溢出错误时 接收的数据必须被读出来 否则会引发下次溢出错误 11 2020 6 16 6 2 6UARTTX RX状态寄存器UTRSTATUARTTX RX状态寄存器UTRSTAT配置见表6 5 12 2020 6 16 6 3UART通信程序例子 UART通信电平可有三种形式 TTL电平 RS232或
5、RS485 嵌入式控制系统大多具有小 巧 轻 灵 薄的特点 许多传感器和S3C2410一体或距离很近 没有干扰 例如多参数监护仪等医疗设备 为简化电路 可采用TTL电平直接与S3C2410相连 如果通信距离在几十米左右并是点对点通信可采用RS232接口 否则只能采用RS485通信 在工程上UART通信大多采用三线制 发送连对方接收 接收连对方发送 双方共地 本节在介绍RS232接口电路的同时给出了一个UART通信程序实例 13 2020 6 16 6 3 1RS232接口电路 本实验平台的电路中 UART0与S3C2410连接电路如图6 1所示 UART0只采用两根接线RXD0和TXD0 RS
6、232只能实现点对点通信 且两点要共地 因此只能进行简单的数据传输及接收 UART0采用美信332电平转换器 MAX332 做电平转换 14 2020 6 16 图6 1UART0X与S3C2410的连接电路图 15 2020 6 16 6 3 2UART实验程序 头文件uart0 h defineTX INTTYPE1 1 发送中断电平触发标志 defineRX INTTYPE1 1 接收中断电平触发标志externvoidUart Port Set void 保存本程序使用的端口原状态externvoidUart Port Return void 恢复本程序使用的端口原状态externvo
7、idUart Uclk En int int 串行通信使用UCLKexternvoidUart Pclk En int int 串行通信使用PCLKvoidTest Uart0 Int void UART0初始化 UART实验程序 16 2020 6 16 include include include 2410addr h include 2410lib h include def h include uart0 h voidUart Port Set void voidUart Port Return void void irqUart0 TxInt void 发送中断服务程序void i
8、rqUart0 RxIntOrErr void 接收字符和错误代码中断服务程序void sub Uart0 RxInt void 接收字符子中断服务程序 从上面程序分出volatileU32save rGPHCON save rGPHDAT save rGPHUP volatileU32save ULCON0 save UCON0 save UFCON0 save UMCON0 17 2020 6 16 定义一些变量 做临时保存端口数据和状态的缓冲区 通信结束 端口数据和状态要恢复 VolatileU32isTxintisRxint 定义二个变量 分别做发送和接收中断结束与否标志volatil
9、estaticchar uart0TxStr UART0发送字串地址volatilestaticchar uart0RxStr UART0接收字串地址 保存UART实验使用的端口和寄存器 voidUart Port Set void 保存H口控制寄存器save rGPHCON rGPHCON save rGPHDAT rGPHDAT save rGPHUP rGPHUP 配置UART口rGPHCON 18 2020 6 16 rGPHCON 0 x2faaa H口控制寄存器nRTS1 nCTS1功能使能rGPHUP 0 x1ff Uart口上拉禁止 rINTSUBMSK 0 x7ff 屏蔽全部
10、子中断save ULCON0 rULCON0 保存UART控制寄存器save UCON0 rUCON0 save UFCON0 rUFCON0 save UMCON0 rUMCON0 InitializeUART0 port 恢复UART实验使用的端口和寄存器 voidUart Port Return void 19 2020 6 16 PopUARTGPIOportconfigurationrGPHCON save rGPHCON rGPHDAT save rGPHDAT rGPHUP save rGPHUP PopUartcontrolregistersrULCON0 save ULCON
11、0 rUCON0 save UCON0 rUFCON0 save UFCON0 rUMCON0 save UMCON0 UART通信使用UCLK做波特率发生器 20 2020 6 16 voidUart Uclk En intch intbaud intch baud Uart Printf nSelectUARTchannel 0 UART0 1 UART1 2 UART2 n ch Uart GetIntNum 从键盘读通道号Uart Printf nSelectbaudrate n baud Uart GetIntNum 从键盘读波特率if ch 0 选UART0Uart Select
12、0 rUCON0 0 x400 选UCLKrUBRDIV0 int UCLK 16 baud 1 波特率因子寄存器Uart Printf UCLKisenabledbyUART0 n for i 0 i 100 i 21 2020 6 16 UART实验使用PCLK voidUart Pclk En intch intbaud intch baud Uart Printf nSelectUARTchannel 0 UART0 1 UART1 2 UART2 n ch Uart GetIntNum Uart Printf nSelectbaudrate n baud Uart GetIntNum
13、 if ch 0 选UART0Uart Select 0 22 2020 6 16 rUCON0 屏蔽接收和发送以及错误子中断 23 2020 6 16 if uart0TxStr 0 判发送字串结束标志 如果没结束 WrUTXH0 uart0TxStr 向发送缓冲器送下一字节ClearPending BIT UART0 清中断挂起寄存器rSUBSRCPND BIT SUB TXD0 清子中断挂起寄存器rINTSUBMSK UART0子中断屏蔽 24 2020 6 16 UART0接收字符和错误代码中断服务程序 void irqUart0 RxIntOrErr void rINTSUBMSK
14、BIT SUB RXD0 BIT SUB TXD0 BIT SUB ERR0 屏蔽接收和发送以及错误子中断 if rSUBSRCPND 打开屏蔽 接收下一数据 25 2020 6 16 UART0正常中断接收子程序 void sub Uart0 RxInt void if RdURXH0 r 判接收缓冲器字符是否结束标志 不是 正常接收 Uart Printf c RdURXH0 在终端上显示接收到的字符 uart0RxStr char RdURXH0 字符放接收缓冲区 else 如结束 isRxInt 0 置接收结束标志 uart0RxStr 0 接收字串后加一个 0 Uart Printf
15、 n 26 2020 6 16 UART0接收中断错误处理 void sub Uart0 RxErrInt void 根据错误号处理switch rUERSTAT0 toclearandcheckthestatusofregisterbits case 1 Uart Printf Overrunerror n 超时错break case 2 Uart Printf Parityerror n 效验错break case 4 Uart Printf Frameerror n 格式错break case 8 Uart Printf Breakedetect n 中断错break default 2
16、7 2020 6 16 break UART0发送和接收中断实验 voidTest Uart0 Int void Uart Port Set 保存I O口状态和数据 实验结束恢复Uart Select 0 选UART0 UART0发送中断实验isTxInt 1 置发送中断标志 中断结束 isTxInt 0 28 2020 6 16 uart0TxStr ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 UART0Txinterrupttestisgood r n 发送的实验字串Uart Printf Uartchannel0TxInterruptTest n 在终端上提示pISR UART0 unsigned Uart0 TxInt 设中断向量 即发送中断服务程序入口rULCON0 0 6 0 3 0 2 3 正常发送 无效验 一个停止位 8个数据位选UCLK rUCON0 从此处进入中断 中断结束又返回这里等下次中断 直到发送结束 29 2020 6 16 isTxInt 0跳出 在超级终端上可看到发给它的字符 UART0接收中断实验 UART0接收从键盘上输