LM3S8962有2个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 个停止位可以降低误码率)
串口操作最基本的几个库函数如下:
void UARTConfigSetExpClk(unsigned long ulBase,unsigned long ulUARTClk, unsigned long ulBaud,unsigned long ulConfig)
-UART设置,波特率、数据位、停止位等
ulBase:UART 端口的基址,取值UART0_BASE、UART1_BASE 或UART2_BASE
ulUARTClk:提供给UART 模块的时钟速率,即系统时钟频率
ulBaud:期望设定的波特率
ulConfig:UART 端口的数据格式
#define UARTConfigSet(a, b, c) UARTConfigSetExpClk(a, SysCtlClockGet( ), b, c)
-是上个函数的简化宏定义
void UARTCharPut(unsigned long ulBase, unsigned char ucData)
-发送1 个字符到指定的UART 端口(等待)
ulBase :UART 端口的基址,取值UART0_BASE、UART1_BASE 或UART2_BASE
ulData :要发送的字符
long UARTCharGet(unsigned long ulBase)
-从指定的UART 端口接收 1 个字符(等待)
ulBase :UART 端口的基址,取值UART0_BASE或UART1_BASE
返回读取到的字符,并自动转换为long 型(在未收到字符之前会一直等待)
tBoolean UARTCharPutNonBlocking(unsigned long ulBase, unsigned char ucData)
-“无阻塞”的形式发送数据,即不去探测发送 FIFO里是否有可用空位。如果有空位则放入数据并立即返回,否则立即返回 false 表示发送失败。
long UARTCharGetNonBlocking( unsigned long ulBase)
以“无阻塞”的形式接收数据,即不去探测接收 FIFO里是否有接收到的数据。如果有数据则读取并立即返回,否则立即返回-1 表示接收失败。
不管是函数 UARTCharPut( )还是 UARTCharPutNonBlocking( ),在发送数据时实际上都是把数据往发送 FIFO 一丢然后就退出,而并非在 UnTx 管脚意义上的真正发送完毕。所以,需要使用UARTBusy( )函数判断UART 发送操作是否忙,可用来判定在发送FIFO里的数据是否真正发送完毕,这包括最后一个数据的最后停止位。
tBoolean UARTBusy(unsigned long ulBase)
发送时,数据被写入发送FIFO。如果UART 被使能,则会按照预先设置好的参数 (波特率、数据位、停止位、校验位等)开始发送数据,一直到发送FIFO 中没有数据。UART 接收则是将数据存放在接收FIFO 中。
为了方便调试串口,我把STM32里实现的printf功能移植到了LM3S8962中,只用在文件头部添加几句代码就OK。
#include <stdio.h>
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
PUTCHAR_PROTOTYPE
{
UARTCharPut(UART1_BASE, (char)ch);
return ch;
}
UART1发送的示例代码如下:
int main(void)
{
SysCtlClockSet(SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_8MHZ | SYSCTL_SYSDIV_1 ); //8MHz
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_2 | GPIO_PIN_3);
UARTConfigSet(UART1_BASE, //配置UART端口
19200, //波特率:19200
UART_CONFIG_WLEN_8 | //数据位:8
UART_CONFIG_STOP_ONE | //停止位:1
UART_CONFIG_PAR_NONE); //校验位:无
UARTEnable(UART1_BASE); //使能UART端口
UART1_SendBuffer(buffer,sizeof(buffer));
printf("The Value=%d\n",199);
//while
while(1)
{
}
}