




已阅读5页,还剩58页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章S3C2410的串口UART及编程 6 1S3C2410的串口UART概述6 1 1S3C2410异步串行通信 UART 单元S3C2410UART单元提供3个独立的异步串行通信接口 皆可工作于查询 中断和DMA模式 使用系统时钟最高波特率达230 4kb s 如果使用外部设备提供的时钟 可以达到更高的速率 每一个UART单元包含一个16字节的FIFO FirstInputFirstOutput 先进先出移位寄存器 用于数据的接收和发送 S3C2410UART支持可编程波特率 红外发送 接收 UART2 1个或2个停止位 5位 6位 7位 8位数据宽度和奇偶校验 6 1 2波特率的产生波特率由一个专用的UART波特率分频寄存器 UBRDIVn 控制 UBRDIVn值计算公如下 UBRDIVn int ULK 波特率 16 1或者UBRDIVn int PLK 波特率 16 1式中 时钟选用ULK还是PLK由UART控制寄存器UCONn 10 的状态决定 如果UCONn 10 0 则用PLK作为波特率发生器的时钟源频率 否则选用ULK作为波特率发生器的时钟源频率 UBRDIVn的值必须在1 216 1 之间 例如 若ULK或者PLK等于40MHz 当波特率为115200b s时 则UBRDIVn int 40000000 115200 16 一1 int 21 7 1 21 1 20 6 1 3UART通信操作下面简略介绍UART操作 关于数据发送 数据接收 中断产生 波特率产生 查询检测模式 红外模式的详细介绍 参见下面6 3节 发送数据帧是可编程的 一个数据帧包含1个起始位 5 8个数据位 1个可选的奇偶校验位和1 2位停止位 停止位通过行控制寄存器ULCONn配置 与发送数据帧类似 接收数据帧也是可编程的 接收帧由1个起始位 5 8个数据位 l个可选的奇偶校验位以及1 2位行控制寄存器ULCONn中设定的停止位组成 接收器还可以检测溢出错 奇偶校验错 帧错误和传输中断 每一个错误均可以设置一个错误标志 溢出错误 overrunerror 指已接收到的数据在读取之前被新接收的数据覆盖 奇偶校验错 指接收器检测到的校验和与设置的不符 帧错误 指没有接收到有效的停止位 传输中断 表示接收数据RxDn保持逻辑0超过一帧的传输时间 在FIFO模式下 如果RxFIFO非空 而在3个字的传输时间内没有接受到数据 则产生超时 6 2UART的控制寄存器6 2 1UART行控制寄存器ULCONn该寄存器的位6决定是否使用红外模式 位5 位4和位3决定校验方式 位2决定停止位长度 位1和位0决定每帧的数据位数 具体如下 ULCONn 7 保留 ULCONn 6 红外线模式 0 正常模式 1 红外线模式 ULCONn 5 3 校验模式 0 xx 无校验 100 奇校验 101 偶校验 ULCONn 2 停止位 0 一个停止位 1 二个停止位 ULCONn 1 0 数据位 00 5位 01 6位 10 7位 11 8位 6 2 2UART控制寄存器UCONn该寄存器决定UART的各种模式 UCONn 10 1 ULK做波特率发生器 0 PLK做波特率发生器 UCONn 9 1 Tx中断电平触发 0 Tx中断脉冲触发 UCONn 8 1 Rx中断电平触发 0 Rx中断脉冲触发 UCONn 7 1 接收超时中断允许 0 接收超时中断禁止 UCONn 6 1 产生接收错误中断 0 不产生接收错误中断 UCONn 5 l 发送直接传给接收方式 loopback 0 正常模式 UCONn 4 1 发送间断信号 0 正常模式发送 UCONn 3 2 发送模式选择 00 禁止发送 01 中断或查询模式 10 DMA0请求 UART0 DMA3请求 UART2 11 DMAl请求 UART1 UCONn 1 0 接收模式选择 00 禁止接收 01 中断或查询模式 10 DMA0请求UART0 DMA2请求UART2 11 DMAl请求UART1 6 2 3UARTFIFO控制寄存器UFCONnUFCONn 7 6 00 TxFIFO寄存器中有0字节就触发中断 01 TxFIFO寄存器中有4字节就触发中断 10 TxFIFO寄存器中有8字节就触发中断 11 TxFIFO寄存器中有12字节就触发中断 UFCONn 5 4 00 RxFIFO寄存器中有4字节就触发中断 01 RxFIFO寄存器中有8字节就触发中断 10 RxFIFO寄存器中有12字节就触发中断 11 RxFIFO寄存器中有16字节就触发中断 UFCONn 3 保留 UFCONn 2 1 FIFO复位清零TxFIFO 0 FIFO复位不清零TxFIFO UFCONn 1 1 FIFO复位清零RxFIFO 0 F1FO复位不清零RxFIFO UFCONn 0 1 允许FIFO功能 0 禁止FIFO功能 6 2 4UARTMODEM控制寄存器UMCONnUMCONn 7 5 保留 必须全为0 UMCONn 4 1 允许使用AFC模式 0 禁止使用AFC模式 UMCONn 3 保留 必须全为0 UMCONn 0 1 激活rRTS 0 不激活rRTS 6 2 5发送寄存器UTXH和接收寄存器URXH这两个寄存器存放发送和接收的数据 当然只有1字节 8位数据 需要注意的是 在发生溢出错误时 接收的数据必须被读出来 否则会引发下次溢出错误 6 2 6发送和接收状态寄存器UTRSTATnUTRSTATn发送和接收状态寄存器包括UTRSTAT0 UTRSTAT1andUTRSTAT2UTRSTATn寄存器各位定义 UTRSTATn 1 发送缓冲器空标志0 不空 1 空 UTRSTATn 0 接收缓冲器有接收数据标志0 空 1 接收缓冲器有数据 6 2 7波特率分频寄存器UBRDIV波特率分频寄存器UBRDIV的定义和使用在6 1 2中已叙述 不再重复 6 2 8UART单元各寄存器的定义在随书提供的软件包2410test中 在2410addr h文件中有关于UART单元各寄存器的定义 UART definerULCON0 volatileunsigned 0 x50000000 UART0Linecontrol definerUCON0 volatileunsigned 0 x50000004 UART0control definerUFCON0 volatileunsigned 0 x50000008 UART0FIFOcontrol definerUMCON0 volatileunsigned 0 x5000000c UART0Modemcontrol definerUTRSTAT0 volatileunsigned 0 x50000010 UART0Tx Rxstatus definerUERSTAT0 volatileunsigned 0 x50000014 UART0Rxerrorstatus definerUFSTAT0 volatileunsigned 0 x50000018 UART0FIFOstatus definerUMSTAT0 volatileunsigned 0 x5000001c UART0Modemstatus definerUBRDIV0 volatileunsigned 0 x50000028 UART0Baudratediviaor definerULCON1 volatileunsigned 0 x50004000 UART1Linecontrol definerUCON1 volatileunsigned 0 x50004004 UART1Control definerUFCON1 volatileunsigned 0 x50004008 UART1FIFOcontrol definerUMCON1 volatileunsigned 0 x5000400c UART1Modemcontrol definerUTRSTAT1 volatileunsigned 0 x50004010 UART1Tx Rxstatus definerUERSTAT1 volatileunsigned 0 x50004014 UART1Rxerrorstatus definerUFSTAT1 volatileunsigned 0 x50004018 UART1FIFOstatus definerUMSTAT1 volatileunsigned 0 x5000401c UART1Modemstatus definerUBRDIV1 volatileunsigned 0 x50004028 UART1Baudratedivisor definerULCON2 volatileunsigned 0 x50008000 UART2Linecontrol definerUCON2 volatileunsigned 0 x50008004 UART2Control definerUFCON2 volatileunsigned 0 x50008008 UART2FIFOcontrol definerUMCON2 volatileunsigned 0 x5000800c UART2Modemcontrol definerUTRSTAT2 volatileunsigned 0 x50008010 UART2Tx Rxstatus definerUERSTAT2 volatileunsigned 0 x50008014 UART2Rxerrorstatus definerUFSTAT2 volatileunsigned 0 x50008018 UART2FIFOstatus definerUMSTAT2 volatileunsigned 0 x5000801c UART2Modemstatus definerUBRDIV2 volatileunsigned 0 x50008028 UART2Baudratedivisor ifdef BIG ENDIAN definerUTXH0 volatileunsignedchar 0 x50000023 UART0TransmissionHold definerURXH0 volatileunsignedchar 0 x50000027 UART0Receivebuffer definerUTXH1 volatileunsignedchar 0 x50004023 UART1TransmissionHold definerURXH1 volatileunsignedchar 0 x50004027 UART1Receivebuffer definerUTXH2 volatileunsignedchar 0 x50008023 UART2TransmissionHold definerURXH2 volatileunsignedchar 0 x50008027 UART2Receivebuffer defineWrUTXH0 ch volatileunsignedchar 0 x50000023 unsignedchar ch defineRdURXH0 volatileunsignedchar 0 x50000027 defineWrUTXH1 ch volatileunsignedchar 0 x50004023 unsignedchar ch defineRdURXH1 volatileunsignedchar 0 x50004027 defineWrUTXH20 ch volatileunsignedchar 0 x50008023 unsignedchar ch defineRdURXH2 volatileunsignedchar 0 x50008027 difineUTXH0 0 x50000020 3 Byte accessaddressbyDMA defineURXH0 0 x50000024 3 difineUTXH1 0 x50004020 3 defineURXH1 0 x50004024 3 difineUTXH2 0 x50008020 3 defineURXH2 0 x50008024 3 else LittleEndian definerUTXH0 volatileunsignedchar 0 x50000020 UART0TransmissionHold definerURXH0 volatileunsignedchar 0 x50000024 UART0Receivebuffer definerUTXH1 volatileunsignedchar 0 x50004020 UART1TransmissionHold definerURXH1 volatileunsignedchar 0 x50004024 UART1Receivebuffer definerUTXH2 volatileunsignedchar 0 x50000820 UART2TransmissionHold definerURXH2 volatileunsignedchar 0 x50008024 UART2Receivebuffer defineWrUTXH0 ch volatileunsignedchar 0 x50000020 unsignedchar ch defineRdURXH0 volatileunsignedchar 0 x50000024 defineWrUTXH1 ch volatileunsignedchar 0 x50004020 unsignedchar ch defineRdURXH1 volatileunsignedchar 0 x50004024 defineWrUTXH2 ch volatileunsignedchar 0 x50008020 unsignedchar ch defineRdURXH2 volatileunsignedchar 0 x50008024 difineUTXH0 0 x50000020 3 Byte accessaddressbyDMA defineURXH0 0 x50000024 3 difineUTXH1 0 x50004020 3 defineURXH1 0 x50004024 3 difineUTXH2 0 x50008020 3 defineURXH2 0 x50008024 3 endif 6 3UART通信程序编写6 3 1通信程序编写步骤UART通信程序可以采用查询 中断和DMA模式 我们通过使用较多的中断方式来介UART通信程序的编写 简单做法是 UART通信程序的编写参照例子程序 选通道 通过函数Uart Select 选UART0 UART2 选波特率和波特率发生器时钟 选波特率通过函数Uart Pclk En intch intbaud 或Uart Pclk En intch intbaud 来进行 时钟选UCLK rUCON0 0 x400 时钟选PCLK rUCON0 通信控制字 rUCON0 设定 如时钟选ULK做波特率发生器 Tx中断脉冲触发 Rx中断脉冲触发 接收超时中断允许 产生接收错误中断 正常模式发送 rUCON0 TX INTTYPE 9 RX INTTYPE 8 0 7 0 6 0 5 0 4 1 2 1 I O口初始化 因为UART通信使用H口的第二功能 所以H口要上拉禁止 rGPHUP 0 x1ff H口控制寄存器nRTS1 nCTS1功能使能 rGPHCON 0 x3c0000 rGPHCON 0 x2faaa 设中断服务函数入口地址 把中断服务函数入口地址赋函数指针PISR UARTn 注意 接收中断服务函数入口地址和发送中断服务函数入口地址是一个 在中断服务函数中根据UTRSTATn 1 和UTRSTATn 0 状态决定是发送中断还是接收中断 打开总中断屏蔽和子中断屏蔽等待中断 rINTMSK BIT UART0 rINTSUBMSK BIT SUB TXD0 进入中断后 先屏蔽发送和接收中断 防止新来中断干扰我们的正常发送和接收 正常发送和接收结束后 清中断挂起和中断源挂起寄存器 ClearPending BIT UART0 rSUBSRCPND BIT SUB TXD0 发送 rSUBSRCPND BIT SUB RXD0 BIT SUB ERR0 接收 取消中断屏蔽 等下一次中断 6 3 2通信程序编写示例下面给出的几个函数 是查询方式URAT通信常用到的主要函数 包括URAT初始化 字符的发送 接收函数 希望大家仔细阅读 理解每一行的含义 1 UART通信 采用查询方式 引用头文件 include 2410addr h include 2410lib h include option h include def h include include include include include 函数声明voidUart Init intpclk intbaud charUart Getch void charUart GetKey void voidUart GetString char string voidUart SendByte intdata voidUart SendString char pt voidUart Select intch 串口初始化 输入PCLK 输入波特率 staticintwhichUart 0 voidUart Init intpclk intbaud inti if pclk 0 pclk PCLK rUFCON0 0 x0 UARTchannel0FIFOcontrolregister FIFOdisablerUFCON1 0 x0 UARTchannel1FIFOcontrolregister FIFOdisablerUFCON2 0 x0 UARTchannel2FIFOcontrolregister FIFOdisablerUMCON0 0 x0 UARTchaneel0MODEMcontrolregister AFCdisablerUMCON1 0 x0 UARTchaneel1MODEMcontrolregister AFCdisable UART0rULCON0 0 x3 Linecontrolregister Normal Noparity 1stop 8bits 00000011rUCON0 0 x245 Controlregister 10 9 8 7 6 5 4 3 2 1 0 ClockSel TxInt RxInt RxTimeOut Rxerr Loop back Sendbreak TransmitMode ReceiveMode01001000101 PCLK LevelPulseDisableGenerateNormalNormalInterruptorPolling rUBRDIV0 int pclk 16 baud 1 Baudratedivisiorregister0rUBRDIV0 int pclk 16 baud 0 5 1 Baudratedivisiorregister0 UART1rULCON1 0 x3 rUCON1 0 x245 rUBRDIV1 int pclk 16 baud 1 UART2rULCON2 0 x3 rUCON2 0 x245 rUBRDIV2 int pclk 16 baud 1 for i 0 i 100 i 选择串口通道 voidUart Select intch whichUart ch 等待发送移位寄存器空 voidUart TxEmpty intch if ch 0 while rUTRSTAT0 Waituntiltxshifterisempty 接收串口一字节数据 注意RdURXH0 RdURXH1 RdURXH2 的使用 charUart Getch void if whichUart 0 while rUTRSTAT0 elseif whichUart 2 while rUTRSTAT2 elseif whichUart 1 if rUTRSTAT1 串口得到字符串 voidUart GetString char string char string2 string charc while c Uart Getch r if c b if int string2 int string Uart Printf b b string else string c Uart SendByte c string 0 Uart SendByte n 得到串口初始号 intUart GetIntNum void charstr 30 char string str intbase 10 intminus 0 intresult 0 intlastIndex inti Uart GetString string if string 0 minus 1 string if string 0 0 if string lastIndex h string lastIndex H base 16 string lastIndex 0 lastIndex if base 10 result atoi string result minus 1 result result else for i 0 i lastIndex i if isalpha string i if isupper string i result result 4 string i A 10 elseresult result 4 string i a 10 elseresult result 4 string i 0 result minus 1 result result returnresult 串口发送字节 voidUart SendByte intdata if whichUart 0 if data n while rUTRSTAT0 elseif whichUart 1 if data n while rUTRSTAT1 elseif whichUart 2 if data n while rUTRSTAT2 串口发送字符串 voidUart SendString char pt while pt Uart SendByte pt 2 UART0中断方式发送和接收 UART0中断方式发送和接收 voidTest Uart0 Int void Uart Port Set Uart Select 0 UART0Txtestwithinterrupt isTxInt 1 uart0TxStr ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 UART0Txinterrupttestisgood r n Uart Printf Uartchannel0TxInterruptTest n pISR UART0 unsigned Uart0 TxInt rULCON0 0UCLKfuctionrUCON0 TX INTTYPE 9 RX INTTYPE 8 0 7 0 6 0 5 0 4 1 2 1 Clock Tx Def Rx Def Rxtimeout x Rxerrorint x Loop back x Sendbreak x Tx int Rx intUart TxEmpty 0 waituntiltxbufferisempty rINTMSK BIT UART0 rINTSUBMSK BIT SUB TXD0 while isTxInt UART0Rxtestwithinterrupt isRxInt 1 uart0RxStr char UARTBUFFER Uart Printf n Uartchannel0RxInterruptTest n Uart Printf AftertypingENTERkey youwillseethecharacterswhichwastypedbyyou Uart Printf nToquit pressENTERkey n Uart TxEmpty 0 waituntiltxbufferisempty pISR UART0 unsigned Uart0 RxIntOrErr rULCON0 0UCLKfuctionrUCON0 TX INTTYPE 9 RX INTTYPE 8 0 7 1 6 0 5 0 4 1 2 1 Clock Tx pulse Rx pulse Rx timeout x Rx errorint o Loop back x Sendbreak x Tx int Rx int ClearIntPendingandUnmaskClearPending BIT UART0 rINTMSK BIT UART0 rSUBSRCPND BIT SUB TXD0 BIT SUB RXD0 BIT SUB ERR0 rINTSUBMSK BIT SUB RXD0 BIT SUB ERR0 while isRxInt rINTSUBMSK BIT SUB RXD0 BIT SUB ERR0 rINTMSK BIT UART0 Uart Printf s n char UARTBUFFER Uart Port Return UART发送和接收用到的I O口保存和初始化 voidUart Port Set void PushUARTGPIOportconfigurationsave rGPHCON rGPHCON save rGPHDAT rGPHDAT save rGPHUP rGPHUP ConfigureUARTportrGPHCON SUBINTALLMASK PushUartcontrolregisters save ULCON0 rULCON0 save UCON0 rUCON0 save UFCON0 rUFCON0 save UMCON0 rUMCON0 save ULCON1 rULCON1 save UCON1 rUCON1 save UFCON1 rUFCON1 save UMCON1 rUMCON1 save ULCON2 rULCON2 save UCON2 rUCON2 save UFCON2 rUFCON2 save UMCON2 rUMCON2 InitializeUART1 2port UART发送和接收结束 用到的I O口恢复原来状态 voidUart Port Return void PopUARTGPIOportconfigurationrGPHCON save rGPHCON rGPHDAT save rGPHDAT rGPHUP save rGPHUP PopUartcontrolregistersrULCON0 save ULCON0 rUCON0 save UCON0 rUFCON0 save UFCON0 rUMCON0 save UMCON0 rULCON1 save ULCON1 rUCON1 save UCON1 rUFCON1 save UFCON1 rUMCON1 save UMCON1 rULCON2 save ULCON2 rUCON2 save UCON2 rUFCON2 save UFCON2 rUMCON2 save UMCON2 UART发送和接收使用UCLK 并计算rUBRDIV0和设定波特率 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 Uart Select 0 rUCON0 0 x400 SelectUCLKrUBRDIV0 int UCLK 16 baud 1 BaudratedivisiorregisterUart Printf UCLKisenabledbyUART0 n elseif ch 1 Uart Select 1 rUCON1 0 x400 SelectUCLKrUBRDIV1 int UCLK 16 baud 1 BaudratedivisiorregisterUart Select 0 Uart Printf UCLKisenabledbyUART1 n else Uart Select 2 rUCON2 0 x400 SelectUCLKrUBRDIV2 int UCLK 16 baud 1 BaudratedivisiorregisterUart Select 0 Uart Printf UCLKisenabledbyUART2 n for i 0 i 100 i Forthesatbleoperation UART发送和接收使用PCLK 并计算rUBRDIV0和设定波特率 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 if ch 0 Uart Select 0 rUCON0 elseif ch 1 Uart Select 1 rUCON1 0 x3ff SelectPCLKrUBRDIV1 int PCLK 16 baud 1 Baudratedivis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论