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.
97 lines
4.7 KiB
97 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__ */
|
|
|