一 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(低功耗)
如图 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。
程序思路是这样的:利用电脑上串口调试助手向开发板能发送命令,开发板收到什么回发给电脑,当电脑发送“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));
}
[ 本帖最后由 beyondvv 于 2010-11-16 21:48 编辑 ]