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

📄 main.c

📁 LM3S系列UART例程:以FIFO中断方式发送
💻 C
字号:
#include  "systemInit.h"
#include  <uart.h>
#include  <stdio.h>


#define  UARTCharPutNB      UARTCharPutNonBlocking


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

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

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

    UARTFIFOLevelSet(UART2_BASE,                            //  设置收发FIFO中断触发深度
                     UART_FIFO_TX2_8,                       //  发送FIFO为2/8深度(4B)
                     UART_FIFO_RX6_8);                      //  接收FIFO为6/8深度(12B)

    UARTIntEnable(UART2_BASE, UART_INT_TX);                 //  使能发送中断
    IntEnable(INT_UART2);                                   //  使能UART总中断
    IntMasterEnable();                                      //  使能处理器中断

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


//  定义待发送的数据
const char TxData[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
volatile int TxIndex = 0;                                   //  数组下标变量
volatile tBoolean TxEndFlag = false;                        //  发送结束的标志
volatile int TxIntNum = 0;                                  //  统计发送中断产生的次数


//  填充发送FIFO(填满FIFO之后就退出,不会等待)
void TxFIFOFill(void)
{
    char c;

    for (;;)
    {
        c = TxData[TxIndex];

        if (c == '\0')                                      //  若填充完毕
        {
            TxEndFlag = true;                               //  发送结束标志置位,并跳出
            break;
        }

        if (UARTSpaceAvail(UART2_BASE))                     //  若发送FIFO里有可用空间
        {
            UARTCharPutNB(UART2_BASE, c);                   //  填充发送FIFO
            TxIndex++;
        }
        else                                                //  若没有空间则跳出,不必等待
        {
            break;
        }
    }
}


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


//  主函数(程序入口)
int main(void)
{
    char s[40];

    jtagWait();                                             //  防止JTAG失效,重要!
    clockInit();                                            //  时钟初始化:晶振,6MHz
    uartInit();                                             //  UART初始化

    TxFIFOFill();                                           //  启动发送过程

    for (;;)
    {
        if (TxEndFlag)                                      //  若发送结束则跳出
        {
            TxEndFlag = false;
            break;
        }

        //  对实际的应用,在等待发送的同时,还可以做很多其它事情
    }

    sprintf(s, "TxIntNum = %d\r\n", TxIntNum);              //  显示中断产生的次数
    uartPuts(s);

    for (;;)
    {
    }
}


//  UART2中断服务函数
void UART2_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = UARTIntStatus(UART2_BASE, true);             //  读取当前中断状态
    UARTIntClear(UART2_BASE, ulStatus);                     //  清除中断状态

    if (ulStatus & UART_INT_TX)                             //  若是发送中断
    {
        TxFIFOFill();                                       //  填充发送FIFO
        TxIntNum++;
    }
}

⌨️ 快捷键说明

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