#include "uart_dev.h" #include "FreeRTOS.h" device_handle g_J0_handle; device_handle g_J1_handle; device_handle g_J2_handle; device_handle g_J3_handle; device_handle g_J4_handle; device_handle g_J5_handle; device_handle g_J6_handle; device_handle g_J7_handle; device_handle g_J8_handle; device_handle g_J9_handle; device_handle g_Mcu_handle; device_handle g_Su806_handle; device_handle g_Lora_handle; static int32_t rs485BuffLen; static int32_t loraBuffLen; static int32_t mcuBuffLen; static int32_t su806BuffLen; static uint8_t *J0Buff; static uint8_t *J1Buff; static uint8_t *J2Buff; static uint8_t *J3Buff; static uint8_t *J4Buff; static uint8_t *J5Buff; static uint8_t *J6Buff; static uint8_t *J7Buff; static uint8_t *J8Buff; static uint8_t *J9Buff; static uint8_t *LoraBuff; static uint8_t *McuBuff; static uint8_t *Su806Buff; /** * @brief 串口信息初始化,串口号及波特率. * @param uart_index 对应的硬件串口号 * @param uart_baudrate 波特率 */ uart_device_info uart_devices[]={ [0] = { .init = 0, .uart_index = J01_485_INDEX, .uart_baudrate = 9600, }, [1] = { .init = 0, .uart_index = J23_485_INDEX, .uart_baudrate = 9600, }, [2] = { .init = 0, .uart_index = J45_485_INDEX, .uart_baudrate = 9600, }, [3] = { .init = 0, .uart_index = J67_485_INDEX, .uart_baudrate = 9600, }, [4] = { .init = 0, .uart_index = J8_485_INDEX, .uart_baudrate = 9600, }, [5] = { .init = 0, .uart_index = J9_485_INDEX, .uart_baudrate = 9600, }, [6] = { .init = 0, .uart_index = Lora_UART_INDEX, .uart_baudrate = 9600, }, [7] = { .init = 0, .uart_index = Su806_UART_INDEX, .uart_baudrate = 115200, }, [8] = { .init = 0, .uart_index = MCU_UART_INDEX, .uart_baudrate = 115200, }, }; static device_handle uart_dev_init(uartIndex_e uart_index, uint8_t *buff, int buff_size); static void uart_init(uartIndex_e uart_index, uint32_t baud); /** * @brief 初始化串口设备. * @param uart_index 初始化串口号 * @param buff 串口循环buff地址 * @param buff_size 串口循环buff对应大小 * @retval 串口句柄 */ device_handle uart_dev_init(uartIndex_e uart_index, uint8_t *buff, int buff_size) { int i = 0; for (; i < ELEMENT_OF(uart_devices); i++) { if (uart_devices[i].uart_index == uart_index) { if (!uart_devices[i].init) { InitRingQueue(&uart_devices[i].uart_ring_queue, buff, buff_size); uart_init(uart_index, uart_devices[i].uart_baudrate); uart_devices[i].init = 1; } return (device_handle)(&uart_devices[i]); } } return 0; } /** * @brief 串口硬件初始化. * @param uart_index 串口号 * @param baud 波特率 * @retval None */ void uart_init(uartIndex_e uart_index, uint32_t baud) { if (uart_index == J01_485_INDEX) { uart3Init(baud); } else if (uart_index == J23_485_INDEX) { uart4Init(baud); } else if (uart_index == J45_485_INDEX) { uart5Init(baud); } else if (uart_index == J67_485_INDEX) { uart6Init(baud); } else if (uart_index == J8_485_INDEX) { uart8Init(baud); } else if (uart_index == J9_485_INDEX) { uart7Init(baud); } else if (uart_index == Lora_UART_INDEX) { uart7Init(baud); } else if (uart_index == Su806_UART_INDEX) { uart8Init(baud); } else if (uart_index == MCU_UART_INDEX) { uart2Init(baud); } } /** * @brief 从串口设备循环buff读取一个数据. * @param device 串口句柄 * @retval 读取到的字符 */ uint8_t uart_dev_in_char(device_handle device) { uart_device_info *device_info = (uart_device_info *)device; char c = 0; if (uart_dev_char_present(device)) OutRingQueue(&device_info->uart_ring_queue, (u_int8_t*)&c); return c; } /** * @brief 判断串口设备循环buff是否有数据. * @param device 串口句柄 * @retval 0 空 1有数据 */ int uart_dev_char_present(device_handle device) { uart_device_info *device_info = (uart_device_info *)device; if((!device) || (!device_info->init)) return 0; return !RingQueueEmpty(&device_info->uart_ring_queue); } /** * @brief 主mcu初始化串口buff. * @param rs485BufLen 485buff的长度 loraBufLen lora通信buff的长度 mcuBufLen mcu通信buff的长度 su806BufLen su806通信buff的长度 * @retval */ void HostMcu_uartBuf_Init(int32_t rs485BufLen, int32_t loraBufLen, int32_t mcuBufLen, int32_t su806BufLen) { rs485BuffLen = rs485BufLen; loraBuffLen = loraBufLen; mcuBuffLen = mcuBufLen; su806BuffLen = su806BufLen; J0Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); J2Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); J4Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); J6Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); McuBuff = (uint8_t *)pvPortMalloc(mcuBuffLen); Su806Buff = (uint8_t *)pvPortMalloc(su806BuffLen); LoraBuff = (uint8_t *)pvPortMalloc(loraBuffLen); } /** * @brief 从mcu初始化串口buff. * @param rs485BufLen 485buff的长度 mcuBufLen mcu通信buff的长度 * @retval */ void SlaveMcu_uartBuf_Init(int32_t rs485BufLen, int32_t mcuBufLen) { rs485BuffLen = rs485BufLen; mcuBuffLen = mcuBufLen; J1Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); J3Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); J4Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); J7Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); J8Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); J9Buff = (uint8_t *)pvPortMalloc(rs485BuffLen); McuBuff = (uint8_t *)pvPortMalloc(mcuBuffLen); } void Init_J0_485(uint32_t baud) { uart_devices[0].uart_baudrate = baud; g_J0_handle = uart_dev_init(J01_485_INDEX, J0Buff, rs485BuffLen); } void Init_J1_485(uint32_t baud) { uart_devices[0].uart_baudrate = baud; g_J1_handle = uart_dev_init(J01_485_INDEX, J1Buff, rs485BuffLen); } void Init_J2_485(uint32_t baud) { uart_devices[1].uart_baudrate = baud; g_J2_handle = uart_dev_init(J23_485_INDEX, J2Buff, rs485BuffLen); } void Init_J3_485(uint32_t baud) { uart_devices[1].uart_baudrate = baud; g_J3_handle = uart_dev_init(J23_485_INDEX, J3Buff, rs485BuffLen); } void Init_J4_485(uint32_t baud) { uart_devices[2].uart_baudrate = baud; g_J4_handle = uart_dev_init(J45_485_INDEX, J4Buff, rs485BuffLen); } void Init_J5_485(uint32_t baud) { uart_devices[2].uart_baudrate = baud; g_J5_handle = uart_dev_init(J45_485_INDEX, J5Buff, rs485BuffLen); } void Init_J6_485(uint32_t baud) { uart_devices[3].uart_baudrate = baud; g_J6_handle = uart_dev_init(J67_485_INDEX, J6Buff, rs485BuffLen); } void Init_J7_485(uint32_t baud) { uart_devices[3].uart_baudrate = baud; g_J7_handle = uart_dev_init(J67_485_INDEX, J7Buff, rs485BuffLen); } void Init_J8_485(uint32_t baud) { uart_devices[4].uart_baudrate = baud; g_J8_handle = uart_dev_init(J8_485_INDEX, J8Buff, rs485BuffLen); } void Init_J9_485(uint32_t baud) { uart_devices[5].uart_baudrate = baud; g_J9_handle = uart_dev_init(J9_485_INDEX, J9Buff, rs485BuffLen); } void Init_Lora_Uart(uint32_t baud) { uart_devices[6].uart_baudrate = baud; g_Lora_handle = uart_dev_init(Lora_UART_INDEX, LoraBuff, loraBuffLen); } void Init_Su806_Uart(uint32_t baud) { uart_devices[7].uart_baudrate = baud; g_Su806_handle = uart_dev_init(Su806_UART_INDEX, Su806Buff, su806BuffLen); } void Init_Mcu_Uart(uint32_t baud) { uart_devices[8].uart_baudrate = baud; g_Mcu_handle = uart_dev_init(MCU_UART_INDEX, McuBuff, mcuBuffLen); } /** * @brief mcu初始化串口中断. * @retval */ void uartIT_Init(void) { if (getMCU()) { setIDLE(J0_USART, ENABLE); setIDLE(J2_USART, ENABLE); setIDLE(J4_USART, ENABLE); setIDLE(J6_USART, ENABLE); } else { setIDLE(J1_USART, ENABLE); setIDLE(J3_USART, ENABLE); setIDLE(J5_USART, ENABLE); setIDLE(J7_USART, ENABLE); setIDLE(J8_USART, ENABLE); setIDLE(J9_USART, ENABLE); } } /* 串口中断处理函数 */ void J0_Interrupt() { if (getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J0_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J0_485_IN_RXNE(); } c = USART_ReceiveData(J0_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J0_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J0_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J0_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J0_USART, USART_IT_TXE, DISABLE); J0_485_IN_TXE(); return; } USART_SendData(J0_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J0_USART, USART_IT_IDLE) != RESET) { J0_USART->STATR; J0_USART->DATAR; J0_485_IN_IDLE(); } } void J1_Interrupt() { if (!getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J1_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J1_485_IN_RXNE(); } c = USART_ReceiveData(J1_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J1_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J1_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J1_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J1_USART, USART_IT_TXE, DISABLE); J1_485_IN_TXE(); return; } USART_SendData(J1_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J1_USART, USART_IT_IDLE) != RESET) { J1_USART->STATR; J1_USART->DATAR; J1_485_IN_IDLE(); } } void J2_Interrupt() { if (getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J2_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J2_485_IN_RXNE(); } c = USART_ReceiveData(J2_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J2_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J2_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J2_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J2_USART, USART_IT_TXE, DISABLE); J2_485_IN_TXE(); return; } USART_SendData(J2_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J2_USART, USART_IT_IDLE) != RESET) { J2_USART->STATR; J2_USART->DATAR; J2_485_IN_IDLE(); } } void J3_Interrupt() { if (!getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J3_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J3_485_IN_RXNE(); } c = USART_ReceiveData(J3_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J3_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J3_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J3_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J3_USART, USART_IT_TXE, DISABLE); J3_485_IN_TXE(); return; } USART_SendData(J3_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J3_USART, USART_IT_IDLE) != RESET) { J3_USART->STATR; J3_USART->DATAR; J3_485_IN_IDLE(); } } void J4_Interrupt() { if (getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J4_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J4_485_IN_RXNE(); } c = USART_ReceiveData(J4_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J4_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J4_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J4_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J4_USART, USART_IT_TXE, DISABLE); J4_485_IN_TXE(); return; } USART_SendData(J4_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J4_USART, USART_IT_IDLE) != RESET) { J4_USART->STATR; J4_USART->DATAR; J4_485_IN_IDLE(); } } void J5_Interrupt() { if (!getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J5_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J5_485_IN_RXNE(); } c = USART_ReceiveData(J5_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J5_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J5_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J5_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J5_USART, USART_IT_TXE, DISABLE); J5_485_IN_TXE(); return; } USART_SendData(J5_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J5_USART, USART_IT_IDLE) != RESET) { J5_USART->STATR; J5_USART->DATAR; J5_485_IN_IDLE(); } } void J6_Interrupt() { if (getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J1_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J6_485_IN_RXNE(); } c = USART_ReceiveData(J6_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J6_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J6_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J6_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J6_USART, USART_IT_TXE, DISABLE); J6_485_IN_TXE(); return; } USART_SendData(J6_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J6_USART, USART_IT_IDLE) != RESET) { J6_USART->STATR; J6_USART->DATAR; J6_485_IN_IDLE(); } } void J7_Interrupt() { if (!getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J7_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J7_485_IN_RXNE(); } c = USART_ReceiveData(J7_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J7_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J7_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J7_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J7_USART, USART_IT_TXE, DISABLE); J7_485_IN_TXE(); return; } USART_SendData(J7_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J7_USART, USART_IT_IDLE) != RESET) { J7_USART->STATR; J7_USART->DATAR; J7_485_IN_IDLE(); } } void J8_Interrupt() { if (!getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J8_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J8_485_IN_RXNE(); } c = USART_ReceiveData(J8_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J8_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J8_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J8_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J8_USART, USART_IT_TXE, DISABLE); J8_485_IN_TXE(); return; } USART_SendData(J8_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J8_USART, USART_IT_IDLE) != RESET) { J8_USART->STATR; J8_USART->DATAR; J8_485_IN_IDLE(); } } void J9_Interrupt() { if (!getMCU()) { return; } /* 数据接收中断 */ static uint8_t flag = 0; static uint8_t c; if (USART_GetITStatus(J9_USART, USART_IT_RXNE) != RESET) { if (flag == 0) { flag = 1; J9_485_IN_RXNE(); } c = USART_ReceiveData(J9_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_J9_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(J9_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_J9_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(J9_USART, USART_IT_TXE, DISABLE); J9_485_IN_TXE(); return; } USART_SendData(J9_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } /* 空闲中断 */ if (USART_GetITStatus(J9_USART, USART_IT_IDLE) != RESET) { J9_USART->STATR; J9_USART->DATAR; J9_485_IN_IDLE(); } } void Mcu_Interrupt() { /* 数据接收中断 */ static uint8_t c; if (USART_GetITStatus(Mcu_USART, USART_IT_RXNE) != RESET) { c = USART_ReceiveData(Mcu_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_Mcu_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(Mcu_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_Mcu_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(Mcu_USART, USART_IT_TXE, DISABLE); if (getMCU()) { slaveMcu_uart_IN_TXE(); } else { hostMcu_uart_IN_TXE(); } return; } USART_SendData(Mcu_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } } void Su806_Interrupt() { if (getMCU()) { return; } /* 数据接收中断 */ static uint8_t c; if (USART_GetITStatus(Su806_USART, USART_IT_RXNE) != RESET) { c = USART_ReceiveData(Su806_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_Su806_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(Su806_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_Su806_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(Su806_USART, USART_IT_TXE, DISABLE); Su806_uart_IN_TXE(); return; } USART_SendData(Su806_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } } void Lora_Interrupt() { if (getMCU()) { return; } /* 数据接收中断 */ static uint8_t c; if (USART_GetITStatus(Lora_USART, USART_IT_RXNE) != RESET) { c = USART_ReceiveData(Lora_USART); //接收数据 uart_device_info *dev = (uart_device_info *)g_Lora_handle; if(!RingQueueFull(&dev->uart_ring_queue)) InRingQueue(&dev->uart_ring_queue, c); } /* 数据发送中断 */ if (USART_GetITStatus(Lora_USART, USART_IT_TXE) != RESET) { uart_device_info *dev = (uart_device_info *)g_Lora_handle; if (dev->uart_send_data.count >= dev->uart_send_data.len) { USART_ITConfig(Lora_USART, USART_IT_TXE, DISABLE); Lora_uart_IN_TXE(); return; } USART_SendData(Lora_USART, dev->uart_send_data.data[dev->uart_send_data.count++]); } }