#include "common_drv.h" #include "sysctrl_drv.h" #include "clock_drv.h" #include "uart_drv.h" #include "gpio_drv.h" #include "wdog_drv.h" #include "int_drv.h" #include "clock_config.h" uint8_t gIntFlag = 0; uint8_t ch; uint32_t txcnt=0; uint32_t rxcnt=0; uint32_t txcount=0; uint32_t rxbuffer[32]={0}; volatile uint8_t TX_FLAG=0x55;//接收完一帧31个字节数据再启动发送中断标志 const UART_Config_t uartConfigStruct = { .baudRate = 1000000, /* buard rate */ .dataBits = UART_DATABITS_8, /* data size */ .parity = UART_PARITY_NONE, /* parity */ .stopBits = UART_STOPBITS_1, /* stop bit */ .autoFlowControl = DISABLE, /* flow control */ .oscFreq = 40000000 /* function clock freq */ }; /* fifo config */ const UART_FIFOConfig_t fifoConfig = { ENABLE, /* Enable FIFO */ ENABLE, /* Reset tx FIFO */ ENABLE, /* Reset rx FIFO */ UART_TX_FIFO_HALF, /* FIFO 1/2 full */ UART_RX_FIFO_HALF /* Character in the FIFO */ }; static UART_IdleDetectConfig_t IdleDetectconfig= { .Cmd = ENABLE, .len = UART_IDLE_DETECT_LENGTH_32 }; void Ex_UartRXCallback() { uint8_t i; for(i=0;i<8;i++) { /* receive data */ rxbuffer[rxcnt] = UART_ReceiveByte(UART1_ID); rxcnt++; } } void Ex_UartTBEICallback() { txcount++; if(txcount>=4) { //发送7个字节 UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); txcount=0; txcnt=0; UART_IntMask(UART1_ID, UART_INT_TBEI, MASK);//一帧发送21个字节后mask发送中断,待调用重启发送中断UartSendRequest } else { /* send data */ //发送8个字节 UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); UART_SendByte(UART1_ID, txcnt++); } } void Ex_UartRCVRTOCallback() { while(SET == UART_GetLineStatus(UART1_ID, UART_LINESTA_DR)) { rxbuffer[rxcnt] = UART_ReceiveByte(UART1_ID); rxcnt++; } if(rxcnt!=31) return ; rxcnt=0; TX_FLAG=0xaa; } void UartSendRequest(void) { UART_IntMask(UART1_ID, UART_INT_TBEI, UNMASK); // INT_EnableIRQ(UART1_IRQn); } void Ex_UartInit(void) { CLK_ModuleSrc(CLK_PORTC, CLK_SRC_OSC40M); /* Eet divide ratio of portc's function clock*/ CLK_SetClkDivider(CLK_PORTC, CLK_DIV_1); /* Enable clock for portc */ SYSCTRL_EnableModule(SYSCTRL_PORTC); PORT_PinmuxConfig(PORT_C, GPIO_7, PTC7_GPIO); PORT_PinmuxConfig(PORT_C, GPIO_6, PTC6_GPIO); /* choose osc clock as function clock of uart1 */ CLK_ModuleSrc(CLK_UART1, CLK_SRC_OSC40M); /* set divide ratio of uart1's function clock*/ CLK_SetClkDivider(CLK_UART1, CLK_DIV_1); /* enable clock for uart1 */ SYSCTRL_EnableModule(SYSCTRL_UART1); /*When UART re-open after close, need to check and clear busy status*/ while(SUCC !=UART_WaitBusyClear(UART1_ID, 7000)) { (void)UART_ReceiveByte(UART1_ID); } /* Initiate uart1 */ UART_Init(UART1_ID, &uartConfigStruct); UART_FIFOConfig(UART1_ID, &fifoConfig); UART_IdleDetectConfig(UART1_ID,&IdleDetectconfig); /* callback function */ UART_InstallCallBackFunc(UART1_ID, UART_INT_RBFI, Ex_UartRXCallback); UART_InstallCallBackFunc(UART1_ID, UART_INT_TBEI, Ex_UartTBEICallback); UART_InstallCallBackFunc(UART1_ID, UART_INT_RCVRTO, Ex_UartRCVRTOCallback); /* enable received data available interrupt */ UART_IntMask(UART1_ID, UART_INT_RBFI, UNMASK); UART_IntMask(UART1_ID, UART_INT_TBEI, UNMASK); UART_IntMask(UART1_ID, UART_INT_RCVRTO, UNMASK); /* Set pin mux */ PORT_PinmuxConfig(PORT_C, GPIO_7, PTC7_UART1_TX); PORT_PinmuxConfig(PORT_C, GPIO_6, PTC6_UART1_RX); /* Enable IRQ */ INT_EnableIRQ(UART1_IRQn); } void delay(uint32_t cycle) { cycle = (cycle << 7); while(cycle--); } void main(void) { /* Init Clock*/ Ex_ClockInit(); /* Disable wdog (wdog is enabled when default)*/ WDOG_Disable(); /* Init UART*/ Ex_UartInit(); // UartSendRequest(); /* wait for host send data*/ //while(gIntFlag == 0); for(;;) { if(TX_FLAG==0xaa)//接收完一帧31个字节数据再启动发送中断 { UartSendRequest(); TX_FLAG=0x55; } } }