1.串口1初始化:

  /* 配置串口1:先配置IO口模式,再配置串口 */
    GPIOA_SetBits(GPIO_Pin_9);
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);      // RXD-配置上拉输入
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
    UART1_DefInit();

 2.串口1中断初始化:

    UART1_ByteTrigCfg(UART_7BYTE_TRIG);
    trigB = 7;
    UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
    PFIC_EnableIRQ(UART1_IRQn);

3.中断服务函数:

__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler(void)
{
    volatile uint8_t i;

    switch(UART1_GetITFlag())
    {
        case UART_II_LINE_STAT: // 线路状态错误
        {
            UART1_GetLinSTA();
            break;
        }

        case UART_II_RECV_RDY: // 数据达到设置触发点
            for(i = 0; i != trigB; i++)
            {
                RxBuff[i] = UART1_RecvByte();
                UART1_SendByte(RxBuff[i]);
            }
            break;

        case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成
            i = UART1_RecvString(RxBuff);
            UART1_SendString(RxBuff, i);
            break;

        case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送
            break;

        case UART_II_MODEM_CHG: // 只支持串口0
            break;

        default:
            break;
    }
}

例程中的逻辑是中断接收到数据后通过串口1发送出去。

例程中设置触发点为7字节,当fifo中有7字节数据时则触发UART_II_RECV_RDY中断,若fifo中不满7字节,且传输四个字节的时间没有数据,则会触发UART_II_RECV_TOUT中断,若发送端数据一直在发送,则不会产生UART_II_RECV_TOUT中断。

那么如何判断一包数据结束呢,可以这样来实现,在UART_II_RECV_RDY中断中只收取触发点-1字节数据,这样最终一定会产生超时,进入超时中断则说明一包结束了。

posted on 2024-07-02 09:09  WCH蓝牙应用分享  阅读(14)  评论(0编辑  收藏  举报