注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
liongt的个人空间 https://home.eeworld.com.cn/space-uid-53096.html [收藏] [复制] [分享] [RSS]
日志

LM3开发笔记_4.串口和printf实现

已有 1781 次阅读2010-11-10 22:37

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)
   {
    }
}

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章