⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lm3s-uart0.c

📁 Ctoex内核的LM3S1138的例子
💻 C
字号:
#include  <hw_memmap.h>
#include  <hw_types.h>
#include  <hw_ints.h>
#include  <hw_sysctl.h>
#include  <hw_gpio.h>
#include  <hw_uart.h>
#include  <interrupt.h>
#include  <sysctl.h>
#include  <gpio.h>
#include  <uart.h>
#include  <string.h>
#include  "LM3S-UART0.H"


#define  SysCtlPeriEnable       SysCtlPeripheralEnable


/*  UART初始化  */
void  uart0Init(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA);              /*  使能UART0所在的GPIOA端口    */
    SysCtlPeriEnable(SYSCTL_PERIPH_UART0);              /*  使能UART0模块               */

    GPIOPinTypeUART(GPIO_PORTA_BASE ,                   /*  配置PA0和PA1为UART功能      */
                    GPIO_PIN_0 | GPIO_PIN_1);

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

    UARTFIFOLevelSet(UART0_BASE ,                       /*  设置发送和接收的FIFO深度    */
                     UART_FIFO_TX4_8 ,
                     UART_FIFO_RX4_8);

    UARTIntEnable(UART0_BASE , UART_INT_TX);            /*  使能发送中断                */

    IntEnable(INT_UART0);                               /*  使能UART0总中断             */
    IntMasterEnable();                                  /*  使能处理器中断              */

    UARTEnable(UART0_BASE);                             /*  使能UART0端口               */
}


/*  定义发送数据的最大限制长度  */
#define  TX_MAX       80

/*  定义全局变量  */
char   GcBuf[1 + TX_MAX];                               /*  定义缓冲区                  */
short  GsCnt  =  0;                                     /*  发送计数器                  */
short  GsLen  =  0;                                     /*  数据有效长度                */
tBoolean  GbBusy  =  false;                             /*  忙标志:true-正在发送      */
                                                        /*          false-空闲         */


/*  填充发送FIFO(填满FIFO之后就退出,不会等待)  */
void  uart0FIFOFill(void)
{
    for (;;) {
        /*  如果已经发送完毕,则清除忙标志,并退出  */
        if ( GsCnt  >=  GsLen ) {
            GbBusy  =  false;
            break;
        }

        /*  如果发送FIFO里没有可用空间,则退出(不必等待)  */
        if ( !UARTSpaceAvail(UART0_BASE) ) {
            break;
        }

        /*  如果未发送完,并且发送FIFO里有可用空间,则填充发送FIFO  */
        UARTCharPutNonBlocking(UART0_BASE , GcBuf[GsCnt++]);
    }
}

/*  发送字符串(FIFO中断方式,高效)  */
void  uart0FIFOIntPutS(const  char  *pStr)
{
    /*  如果上次发送还没有结束,则暂时等待  */
    while ( GbBusy );

    /*  发送之前的初始化配置  */
    GsCnt  =  0;
    strncpy(GcBuf , pStr , TX_MAX);
    GsLen  =  strlen(GcBuf);
    GbBusy  =  true;

    /*  填充发送FIFO,启动中断发送过程  */
    uart0FIFOFill();

    /*  不必等待发送完毕就退出,其余数据的FIFO填充任务由中断服务函数完成  */
    return;
}


//  UART0中断服务函数
void  UART0_ISR(void)
{
    UARTIntClear(UART0_BASE , UART_INT_TX);             /*  清除发送中断                */

    uart0FIFOFill();                                    /*  填充发送FIFO                */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -