本文在CH572上实现串口中断接收:

#include "CH57x_common.h"

// 发送缓冲区及测试数据
uint8_t g_txBuffer[] = "This is a UART test example\r\n";
// 接收缓冲区(100字节)
uint8_t g_rxBuffer[100];
// 触发字节数
uint8_t g_triggerBytes = 7;

// 接收数据长度(volatile确保多线程/中断可见性)
volatile uint8_t g_uartRecvLen = 0;
// 接收完成标志
volatile uint8_t g_uartRecvComplete = 0;

__HIGH_CODE
int main()
{
    // 初始化系统时钟
    HSECFG_Capacitance(HSECap_18p);
    SetSysClock(CLK_SOURCE_HSE_PLL_100MHz);

    // 配置UART0引脚
    GPIOA_SetBits(bTXD_0);                  // 先让TXD输出高电平
    GPIOA_ModeCfg(bRXD_0, GPIO_ModeIN_PU);  // RXD配置为上拉输入
    GPIOA_ModeCfg(bTXD_0, GPIO_ModeOut_PP_5mA); // TXD配置为推挽输出

    // 重映射UART引脚: TX->PA3, RX->PA2
    UART_Remap(ENABLE, UART_TX_REMAP_PA3, UART_RX_REMAP_PA2);
    // 初始化UART
    UART_DefInit();

    // 发送测试字符串
    UART_SendString(g_txBuffer, sizeof(g_txBuffer));

    // 配置UART中断接收模式
    UART_ByteTrigCfg(UART_7BYTE_TRIG);      // 设置7字节触发中断
    UART_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT); // 使能接收就绪和线路状态中断
    PFIC_EnableIRQ(UART_IRQn);              // 使能UART中断

    // 主循环
    while(1)
    {
        // 检查是否有完整数据接收
        if (g_uartRecvComplete)
        {
            g_uartRecvComplete = 0;         // 清除标志

            PRINT("Received data:\n");
            // 打印接收的数据
            for(uint8_t i = 0; i < g_uartRecvLen; i++)
            {
                PRINT("%c ", g_rxBuffer[i]);
            }
            PRINT("\n");

            g_uartRecvLen = 0;              // 重置接收长度
        }
    }
}

/*********************************************************************
 * @fn      UART_IRQHandler
 *
 * @brief   UART中断处理函数
 *
 * @return  none
 */
__INTERRUPT
__HIGH_CODE
void UART_IRQHandler(void)
{
    uint8_t i;
    uint8_t irqFlag = UART_GetITFlag(); // 获取中断标志

    switch(irqFlag)
    {
        case UART_II_LINE_STAT: // 线路状态错误
            UART_GetLinSTA();   // 清除线路状态标志
            break;

        case UART_II_RECV_RDY: // 数据达到触发点
            // 读取触发点数量的数据
            for(i = 0; i < (g_triggerBytes - 1); i++)
            {
                g_rxBuffer[g_uartRecvLen + i] = UART_RecvByte();
            }
            g_uartRecvLen += (g_triggerBytes - 1);
            break;

        case UART_II_RECV_TOUT: // 接收超时,一帧数据完成
            // 读取剩余数据
            i = UART_RecvString(&g_rxBuffer[g_uartRecvLen]);
            g_uartRecvLen += i;
            g_uartRecvComplete = 1; // 设置接收完成标志
            break;

        case UART_II_THR_EMPTY: // 发送缓冲区空(未使用)
            break;

        default:
            break;
    }
}

 

posted on 2025-08-02 09:51  WCH蓝牙应用分享  阅读(122)  评论(0)    收藏  举报