You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
4.7 KiB

#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__ */