/* * uart.c * * Created on: May 14, 2025 * Author: cc */ #include "uart.h" #include "debug.h" #include "watchdog.h" #include "blv_rs485_protocol.h" #include "sram_mem_addr.h" #include "spi_sram.h" #include UART_t g_uart[UART_MAX]; void UART0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void UART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void UART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void UART3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); /********************************************************************* * @fn UARTx_Init * @brief UART初始化函数,注意串口2通讯引脚是PB22,PB23 - Boot,RST引脚 * @param uart_id - 串口ID * @param buad - 波特率 * @param prt_cf - 串口接收回调函数 * @return none */ __attribute__((section(".non_0_wait"))) void UARTx_Init(UART_IDX uart_id, uint32_t buad) { switch (uart_id) { case UART_0: /* 配置串口1:配置IO口模式 */ UART0_BaudRateCfg(buad); R8_UART0_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO open, trigger point 14 bytes R8_UART0_LCR = RB_LCR_WORD_SZ; R8_UART0_IER = RB_IER_TXD_EN; GPIO_PinRemapConfig(GPIO_NoRemap_UART0,ENABLE); GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP); GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_Floating); UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY); NVIC_EnableIRQ(UART0_IRQn); memset(&g_uart[UART_0],0,sizeof(UART_t)); Set_Uart_recvTimeout(&g_uart[UART_0],buad); break; case UART_1: /* 配置串口1:配置IO口模式 */ UART1_BaudRateCfg(buad); R8_UART1_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO open, trigger point 14 bytes R8_UART1_LCR = RB_LCR_WORD_SZ; R8_UART1_IER = RB_IER_TXD_EN; GPIO_PinRemapConfig(GPIO_NoRemap_UART1,ENABLE); GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP); GPIOB_ModeCfg(GPIO_Pin_10, GPIO_ModeIN_Floating); UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY); NVIC_EnableIRQ(UART1_IRQn); memset(&g_uart[UART_1],0,sizeof(UART_t)); Set_Uart_recvTimeout(&g_uart[UART_1],buad); break; case UART_2: UART2_BaudRateCfg(buad); R8_UART2_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO open, trigger point 14 bytes R8_UART2_LCR = RB_LCR_WORD_SZ; R8_UART2_IER = RB_IER_TXD_EN; GPIO_PinRemapConfig(GPIO_PartialRemap1_UART2,ENABLE); GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP); GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating); UART2_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY); NVIC_EnableIRQ(UART2_IRQn); memset(&g_uart[UART_2],0,sizeof(UART_t)); Set_Uart_recvTimeout(&g_uart[UART_2],buad); break; case UART_3: UART3_BaudRateCfg(buad); R8_UART3_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO open, trigger point 14 bytes R8_UART3_LCR = RB_LCR_WORD_SZ; R8_UART3_IER = RB_IER_TXD_EN; GPIO_PinRemapConfig(GPIO_PartialRemap1_UART3,ENABLE); GPIOB_ModeCfg(GPIO_Pin_19, GPIO_ModeOut_PP); GPIOB_ModeCfg(GPIO_Pin_18, GPIO_ModeIN_Floating); UART3_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY); NVIC_EnableIRQ(UART3_IRQn); memset(&g_uart[UART_3],0,sizeof(UART_t)); Set_Uart_recvTimeout(&g_uart[UART_3],buad); break; } } __attribute__((section(".non_0_wait"))) void Set_Uart_recvTimeout(UART_t *set_uart,uint32_t baud) { if(baud == 115200) { set_uart->RecvTimeout = Recv_115200_TimeOut; }else if(baud == 9600) { set_uart->RecvTimeout = Recv_9600_TimeOut; }else if(baud == 2400) { set_uart->RecvTimeout = Recv_2400_TimeOut; }else { set_uart->RecvTimeout = 20; } } /********************************************************************* * @fn USART1_IRQHandler * * @brief USART1中断函数 * * @return none */ void UART0_IRQHandler(void) { switch( UART0_GetITFlag() ) { case UART_II_THR_EMPTY: break; case UART_II_RECV_RDY: case UART_II_RECV_TOUT: if( (g_uart[UART_0].RecvLen + 1) >= USART_BUFFER_SIZE ) g_uart[UART_0].RecvLen = 0x00; g_uart[UART_0].RecvBuffer[g_uart[UART_0].RecvLen] = UART0_RecvByte(); g_uart[UART_0].RecvLen += 1; g_uart[UART_0].Receiving = 0x01; g_uart[UART_0].RecvIdleTiming = SysTick_1ms; break; } } /********************************************************************* * @fn USART1_IRQHandler * * @brief USART1中断函数 * * @return none */ void UART1_IRQHandler(void) { switch( UART1_GetITFlag() ) { case UART_II_THR_EMPTY: break; case UART_II_RECV_RDY: case UART_II_RECV_TOUT: if( (g_uart[UART_1].RecvLen + 1) >= USART_BUFFER_SIZE ) g_uart[UART_1].RecvLen = 0x00; g_uart[UART_1].RecvBuffer[g_uart[UART_1].RecvLen] = UART1_RecvByte(); g_uart[UART_1].RecvLen += 1; g_uart[UART_1].Receiving = 0x01; g_uart[UART_1].RecvIdleTiming = SysTick_1ms; break; } } /********************************************************************* * @fn UART2_IRQHandler * * @brief USART2中断函数 * * @return none */ void UART2_IRQHandler(void) { switch( UART2_GetITFlag() ) { case UART_II_THR_EMPTY: break; case UART_II_RECV_RDY: case UART_II_RECV_TOUT: if( (g_uart[UART_2].RecvLen + 1) >= USART_BUFFER_SIZE ) g_uart[UART_2].RecvLen = 0x00; g_uart[UART_2].RecvBuffer[g_uart[UART_2].RecvLen] = UART2_RecvByte(); g_uart[UART_2].RecvLen += 1; g_uart[UART_2].Receiving = 0x01; g_uart[UART_2].RecvIdleTiming = SysTick_1ms; break; } } /********************************************************************* * @fn USART3_IRQHandler * * @brief USART3中断函数 * * @return none */ void UART3_IRQHandler(void) { switch( UART3_GetITFlag() ) { case UART_II_THR_EMPTY: break; case UART_II_RECV_RDY: case UART_II_RECV_TOUT: if( (g_uart[UART_3].RecvLen + 1) >= USART_BUFFER_SIZE ) g_uart[UART_3].RecvLen = 0x00; g_uart[UART_3].RecvBuffer[g_uart[UART_3].RecvLen] = UART3_RecvByte(); g_uart[UART_3].RecvLen += 1; g_uart[UART_3].Receiving = 0x01; g_uart[UART_3].RecvIdleTiming = SysTick_1ms; break; } } /********************************************************************* * @fn USART1_RECEIVE * * @brief USART1 * * @return none */ __attribute__((section(".non_0_wait"))) void UART0_RECEIVE(void) { if(g_uart[UART_0].Receiving == 0x01) { if(SysTick_1ms - g_uart[UART_0].RecvIdleTiming >= g_uart[UART_0].RecvTimeout) { g_uart[UART_0].RecvIdleTiming = SysTick_1ms; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART_0 Len %d ",g_uart[UART_0].RecvLen); Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_0 Buff:", g_uart[UART_0].RecvBuffer,g_uart[UART_0].RecvLen); g_uart[UART_0].RecvLen = 0; g_uart[UART_0].Receiving = 0; } } } /********************************************************************* * @fn USART1_RECEIVE * * @brief USART1 * * @return none */ __attribute__((section(".non_0_wait"))) void UART1_RECEIVE(void) { if(g_uart[UART_1].Receiving == 0x01) { if(SysTick_1ms - g_uart[UART_1].RecvIdleTiming >= g_uart[UART_1].RecvTimeout) { g_uart[UART_1].RecvIdleTiming = SysTick_1ms; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART_1 Len %d ",g_uart[UART_1].RecvLen); Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_1 Buff:", g_uart[UART_1].RecvBuffer,g_uart[UART_1].RecvLen); g_uart[UART_1].RecvLen = 0; g_uart[UART_1].Receiving = 0; } } } /********************************************************************* * @fn UART2_RECEIVE * * @brief USART2 * * @return none */ __attribute__((section(".non_0_wait"))) void UART2_RECEIVE(void) { if(g_uart[UART_2].Receiving == 1) { if(SysTick_1ms - g_uart[UART_2].RecvIdleTiming > g_uart[UART_2].RecvTimeout) { g_uart[UART_2].RecvIdleTiming = SysTick_1ms; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART_2 Len %d ",g_uart[UART_2].RecvLen); Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_2 Buff:", g_uart[UART_2].RecvBuffer,g_uart[UART_2].RecvLen); g_uart[UART_2].RecvLen = 0; g_uart[UART_2].Receiving = 0; } } } /********************************************************************* * @fn USART3_RECEIVE * * @brief UART3 * * @return none */ __attribute__((section(".non_0_wait"))) void UART3_RECEIVE(void) { if(g_uart[UART_3].Receiving == 1) { if(SysTick_1ms - g_uart[UART_3].RecvIdleTiming > g_uart[UART_3].RecvTimeout) { g_uart[UART_3].RecvIdleTiming = SysTick_1ms; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART_3 Len %d ",g_uart[UART_3].RecvLen); Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_3 Buff:", g_uart[UART_3].RecvBuffer,g_uart[UART_3].RecvLen); g_uart[UART_3].RecvLen = 0; g_uart[UART_3].Receiving = 0; } } } /********************************************************************* * @fn UART0_ChangeBaud * * @brief UART0切换波特率 * * @return none */ uint8_t UART0_ChangeBaud(uint32_t baudrate) { uint16_t delay_num = 0; while(1) { if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP ) { /*发送为空*/ __disable_irq(); UART0_Reset(); GPIO_PinRemapConfig(GPIO_NoRemap_UART0,ENABLE); GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP); GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_Floating); UART0_BaudRateCfg(baudrate); R8_UART0_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO open, trigger point 14 bytes R8_UART0_LCR = RB_LCR_WORD_SZ; R8_UART0_IER = RB_IER_TXD_EN; UART0_CLR_RXFIFO(); UART0_CLR_TXFIFO(); UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY); NVIC_EnableIRQ(UART0_IRQn); Set_Uart_recvTimeout(&g_uart[UART_0],baudrate); __enable_irq(); return 0; } Delay_Us(100); delay_num++; if(delay_num > 500) break; } return 1; } /********************************************************************* * @fn UART1_ChangeBaud * * @brief UART1切换波特率 * * @return none */ uint8_t UART1_ChangeBaud(uint32_t baudrate) { uint16_t delay_num = 0; while(1) { if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP ) { /*发送为空*/ __disable_irq(); UART1_Reset(); GPIO_PinRemapConfig(GPIO_NoRemap_UART1,ENABLE); GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP); GPIOB_ModeCfg(GPIO_Pin_10, GPIO_ModeIN_Floating); UART1_BaudRateCfg(baudrate); R8_UART1_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO open, trigger point 14 bytes R8_UART1_LCR = RB_LCR_WORD_SZ; R8_UART1_IER = RB_IER_TXD_EN; UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY); NVIC_EnableIRQ(UART1_IRQn); Set_Uart_recvTimeout(&g_uart[UART_1],baudrate); __enable_irq(); return 0; } Delay_Us(100); delay_num++; if(delay_num > 500) break; } return 1; } /********************************************************************* * @fn UART2_ChangeBaud * * @brief UART2切换波特率 * * @return none */ uint8_t UART2_ChangeBaud(uint32_t baudrate) { uint16_t delay_num = 0; while(1) { if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP ) { /*发送为空*/ __disable_irq(); UART2_Reset(); GPIO_PinRemapConfig(GPIO_PartialRemap1_UART2,ENABLE); GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP); GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating); UART2_BaudRateCfg(baudrate); R8_UART2_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO open, trigger point 14 bytes R8_UART2_LCR = RB_LCR_WORD_SZ; R8_UART2_IER = RB_IER_TXD_EN; UART2_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY); NVIC_EnableIRQ(UART2_IRQn); Set_Uart_recvTimeout(&g_uart[UART_2],baudrate); __enable_irq(); return 0; } Delay_Us(100); delay_num++; if(delay_num > 500) break; } return 1; } /********************************************************************* * @fn UART3_ChangeBaud * * @brief UART3切换波特率 * * @return none */ uint8_t UART3_ChangeBaud(uint32_t baudrate) { uint16_t delay_num = 0; while(1) { if( UART0_GetLinSTA() & RB_LSR_TX_ALL_EMP ) { /*发送为空*/ __disable_irq(); UART3_Reset(); GPIO_PinRemapConfig(GPIO_PartialRemap1_UART3,ENABLE); GPIOB_ModeCfg(GPIO_Pin_19, GPIO_ModeOut_PP); GPIOB_ModeCfg(GPIO_Pin_18, GPIO_ModeIN_Floating); UART3_BaudRateCfg(baudrate); R8_UART3_FCR = RB_FCR_FIFO_TRIG | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO open, trigger point 14 bytes R8_UART3_LCR = RB_LCR_WORD_SZ; R8_UART3_IER = RB_IER_TXD_EN; UART3_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_THR_EMPTY); NVIC_EnableIRQ(UART3_IRQn); Set_Uart_recvTimeout(&g_uart[UART_3],baudrate); __enable_irq(); return 0; } Delay_Us(100); delay_num++; if(delay_num > 500) break; } return 1; } /******************************************************************************* * Function Name : Uart0_Flush * Description : 串口0等待发送完成 * Input : over_time -- 等待超时时间 * Return : None *******************************************************************************/ void Uart0_Flush(uint16_t over_time) { uint16_t delay_num = 0; //等待发送完成 - 50ms while(1) { WDT_Feed(); //防止看门狗复位 if( (R8_UART0_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空 Delay_Us(100); delay_num++; if(delay_num > over_time) break; } } /******************************************************************************* * Function Name : Uart1_Flush * Description : 串口1等待发送完成 * Input : over_time -- 等待超时时间 * Return : None *******************************************************************************/ void Uart1_Flush(uint16_t over_time) { uint16_t delay_num = 0; //等待发送完成 - 50ms while(1) { WDT_Feed(); //防止看门狗复位 if( (R8_UART1_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空 Delay_Us(100); delay_num++; if(delay_num > over_time) break; } } /******************************************************************************* * Function Name : Uart2_Flush * Description : 串口2等待发送完成 * Input : over_time -- 等待超时时间 * Return : None *******************************************************************************/ void Uart2_Flush(uint16_t over_time) { uint16_t delay_num = 0; //等待发送完成 - 50ms while(1) { WDT_Feed(); //防止看门狗复位 if( (R8_UART2_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空 Delay_Us(100); delay_num++; if(delay_num > over_time) break; } } /******************************************************************************* * Function Name : Uart3_Flush * Description : 串口3等待发送完成 * Input : over_time -- 等待超时时间 * Return : None *******************************************************************************/ void Uart3_Flush(uint16_t over_time) { uint16_t delay_num = 0; //等待发送完成 - 50ms while(1) { WDT_Feed(); //防止看门狗复位 if( (R8_UART3_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空 Delay_Us(100); delay_num++; if(delay_num > over_time) break; } } /******************************************************************************* * Function Name : Uart_SendString * Description : 串口发送函数函数 * Input : * uart_id - 发送的串口号 * buff - 发送数据 * len - 发送数据长度 * Return : None *******************************************************************************/ void Uart_SendString(uint8_t uart_id,uint8_t* buff,uint16_t len) { switch(uart_id) { case UART_0: UART0_SendString(buff,len); break; case UART_1: UART1_SendString(buff,len); break; case UART_2: UART2_SendString(buff,len); break; case UART_3: UART3_SendString(buff,len); break; default: break; } } /******************************************************************************* * Function Name : MCU485_SendString_1 * Description : 485_1 发送函数 * Input : buf - 发送数据 l - 发送数据长度 * Return : None *******************************************************************************/ void MCU485_SendString_1(uint8_t *buf, uint16_t len) { uint16_t delay_num = 0; MCU485_EN1_H; UART1_SendString(buf,len); //等待发送完成 - 50ms while(1) { WDT_Feed(); if( (R8_UART1_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空 Delay_Us(100); delay_num++; if(delay_num > 500) break; } MCU485_EN1_L; } /******************************************************************************* * Function Name : MCU485_SendString_2 * Description : 485_2 发送函数 * Input : buf - 发送数据 len - 发送数据长度 * Return : None *******************************************************************************/ void MCU485_SendString_2(uint8_t *buf, uint16_t len) { uint16_t delay_num = 0; MCU485_EN2_H; UART2_SendString(buf,len); //等待发送完成 - 50ms while(1) { WDT_Feed(); if( (R8_UART2_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空 Delay_Us(100); delay_num++; if(delay_num > 500) break; } MCU485_EN2_L; } /******************************************************************************* * Function Name : MCU485_SendString_3 * Description : 485_3 发送函数 * Input : buf - 发送数据 len - 发送数据长度 * Return : None *******************************************************************************/ void MCU485_SendString_3(uint8_t *buf, uint16_t len) { uint16_t delay_num = 0; MCU485_EN3_H; UART3_SendString(buf,len); //等待发送完成 - 50ms while(1) { WDT_Feed(); if( (R8_UART3_LSR & RB_LSR_TX_ALL_EMP) != 0x00 ) break; //判断发送FIFO为空,同时FIFO计数为空 Delay_Us(100); delay_num++; if(delay_num > 500) break; } MCU485_EN3_L; } /******************************************************************************* * Function Name : MCU485_SendString * Description : 485发送函数函数 * Input : uart_id - 发送的串口号 buff - 发送数据 len -- 发送数据长度 * Return : None *******************************************************************************/ void MCU485_SendString(uint8_t uart_id,uint8_t* buff,uint16_t len) { switch(uart_id) { case UART_1: if(Poll485_Info.port_mode == Port_Monitoring_mode ) //轮询端口 { //Udp_Internal_SeriaNet_Uploading2(Polling_Port,Poll485_Info.baud,buff,len); } MCU485_SendString_1(buff,len); break; case UART_2: if(Act485_Info.port_mode == Port_Monitoring_mode ) //轮询端口 { //Udp_Internal_SeriaNet_Uploading2(Active_Port,Act485_Info.baud,buff,len); } MCU485_SendString_2(buff,len); break; case UART_3: if(BUS485_Info.port_mode == Port_Monitoring_mode ) //轮询端口 { //Udp_Internal_SeriaNet_Uploading2(Bus_port,BUS485_Info.baud,buff,len); } MCU485_SendString_3(buff,len); break; } } /******************************************************************************* * Function Name : MCU485_SendString * Description : 485发送函数函数 * Input : uart_id - 发送的串口号 data_addr - SRAM中发送数据地址 len -- 发送数据长度 * Return : None *******************************************************************************/ void MCU485_SendSRAMData(uint8_t uart_id,uint32_t data_addr,uint16_t len) { uint16_t buff_len = len; uint8_t send_buff[buff_len]; memset(send_buff,0,sizeof(send_buff)); SRAM_DMA_Read_Buff(send_buff,buff_len,data_addr); //读取数据内容 MCU485_SendString(uart_id,send_buff,buff_len); } /******************************************************************************* * Function Name : Write_Uart_SendBuff * Description : 写uart发送缓冲区 * Input : uart_id - 发送的串口号 uart_baud - 发送数据 buff - 发送数据 len -- 发送数据长度 *******************************************************************************/ void Write_Uart_SendBuff(uint8_t uart_id,uint8_t uart_outime,uint8_t* buff,uint16_t len) { switch(uart_id) { case Polling_Port: //轮询 uart_id = UART_0; break; case Active_Port: //主动 uart_id = UART_2; break; case Bus_port: //bus总线 uart_id = UART_3; break; } switch(uart_id) { case UART_0: /*数据长度*/ SRAM_Write_Word(len,g_uart[UART_0].TX_Buffer_WriteAddr); /*数据发送 - 等待回复时间 , 单位:S*/ SRAM_Write_Byte(uart_outime,g_uart[UART_0].TX_Buffer_WriteAddr+2); /*数据内容*/ SRAM_DMA_Write_Buff(buff,len,g_uart[UART_0].TX_Buffer_WriteAddr+3); g_uart[UART_0].TX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size; if(g_uart[UART_0].TX_Buffer_WriteAddr > SRAM_UART0_SendBuffer_End_Addr) g_uart[UART_0].TX_Buffer_WriteAddr = SRAM_UART0_SendBuffer_Start_Addr; break; case UART_1: /*数据长度*/ SRAM_Write_Word(len,g_uart[UART_1].TX_Buffer_WriteAddr); /*数据发送 - 等待回复时间 , 单位:S*/ SRAM_Write_Byte(uart_outime,g_uart[UART_1].TX_Buffer_WriteAddr+2); /*数据内容*/ SRAM_DMA_Write_Buff(buff,len,g_uart[UART_1].TX_Buffer_WriteAddr+3); g_uart[UART_1].TX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size; if(g_uart[UART_1].TX_Buffer_WriteAddr > SRAM_UART1_SendBuffer_End_Addr) g_uart[UART_1].TX_Buffer_WriteAddr = SRAM_UART1_SendBuffer_Start_Addr; break; case UART_2: /*数据长度*/ SRAM_Write_Word(len,g_uart[UART_2].TX_Buffer_WriteAddr); /*数据发送 - 等待回复时间 , 单位:S*/ SRAM_Write_Byte(uart_outime,g_uart[UART_2].TX_Buffer_WriteAddr+2); /*数据内容*/ SRAM_DMA_Write_Buff(buff,len,g_uart[UART_2].TX_Buffer_WriteAddr+3); g_uart[UART_2].TX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size; if(g_uart[UART_2].TX_Buffer_WriteAddr > SRAM_UART2_SendBuffer_End_Addr) g_uart[UART_2].TX_Buffer_WriteAddr = SRAM_UART2_SendBuffer_Start_Addr; break; case UART_3: /*数据长度*/ SRAM_Write_Word(len,g_uart[UART_3].TX_Buffer_WriteAddr); /*数据发送 - 等待回复时间 , 单位:S*/ SRAM_Write_Byte(uart_outime,g_uart[UART_3].TX_Buffer_WriteAddr+2); /*数据内容*/ SRAM_DMA_Write_Buff(buff,len,g_uart[UART_3].TX_Buffer_WriteAddr+3); g_uart[UART_3].TX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size; if(g_uart[UART_3].TX_Buffer_WriteAddr > SRAM_UART3_SendBuffer_End_Addr) g_uart[UART_3].TX_Buffer_WriteAddr = SRAM_UART3_SendBuffer_Start_Addr; break; default: break; } }