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

📄 uart.c

📁 ARM7的UART驱动程序 可以自由配置缓存大小 驱动函数集 以及接口简单 很适合初学者提高自己的驱动开发能力的参考程序 产品级别的代码 注释很详尽 但需要自己提供IRQ部分的初始化部分程序 本作者不
💻 C
📖 第 1 页 / 共 4 页
字号:
                Comm1RxInIx = 0;                  // 进入索引复位
            }
        }
        break;

    case IIR_CTI:                                 // -- 中断标志 超时
        U1IER = U1IER & (~0x01);                  // 禁止接收及字符超时中断 暂时未处理
        break;

    case IIR_THRE:                                // -- 中断标志 发送数据
        if (Comm1TxBufCtr > 0) {                  // 检查发送消息缓存区是否为空 不为空则继续发数据
            Comm1TxBufCtr--;                      // 缓存计数器减1
            U1THR = Comm1TxBuf[Comm1TxOutIx++];   // 读走一个数据到发送寄存器
            if (Comm1TxOutIx >= COMM1_TXD_SIZE) { // 判断
                Comm1TxOutIx = 0;                 // 复位
            }
        } else {
            Comm1bCanSend    = 0;                 // 发送标志为0表示 可以直接发送信息
        }
        break;

    default :                                     // 未定义
        break;
    }

    VICVectAddr = 0;                              // Acknowledge Interrupt
    OS_EXIT_CRITICAL();                           //
}
#endif


/********************************************************************************************************
* 功 能 : 串口1读1则数据
* 入 口 : 'err' 返回错误信息的指针
* 返 回 : 1> 读到的数据
*         2> err=COMM_RXD_EMPTY 接收缓存没有数据
*         3> err=COMM_RXD_OK    正确在接收缓存读到数据
* 说 明 : 1> 在调用此函数前 最好用Comm1RxGetNMsgs函数检查一下接收缓存里面有没有信息
*         2> 如果不按1>的用法用 则要对返回的错误代码分析
********************************************************************************************************/
#if    COMM1_UNIT_EN > 0 && COMM1_RXD_EN > 0 && COMM1_RXD_GET_EN > 0

INT8U  Comm1RxGetChar  (INT8U *err)
{
    INT8U msg;


    *err = COMM_RXD_EMPTY;                    /* 返回代码为接收为空                                    */
    COMM_ENTER_CRITICAL();                    /* 进入临界                                              */
    if (Comm1RxBufCtr > 0) {                  /* 检测接收缓存是否有数据                                */
        Comm1RxBufCtr--;                      /* 有数据计数器减1                                       */
        msg  = Comm1RxBuf[Comm1RxOutIx++];    /* 取出数据                                              */
        *err = COMM_RXD_OK;                   /* 返回代码为读数据正确                                  */
        if (Comm1RxOutIx >= COMM1_RXD_SIZE) { /* 检查出数据计数器 是否大于最大接收缓存                 */
            Comm1RxOutIx  = 0;                /* 是复位出数据计数器                                    */
        }
    }
    COMM_EXIT_CRITICAL();                     /* 退出临界                                              */
    return (msg);
}
#endif


/********************************************************************************************************
* 功 能 : 检测接收缓存中的数据个数
* 入 口 : 无
* 返 回 : 缓存中的数据个数
* 说 明 : 无
********************************************************************************************************/
#if    COMM1_UNIT_EN > 0 && COMM1_RXD_EN > 0 && COMM1_RXD_GETNMSGS_EN > 0

INT16U   Comm1RxGetNMsgs (void)
{
    COMM1_RXD_TYPE counter;


    COMM_ENTER_CRITICAL();                    /* 进入临界                                              */
    counter = Comm1RxBufCtr;                  /* 取接收计数器数据                                      */
    COMM_EXIT_CRITICAL();                     /* 退出临界                                              */

    return (counter);                         /* 返回接收缓存计数                                      */
}
#endif


/********************************************************************************************************
* 功 能 : 一次串口0读N则数据
* 入 口 : 'p'   返回数据信息的指针
*         'len' 读的数据长度 < COMM1_RXD_SIZE
* 返 回 : 1> COMM_RXD_EMPTY 读数据为空    一般是len为空 或接收缓存中没有数据
*         2> COMM_RXD_FALSE 错误读数据    一般为len大于数据接收缓存中的数据
*         3> COMM_RXD_OK    数据正确读到
* 说 明 : 1> 对于返回参数2> 可以使用Comm1RxGetNMsgs 先取得缓存中的数据个数再一次读走
********************************************************************************************************/
#if    COMM1_UNIT_EN > 0 && COMM1_RXD_EN > 0 && COMM1_RXD_GETS_EN > 0

INT8U  Comm1RxGetsChar (INT8U *s, COMM1_RXD_TYPE len)
{
    COMM_ENTER_CRITICAL();                    /* 进入临界  处理Comm1RxBufCtr                           */
    if ((len == 0) || (Comm1RxBufCtr == 0)) { /* 检查数据长度 和接收缓存是否为空                       */
        COMM_EXIT_CRITICAL();                 /* 退出临界                                              */
        return (COMM_RXD_EMPTY);              /* 返回代码为接收空                                      */
    }

    if (len > Comm1RxBufCtr) {                /* 检查读数长度跟实际接收缓存数据个数                    */
        COMM_EXIT_CRITICAL();                 /* 退出临界                                              */
        return (COMM_RXD_FALSE);              /* 返回代码为 读数据失败                                 */
    }
    COMM_EXIT_CRITICAL();                     /* 退出临界                                              */

                                              /* 必须退出临界以便其他的中断响应 否则len大时就会影响中断*/
    while (len--) {                           /* 读走len个数据                                         */
        COMM_ENTER_CRITICAL();                /* 进入临界 处理Comm1RxBufCtr                            */
        *s++ = Comm1RxBuf[Comm1RxOutIx++];    /* 取出数据                                              */
        Comm1RxBufCtr--;                      /* 接收缓存计数器减1                                     */
        if (Comm1RxOutIx >= COMM1_RXD_SIZE) { /* 处理接收出数据计数器                                  */
            Comm1RxOutIx = 0;                 /* 复位出数据计数器                                      */
        }
        COMM_EXIT_CRITICAL();                 /* 退出临界                                              */
    }
    return (COMM_RXD_OK);                     /* 返回代码为 接收到正确数据                             */
}
#endif


/********************************************************************************************************
* 功 能 : 来不及发送的消息进入发送缓存
* 入 口 : 'Data' 进入缓存的消息数据
* 返 回 : 1> COMM_TXD_FLOODL 发送消息进入缓存满 (失败)
*         2> COMM_TXD_OK   发送消息进入缓存OK
* 说 明 : 1> 内部模式 用户不能调用
********************************************************************************************************/
#if    COMM1_UNIT_EN > 0 && COMM1_TXD_EN > 0

static void Comm1TxInBuf (INT8U Data)
{
    if (Comm1TxBufCtr < COMM1_TXD_SIZE) {     /* 处理发送缓存计数器                                    */
        Comm1TxBufCtr++;                      /* 发送缓存计数器加1                                     */
        Comm1TxBuf[Comm1TxInIx++] = Data;     /* 来不及发送的数据进发送缓存                            */
        if (Comm1TxInIx >= COMM1_TXD_SIZE) {  /* 处理发送进缓存计数器                                  */
            Comm1TxInIx  = 0;                 /* 复位发送进缓存计数器                                  */
        }
    }
}
#endif


/********************************************************************************************************
* 功 能 : COMM1 发送1 BYTE数据
* 入 口 : 'Date' 发送的数据
* 返 回 : 1> COMM_TXD_OK    发送数据OK
*         2> COMM_TXD_FALSE 发送失败   一般是发送缓存已满
* 说 明 : 1> SBUF发送寄存器为空时直接把要发送的数据放到发送缓存
*         2> SBUF发送寄存器为忙时来不及发的数据进入到发送缓存
*         3> 发送缓存满时直接返回发送失败
********************************************************************************************************/
#if    COMM1_UNIT_EN > 0 && COMM1_TXD_EN > 0 && COMM1_TXD_PUT_EN > 0 

INT8U Comm1TxPutChar (INT8U Data)
{
    COMM_ENTER_CRITICAL();                    /* 进入临界                                              */
    if (!Comm1bCanSend) {                     /* 判断串口直接发送允许标志位 0为允许                    */
        Comm1bCanSend = 1;                    /* 设置为忙                                              */
        U1THR         = Data;                 /* 发送出数据                                            */
        COMM_EXIT_CRITICAL();                 /* 退出临界                                              */
        return (COMM_TXD_OK);                 /* 返回代码为发送OK                                      */
    }

    if (Comm1TxBufCtr >= COMM1_TXD_SIZE) {    /* 判断发送缓存计数器是否为最大发送缓存                  */
        COMM_EXIT_CRITICAL();                 /* 是退出临界 不处理                                     */
        return (COMM_TXD_FALSE);              /* 发送缓存满 返回代码为发送失败                         */
    } else {
        Comm1TxInBuf(Data);                   /* 来不及发送的数据一直等到进入发送缓存                  */
        COMM_EXIT_CRITICAL();                 /* 退出临界                                              */
        return (COMM_TXD_OK);                 /* 返回代码为发送OK                                      */
    }
}
#endif


/********************************************************************************************************
* 功 能 : COMM1 发送N BYTE数据
* 入 口 : 'p'   指向发送消息的指针
*         'len' 发送数据的长度
* 返 回 : 1> 实际已经发送的数据长度
* 说 明 : 1> 返回实际发送数据的长度 对剩下的字节 就需要用户自己处理
********************************************************************************************************/
#if  COMM1_UNIT_EN > 0 && COMM1_TXD_EN > 0 && COMM1_TXD_PUTS_EN > 0

INT8U Comm1TxPutsChar (INT8U *s, COMM1_TXD_TYPE len)
{
    COMM1_TXD_TYPE i;


    COMM_ENTER_CRITICAL();                        // 进入临界
    i   = COMM1_TXD_SIZE - Comm1TxBufCtr;         // 剩下的发送缓存长度
    i   = i >= len ? len : i;                     // 处理实际发送数据长度
    len = i;                                      // 实际已经发送的数据长度

    while (i--) {                                 // 发送数据处理
        if (!Comm1bCanSend) {                     // 检测直接发送条件
            Comm1bCanSend = 1;                    // 可以 置直接发送标志为忙
            U1THR         = *s;                   // 发送数据
        } else {                                  // 理解下面的指令实际就是变相的while(!TI)
            Comm1TxInBuf(*s);                     // 发送不了的数据进入发送缓存
        }
        s++;                                      // 
    }
    COMM_EXIT_CRITICAL();                         // 退出临界

    return (len);                                 // 返回实际已经发送的数据长度
}
#endif







#endif
/********************************************************************************************************
*                                             End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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