1.main函数配置:

int main()
{
    uint8_t len;

    SetSysClock(CLK_SOURCE_PLL_60MHz);
    GPIOA_SetBits(GPIO_Pin_9);
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();
    R8_UART1_LCR |= (RB_LCR_PAR_EN|RB_LCR_PAR_MOD) ;

    GPIOB_SetBits(GPIO_Pin_7);
    GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);      // RXD-配置上拉输入
    GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
    UART0_DefInit();
    R8_UART0_ADR=0x55;
    R8_UART0_LCR |= (RB_LCR_PAR_EN|0x20);
#if 1 // 中断方式:接收数据后发送出去

    UART0_ByteTrigCfg(UART_7BYTE_TRIG);
    trigB = 7;
    UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
    PFIC_EnableIRQ(UART0_IRQn);
#endif

    while(1);
}

2.串口中断服务函数:

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

    switch(UART0_GetITFlag())
    {

    case UART_II_SLV_ADDR: // 从机地址
    {
        break;
    }

        case UART_II_LINE_STAT: // 线路状态错误
        {
            UART0_GetLinSTA();
            break;
        }
        case UART_II_RECV_RDY: // 数据达到设置触发点
            for(i = 0; i != trigB; i++)
            {
                RxBuff[i] = UART0_RecvByte();
                UART0_SendByte(RxBuff[i]);
            }
            break;

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

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

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

        default:
            break;
    }
}

使用注意点:

当59x串口校验位配置成mark时,对方发送需要配置为space或数据位第九位为0,
当59x串口校验位配置成space时,对方发送需要配置为mark或数据位第九位为1。
手册介绍:
 
posted on 2025-05-07 20:41  WCH蓝牙应用分享  阅读(18)  评论(0)    收藏  举报