打印

LM3S811学习资料串口通讯

[复制链接]
4139|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lilihua0721|  楼主 | 2011-11-20 00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lilihua0721 于 2011-11-24 17:55 编辑

      以下是我学习LM3S811 UART模块的总结:使用UARTA函数介绍、对Stellaris系列UARTFIFO的认识,分别放在以下连续的三个楼层中!
一、使用UART库函数介绍
1 函数:UARTConfigSetExpClk( )
功能:UART配置(要求提供明确的时钟速率)
原型:void UARTConfigSetExpClk(unsigned long ulBase,unsigned long ulUARTClk,
unsigned long ulBaud,unsigned long ulConfig)
参数: ulBaseUART端口的基址,取值UART0_BASEUART1_BASEUART2_BASE
ulUARTClk:提供给UART模块的时钟速率,即系统时钟频率
ulBaud:期望设定的波特率
ulConfigUART端口的数据格式,取下列各组数值之间的“或运算”组合形式:
说明:数据字长度:UART_CONFIG_WLEN_8 // 8位数据
UART_CONFIG_WLEN_7 // 7位数据
       UART_CONFIG_WLEN_6 // 6位数据
UART_CONFIG_WLEN_5 // 5位数据
停止位:UART_CONFIG_STOP_ONE // 1个停止位
UART_CONFIG_STOP_TWO // 2个停止位(可降低误码率)
校验位:UART_CONFIG_PAR_NONE // 无校验
UART_CONFIG_PAR_EVEN // 偶校验
UART_CONFIG_PAR_ODD // 奇校验
      UART_CONFIG_PAR_ONE // 校验位恒为1
UART_CONFIG_PAR_ZERO // 校验位恒为0

2 函数:UARTConfigSet( )
功能:UART配置(自动获取时钟速率)
原型:#define UARTConfigSet(a, b, c) UARTConfigSetExpClk(a, SysCtlClockGet( ), b, c)
参数:详见UARTConfigSetExpClk函数描述
返回:无
说明:本宏函数常常用来代替函数UARTConfigSetExpClk( ),在调用之前应当先调用SysCtlClockSet( )函数设置系统时钟(不要使用误差很大的内部振荡器IOSCIOSC/4INT30等)
示例:配置UART0:波特率96008个数据位,1个停止位,无校验
UARTConfigSet(UART0_BASE,9600, UART_CONFIG_WLEN_8 |
UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE);
配置UART1:波特率最大,5个数据位,1个停止位,无校验
UARTConfigSet(UART1_BASE, SysCtlClockGet( ) / 16, UART_CONFIG_WLEN_5 |
UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE);

3 函数:UARTEnable( )
功能:使能指定UART端口的发送和接收操作
原型:void UARTEnable(unsigned long ulBase)
参数:ulBaseUART端口的基址,取值UART0_BASEUART1_BASE
示例:使能UART0发送和接受操作:UARTEnable(UART0_BASE)

     使能UART1发送和接受操作:UARTEnable(UART1_BASE)
4函数:UARTCharPut( )
功能:发送1个字符到指定的UART端口(等待)
原型:void UARTCharPut(unsigned long ulBase, unsigned char ucData)
参数:ulBaseUART端口的基址,取值UART0_BASEUART1_BASEUART2_BASE
        ulData:要发送的字符
返回:无(在未发送完毕前不会返回)
示例:发送0x55UART0端口:UARTCharPut(UART0_BASE, 0x55)
5函数:UARTCharGet( )
功能:从指定的UART端口接收1个字符(等待)
原型:long UARTCharGet(unsigned long ulBase)
参数:ulBaseUART端口的基址,取值UART0_BASEUART1_BASEUART2_BASE
返回:读取到的字符,并自动转换为long型(在未收到字符之前会一直等待)
示例:从UART0端口读取一个字符:Readdata = UARTCharGet(UART0_BASE);
6函数:UARTCharPutNonBlocking( )
功能:发送1个字符到指定的UART端口(不等待)
原型:tBoolean UARTCharPutNonBlocking(unsigned long ulBase, unsigned char ucData)
参数:ulBaseUART端口的基址,取值UART0_BASEUART1_BASEUART2_BASE
ulData:要发送的字符
返回:如果发送FIFO里有可用空间,则将数据放入发送FIFO,并立即返回true
      如果发送FIFO里没有可用空间,则立即返回false(发送失败)
说明:通常,在调用本函数之前应当先调用UARTSpaceAvail( )确认发送FIFO里有可用空间
示例:从UART0发送数据0x55while(UARTSpaceAvail(UART0_BASE)){ UARTCharNonBlockingPut(UART0_BASE, 0x55);}
7、函数UARTCharGetNonBlocking( )
功能:从指定的UART端口接收1个字符(不等待)
原型:long UARTCharGetNonBlocking(unsigned long ulBase)
参数:ulBaseUART端口的基址,取值UART0_BASEUART1_BASEUART2_BASE
返回:如果接收FIFO里有字符,则立即返回接收到的字符(自动转换为long型)
      如果接收FIFO里没有字符,则立即返回-1(接收失败)
说明:通常,在调用本函数之前应当先调用UARTCharsAvail( )来确认接收FIFO里有字符
示例:从UART0接受数据:
while(UARTCharsAvail(UART0_BASE)){
ReadData[i++]=UARTCharGetNonBlocking(UART0_BASE)}

API函数参考.rar

2.35 MB

相关帖子

沙发
lilihua0721|  楼主 | 2011-11-20 00:10 | 只看该作者
本帖最后由 lilihua0721 于 2011-11-20 09:02 编辑

8、 函数:UARTFIFOLevelSet()
功能:设置UART收发FIFO的深度,可以设置的深度有2、4、8、12、
原型:void UARTFIFOLevelSet(unsigned long ulBase, unsigned long ulTxLevel,
                               unsigned long ulRxLevel);
参数:ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE
ulTxLevel:发送中断 FIFO 的深度级别,取下列值之一:
UART_FIFO_TX1_8        //        在 1/8 深度时产生发送中断
UART_FIFO_TX2_8        //        在 1/4 深度时产生发送中断
UART_FIFO_TX4_8        //        在 1/2 深度时产生发送中断
UART_FIFO_TX6_8        //        在 3/4 深度时产生发送中断
UART_FIFO_TX7_8        //        在 7/8 深度时产生发送中断
ulRxLevel:接收中断 FIFO 的深度级别,取下列值之一
UART_FIFO_RX1_8  //在 1/8 深度时产生接收中断
UART_FIFO_RX2_8  //在 1/4 深度时产生接收中断
UART_FIFO_RX4_8  //在 1/2 深度时产生接收中断
UART_FIFO_RX6_8  //在 3/4 深度时产生接收中断
UART_FIFO_RX7_8  //在 7/8 深度时产生接收中断
返回:无
示例:设置UART0发送中断触发深度为2/8;设置发送中断触发深度为6/8;
UARTFIFOLevelSet(UART0_BASE,  // UART0端口的基址
UART_FIFO_TX2_8,  //发送 FIFO 为 2/8 深度(4B)
UART_FIFO_RX6_8); // 接收 FIFO 为 6/8 深(12B)
9、 函数:UARTSpaceAvail ( )
功能:探测发送 FIFO 里是否有可用的空位
原型:tBoolean UARTSpaceAvail(unsigned long ulBase)
参数: ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE返回:true:在发送 FIFO 里有可用空间
false:在发送 FIFO 里没有可用空间(发送 FIFO 已满)
10、函数:UARTCharsAvail ( )
功能:探测接收 FIFO 里是否有接收到的数据
原型:tBoolean UARTCharsAvail(unsigned long ulBase)
参数: ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE
返回:true:在接收FIFO 里有字符
          false:在接收 FIFO 里没有字符(接收 FIFO 为空)
11、函数:UARTIntEnable ( )
功能:使能一个或多个UART中断
原型:void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags)
参数: ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE
ulIntFlags:指定的中断源,应当取下列值之一或者它们之间的任意“或运算”组合形式
        UART_INT_OE   // FIFO 溢出错误中断
UART_INT_BE   //BREAK 错误中断
UART_INT_PE   //奇偶校验错误中断
UART_INT_FE   //帧错误中断
UART_INT_RT   //接收超时中断
UART_INT_TX   //发送中断
UART_INT_RX   //接收中断
返回:无
示例:使能UART0接收和接收超时中断:UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);

使用特权

评论回复
板凳
lilihua0721|  楼主 | 2011-11-20 00:10 | 只看该作者
本帖最后由 lilihua0721 于 2011-11-20 09:03 编辑

二、对Stellaris系列UART的FIFO的认识
1FIFO 中断方式发送


发送数据时,当发送FIFO 里剩余的数据减少到预设的深度时会触发中断(发送FIFO快空了,请赶紧填充),而不是填充到预设的深度时触发中断。为了减少中断次数提高发送效率,发送 FIFO 中断触发深度级别越浅越好。用库函数 UARTCharPut( )UARTCharPutNonBlocking( )发送字符,实质上是将字符扔到发送 FIFO 里就返回,而不是在等待硬件上真正发送完毕后才返回。

2、FIFO 中断方式接收:
接收数据时,触发 FIFO 中断的条件是当接收 FIFO 里累积的数据增加到预设的深度时触发中断(接收 FIFO 快满了,请赶紧取走)。为了减少中断次数提高接收效率,接收FIFO中断触发深度级别越深越好。另外要注意接收超时中断的用法,在使能接收中断的同时一般都还要使能接收超时中断。如果没有使能接收超时中断,则在接收 FIFO 里的部分数据就有可能得不到及时处理。
3、FIFO 的作用和优点:
   以前我一直采用每收发一个字符就要中断处理一次。相比UART收发FIFO而言效率确实是低了点,UART收发FIFO主要是为了解决收发中断过于频繁而导致的CPU效率不高的问题。
  FIFO的必要性。在进行UART通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发FIFO,则每传输一个数据(5~8位)都要中断处理一次,效率仍然不高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14个)后才产生一次中断,然后一起处理。这就大大提高了收发效率。
  接收超时问题。如果没有接收超时功能,则在对方已经发送完毕而接收FIFO未填满时并不会触发中断(FIFO满才会触发中断),结果造成最后接收的有效数据得不到处理的问题。有了接收超时功能后,如果接收FIFO未填满而对方发送已经停,则在不超过3个数据的接收时间内就会触发超时中断,因此数据会照常得到处理。
  总之,FIFO的设计是优秀而合理的,它已经帮你想到了收发过程中存在的任何问题,只要初始化配置UART后,就可以放心收发了,FIFO和中断例程会自动搞定一切!
  完全不必要担心FIFO大大减少了中断产生的次数而“可能”造成数据丢失的问题!
  发送时,只要发送FIFO不满,数据只管往里连续放,放完后就直接退出发送子程序。随后,FIFO真正发送完成后会自动产生中断,通知主程序说:我已经完成真正的发送。
  接收时,如果对方是连续不间断发送,则填满FIFO后会以中断的方式通知主程序说:现在有一批数据来了,请处理。
如果对方是间断性发送,也不要紧,当间隔时间过长时(2~3个字符传输时间),也会产生中断,这次是超时中断,通知主程序说:对方可能已经发送完毕,但FIFO未满,也请处理。
Stellaris系列ARM的UART模块包含有2个16字节的FIFO:一个用于发送,另一个用于接收。可以将两个FIFO分别配置为以不同深度触发中断。可供选择的配置包括:1/8、1/4、1/2、3/4和7/8深度。例如,如果接收FIFO选择1/4,则在UART接收到4个数据时产生接收中断。

使用特权

评论回复
地板
lilihua0721|  楼主 | 2011-11-20 00:10 | 只看该作者
本帖最后由 lilihua0721 于 2011-11-20 18:07 编辑

占楼待分享例程

使用特权

评论回复
5
lilihua0721|  楼主 | 2011-11-20 09:09 | 只看该作者
本帖最后由 lilihua0721 于 2011-11-20 18:07 编辑

占楼待分享例程

使用特权

评论回复
6
intermec| | 2011-11-20 13:05 | 只看该作者
哥,你抄也抄得像得阿, 就复制粘贴过来也叫心得~~~~~

使用特权

评论回复
7
lilihua0721|  楼主 | 2011-11-20 15:00 | 只看该作者
6# intermec

呵呵,以上是参考别人的,然后根据自己的理解整理了下,让您见笑了!!我在5楼占楼的目的就是为了与大家分享与串口FTF液晶的例程及心得,现在还是调试中!

使用特权

评论回复
8
马善松| | 2011-11-24 11:11 | 只看该作者
复制过来 大家就一起学习 把它消化了

使用特权

评论回复
9
ssd_12345| | 2012-9-6 09:50 | 只看该作者
好东西是不管出处的,能学就行

使用特权

评论回复
10
happybird21| | 2012-9-7 16:45 | 只看该作者
好东西 大家一块分享

使用特权

评论回复
11
51xlf| | 2012-9-9 10:41 | 只看该作者
还没有使用呢,收集一下

使用特权

评论回复
12
zhuzilinux| | 2012-9-26 11:03 | 只看该作者
mark学习下

使用特权

评论回复
13
wood_ic| | 2012-9-27 16:53 | 只看该作者
谢谢楼主分享  辛苦了

使用特权

评论回复
14
ellen325| | 2012-9-27 16:57 | 只看该作者
谢谢楼主

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

470

帖子

2

粉丝