本文在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號