本文在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; } }
 
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号