#ifndef __RS485_H__ #define __RS485_H__ #include "n32g45x.h" #include "ringbuffer.h" #define RS_DMA_TX_BUF_SIZE (32) #define RS_DMA_RX_BUF_SIZE (40) #define RS_UL1_DMA_TX_BUF_SIZE (RS_DMA_TX_BUF_SIZE) #define RS_UL2_DMA_TX_BUF_SIZE (RS_DMA_TX_BUF_SIZE) #define RS_UL3_DMA_TX_BUF_SIZE (RS_DMA_TX_BUF_SIZE) #define RS_DL1_DMA_TX_BUF_SIZE (RS_DMA_TX_BUF_SIZE) #define RS_DL2_DMA_TX_BUF_SIZE (RS_DMA_TX_BUF_SIZE) #define RS_DL3_DMA_TX_BUF_SIZE (RS_DMA_TX_BUF_SIZE) #define RS_UL1_DMA_RX_BUF_SIZE (RS_DMA_RX_BUF_SIZE) #define RS_UL2_DMA_RX_BUF_SIZE (RS_DMA_RX_BUF_SIZE) #define RS_UL3_DMA_RX_BUF_SIZE (RS_DMA_RX_BUF_SIZE) #define RS_DL1_DMA_RX_BUF_SIZE (RS_DMA_RX_BUF_SIZE) #define RS_DL2_DMA_RX_BUF_SIZE (RS_DMA_RX_BUF_SIZE) #define RS_DL3_DMA_RX_BUF_SIZE (RS_DMA_RX_BUF_SIZE) extern uint8_t rs_ul1_dma_tx_buf[RS_UL1_DMA_TX_BUF_SIZE]; extern uint8_t rs_ul2_dma_tx_buf[RS_UL2_DMA_TX_BUF_SIZE]; extern uint8_t rs_ul3_dma_tx_buf[RS_UL3_DMA_TX_BUF_SIZE]; extern uint8_t rs_dl1_dma_tx_buf[RS_DL1_DMA_TX_BUF_SIZE]; extern uint8_t rs_dl2_dma_tx_buf[RS_DL2_DMA_TX_BUF_SIZE]; extern uint8_t rs_dl3_dma_tx_buf[RS_DL3_DMA_TX_BUF_SIZE]; extern uint8_t rs_ul1_dma_rx_buf[RS_UL1_DMA_RX_BUF_SIZE]; extern uint8_t rs_ul2_dma_rx_buf[RS_UL2_DMA_RX_BUF_SIZE]; extern uint8_t rs_ul3_dma_rx_buf[RS_UL3_DMA_RX_BUF_SIZE]; extern uint8_t rs_dl1_dma_rx_buf[RS_DL1_DMA_RX_BUF_SIZE]; extern uint8_t rs_dl2_dma_rx_buf[RS_DL2_DMA_RX_BUF_SIZE]; extern uint8_t rs_dl3_dma_rx_buf[RS_DL3_DMA_RX_BUF_SIZE]; typedef struct stRS485 { char *name ; // 字符串名称,调试打印使用 // 收发管脚存在不在同一GPIO组的情况,所以收发分开 // 所有IO都是挂在APB2总线上的,所以配置IO时钟的函数没有放在这里 USART_Module* UART; uint32_t UART_CLK; // 串口时钟 void (*UART_APBxClkCmd)(uint32_t, FunctionalState); // 设置串口时钟的函数 GPIO_Module* UART_RxGPIO; // 接收管脚GPIO组 GPIOA、B、C.... uint16_t UART_RxPin; // 接收管脚Pin值 uint32_t UART_RxGPIO_CLK; // 接收管脚时钟 GPIO_Module* UART_TxGPIO; // 发送脚GPIO组 GPIOA、B、C.... uint16_t UART_TxPin; // 发送脚Pin值 uint32_t UART_TxGPIO_CLK; // 发送脚时钟 IRQn_Type UART_IRQn; // 接收中断通道 // 以上是与串口初始化相关的内容 //// 以下是控制485收发器的开关、收发模式相关的IO //GPIO_Module* TR_GPIO ; // 控制收发的GPIO组 //uint16_t TR_Pin ; // 控制收发的Pin值 //uint32_t TR_GPIO_CLK ; // 控制收发的管脚的时钟 //GPIO_Module* PWR_GPIO ; // 控制收发的GPIO组 //uint16_t PWR_Pin ; // 控制收发的Pin值 //uint32_t PWR_GPIO_CLK; // 控制收发的管脚的时钟 uint32_t DMA_RCC_AHBPeriph ; // DMA时钟 DMA_Module* DMAy ; // DMA1\DMA2 uint32_t PeriphAddr ; // 指定 DMAy Channelx 的外设基地址 uint8_t* TxBuf ; // uint32_t TxMemAddr ; // 指定 DMAy Channelx 的内存基地址 uint32_t TxBufSize ; // 指定指定通道的缓冲区大小,以数据为单位 DMA_ChannelType* TxDMAyChx ; // Tx DMA通道 uint32_t TxMAy_REMAP ; // uint8_t* RxBuf ; // uint32_t RxMemAddr ; // 指定 DMAy Channelx 的内存基地址 uint32_t RxBufSize ; // 指定指定通道的缓冲区大小,以数据为单位 DMA_ChannelType* RxDMAyChx ; // Rx DMA通道 uint32_t RxMAy_REMAP ; // uint32_t DMAyFlagHC ; // 半满标志位 uint32_t DMAyFlagTC ; // 全满标志位 uint32_t DMAy_IT_HC ; // 半满中断标志位 uint32_t DMAy_IT_TC ; // 全满中断标志位 IRQn_Type DMA_IRQn ; // DMA中断通道 RingBuffer_T rx_ringbuff; } RS485_T; void Rs485_UL_1_Init(RS485_T *rs485); void Rs485_UL_2_Init(RS485_T *rs485); void Rs485_UL_3_Init(RS485_T *rs485); void Rs485_DL_1_Init(RS485_T *rs485); void Rs485_DL_2_Init(RS485_T *rs485); void Rs485_DL_3_Init(RS485_T *rs485); void Rs485_Init(RS485_T *rs485, uint32_t BaudRate, uint16_t WordLength, uint16_t StopBits, uint16_t Parity); void RS485_Send(RS485_T *rs485, uint8_t *_buf, uint16_t _len); void Rs485_DMA_Revice_EN(RS485_T *rs485, uint16_t BufferLength); void RS485_Recieve_Process(RS485_T *rs485); #endif /* __RS485_H__ */