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
98 lines
4.7 KiB
2 days ago
|
#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__ */
|