[原创] LM3S8962UART操作

beyondvv   2010-11-16 21:45 楼主

 一 Stellaris系列ARM 的 UART 特性
Stellaris(群星)系列 ARM 的 UART 具有完全可编程、16C550 型串行接口的特性(但
并不兼容) 。Stellaris系列 ARM 含有 1 至3 个UART 模块。每个 UART 都具有以下特性: 
独立的发送 FIFO和接收 FIFO(First-In First-Out,先进先出)
FIFO长度可编程,包括提供传统双缓冲接口的 1 字节深的操作
FIFO触发深度为:1/8、1/4、1/2、3/4、7/8
可编程的波特率发生器,允许速率高达 3.125Mbps(兆位每秒)
标准的异步通信:起始位、停止位和奇偶校验位
检测错误的起始位
线中止(Line-break)的产生和检测
完全可编程的串行接口特性:
„5、6、7 或8个数据位
偶校验、奇校验、粘着或无奇偶校验位的产生/检测
„产生 1 或2个停止位(使用 2 个停止位可以降低误码率)
某些型号集成 IrDA串行红外(SIR)编码器/解码器,具有以下特性:
用户可以根据需要对 IrDA串行红外(SIR)或 UART 输入/输出端进行编程
„IrDA SIR 编码器/解码器功能模块在半双工时其数据速率可高达 115.2Kbps
„位持续时间(bit duration)为 3/16(正常)或 1.41~2.23µs(低功耗)

UART.jpg

如图 1.1 所示,为 Stellaris 系列 ARM 芯片 UART 与电脑 COM 端口连接的典型应用电
路。CZ1 和 CZ2 是电脑 DB9 形式的 COM 接口,U1 是 Exar(原 Sipex)公司的 UART 转
RS-232C 的接口芯片 SP3232E,可在 3.3V下工作。

二、UART库函数
1配置与控制
函数 UARTConfigSetExpClk( )用来对 UART端口的波特率、数据格式进行配置

在实际编程时, 往往用形式更简单的宏函数 UARTConfigSet( )来代替上述库函数。
 宏函数UARTConfigSet( )
功能  UART配置(自动获取时钟速率)
原型  #define UARTConfigSet(a, b, c)    UARTConfigSetExpClk(a, SysCtlClockGet( ), b, c)
 
说明
本宏函数常常用来代替函数UARTConfigSetExpClk( ),在调用之前应当先调用SysCtlClockSet( )函
数设置系统时钟(不要使用误差很大的内部振荡器IOSC、IOSC/4、INT30等)
示例
//  配置UART0:波特率9600,8个数据位,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);
 
//  配置UART2:波特率2400,8个数据位,2个停止位,偶校验
UARTConfigSet(UART2_BASE, 2400, UART_CONFIG_WLEN_8 |
       UART_CONFIG_STOP_TWO |
       UART_CONFIG_PAR_EVEN);

函数UARTFIFOLevelSet( )用来设置收发FIFO触发中断
时的深度级别。
 函数 UARTFIFOLevelSet( )
功能  设置使指定UART端口产生中断的收发FIFO 深度级别
原型
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深度时产生发送中断
  注:当发送FIFO里剩余的数据减少到预设的深度时触发中断,而非填充到预设深度时触发中断。因此在需要发送大量数据的应用场合,为了减少中断次数提高发送效率,发送FIFO中断触发深度级别设置的越浅越好,如设置为UART_FIFO_TX1_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深度时产生接收中断
  注:当接收FIFO里已有的数据累积到预设的深度时触发中断,因此在需要接收大量数据的应
用场合,为了减少中断次数提高接收效率,接收FIFO中断触发深度级别设置的越深越好,如设置
为UART_FIFO_RX7_8。
2、使能与禁止
函数 UARTEnable( )和 UARTDisable( )用来使能和禁止 UART 端口的收发功能。一般是
先配置 UART,最后使能收发。当需要修改 UART 配置时,应当先禁止,配置完成后再使
能。
 函数 UARTEnable( )
功能  使能指定UART端口的发送和接收操作
原型  void UARTEnable(unsigned long ulBase)
参数  ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或 UART2_BASE
返回  无
函数 UARTDisable( )
功能  禁止指定UART端口的发送和接收操作
原型  void UARTDisable(unsigned long ulBase)
参数  ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或 UART2_BASE
返回  无
3、 数据收发

函数 UARTCharPut( )以轮询的方式发送数据,如果发送 FIFO有空位则填充要发送的数
据,如果没有空位则一直等待。
函数 UARTCharGet( )以轮询的方式接收数据, 如果接收 FIFO里有数据则读出数据并返
回,如果没有数据则一直等待。
 函数 UARTCharPut( )
功能  发送1个字符到指定的UART端口(等待)
原型  void UARTCharPut(unsigned long ulBase, unsigned char ucData)
参数
ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或 UART2_BASE
ulData:要发送的字符
返回  无(在未发送完毕前不会返回)
函数 UARTCharGet( )
功能  从指定的UART端口接收1 个字符(等待)
原型  long UARTCharGet(unsigned long ulBase)
参数  ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或 UART2_BASE
返回  读取到的字符,并自动转换为long型(在未收到字符之前会一直等待)

4、中断控制
UART 端口在收发过程中可产生多种中断,处理起来比较灵活。函数 UARTIntEnable( )
和 UARTIntDisable( )用来使能和禁止 UART 端口的一个或多个中断。
函数UARTIntClear( )用来清除UART的中断状态, 函数UARTIntStatus( )用来获取UART
的中断状态。

函数 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   //   接收中断
    注:接收中断和接收超时中断通常要配合使用,即UART_INT_RX | UART_INT_RT
返回  无
 函数 UARTIntDisable( )
功能  禁止指定UART端口的一个或多个中断
原型  void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags)
参数  参见表1.26的描述
返回  无
 函数 UARTIntClear( )
功能  清除指定UART端口的一个或多个中断
原型  void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags)
参数  参见表1.26的描述
返回  无
函数 UARTIntStatus( )
功能  获取指定UART端口当前的中断状态
原型  unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked)
参数
ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或 UART2_BASE
bMasked:如果需要获取原始的中断状态,则取值false
   如果需要获取屏蔽的中断状态,则取值true
返回  原始的或屏蔽的中断状态

LM3S8962开发板上没有提供的 UART 转RS-232C 的接口芯片 SP3232E,但是开发板上的FT2232 芯片实现 USB 转串口功能。FT2232 实现两个功能:A 通道上实现
JTAG/SWD 端口功能;B 通道上实现虚拟串口功能。这个特点使得在计算机和 EVB 间
使用一个 USB 电缆实现两个通讯连接,在光盘软件中提供每个功能独立 WINDOWS  软
件驱动程序。因此用USB数据线上连接开发板时,既可以为开发板供电,又可以实现USB转串口功能,还能实现程序烧写调试功能,实在是很强大,很方便。
在我电脑里USB转串口的端口号是COM4,因此选择串口端口号时要选择COM4。

COM.jpg
下面用一个例程来说明LM3S8962UART操作:

程序思路是这样的:利用电脑上串口调试助手向开发板能发送命令,开发板收到什么回发给电脑,当电脑发送“on”时,开发板上用户LED1亮,当电脑发送off时,开发板用户LED1熄灭,当开发板收到其他命令时,开发板向电脑发送“Error command”。

UART初始化和配置函数为:

  UART初始化
void uartInit(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_UART0);                  //  使能UART模块
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA);                  //  使能RX/TX所在的GPIO端口

    GPIOPinTypeUART(GPIO_PORTA_BASE,                        //  配置RX/TX所在管脚为
                    GPIO_PIN_0 | GPIO_PIN_1);               //  UART收发功能

    UARTConfigSet(UART0_BASE,                               //  配置UART端口
                  9600,                                     //  波特率:9600
                  UART_CONFIG_WLEN_8 |                      //  数据位:8
                  UART_CONFIG_STOP_ONE |                    //  停止位:1
                  UART_CONFIG_PAR_NONE);                    //  校验位:无

    UARTEnable(UART0_BASE);                                 //  使能UART端口
}


//  通过UART发送一个字符
void uartPutc(const char c)
{
    UARTCharPut(UART0_BASE, c);
}


//  通过UART发送字符串
void uartPuts(const char *s)
{
 while (*s != '\0')
    {
        //UARTCharPut(UART0_BASE, *(s++)); 
   uartPutc(*(s++));
    }

}


//  通过UART接收一个字符
char uartGetc(void)
{
    return(UARTCharGet(UART0_BASE));
}

完整的KEIL例程在附件里,实验效果如图所示 UART_LED .jpg

UART控制LED.rar (93.1 KB)
(下载次数: 282, 2010-11-16 21:45 上传)

 

 

 

 

 

 

 

 

[ 本帖最后由 beyondvv 于 2010-11-16 21:48 编辑 ]

回复评论 (3)

非常感谢
点赞  2011-9-23 11:32
谢谢,楼主辛苦了。
点赞  2011-9-23 14:44
太棒了楼主
点赞  2014-3-13 15:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复