/****************************************************************************** * @file rs485.h * @brief RS485 串口通信驱动头文件 * @details 本文件声明 RS485 通信相关接口与数据结构,支持 DMA 接收与中断接收两种模式。 * 使用 USART2,收发切换通过 DE 引脚(PA1)控制。 * @author 阜阳师范大学物电学院 * @version V0.01 * @date 2026.1.24 * @note USART:USART2 * TX:PA2,RX:PA3,DE:PA1 * 波特率:700000 ******************************************************************************/ #ifndef __RS485_H__ #define __RS485_H__ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/delay/delay.h" /* ============================================================================ * 宏定义 * ============================================================================ */ #define UART_RX_LEN (4208) /**< 接收缓冲区长度(字节),与 Modbus 数据帧长度一致 */ #define UART_TX_LEN (8) /**< 发送缓冲区长度(字节) */ /* ============================================================================ * 数据结构定义 * ============================================================================ */ /** * @brief RS485 收发寄存器结构体 * @note 用于存放一帧接收数据及发送缓存,与 Modbus 处理模块配合使用 */ typedef struct { volatile FlagStatus NewMessageFlag; /**< 新消息标志:一帧数据接收完成时置位 */ volatile uint8_t DR[UART_RX_LEN]; /**< 接收缓存 */ volatile uint8_t TDR[UART_TX_LEN]; /**< 发送缓存 */ } RS485_REGISTER_TYPE; extern RS485_REGISTER_TYPE RS485REG; /**< 全局 RS485 收发寄存器 */ extern UART_HandleTypeDef rs485_handle; /* ============================================================================ * 函数声明 * ============================================================================ */ /** * @brief RS485 初始化(DMA 接收模式) * @note 配置 GPIO、UART、DMA,启动 ReceiveToIdle DMA 接收。为主工作模式。 * @retval 无 */ void RS485_DMA_init(void); /** * @brief RS485 反初始化(DMA 接收模式) * @note 按照与初始化相反的顺序清理资源:停止 DMA、禁用中断、反初始化 DMA/UART/GPIO。 * @retval 无 */ void RS485_DMA_DeInit(void); /** * @brief RS485 初始化(中断接收模式) * @note 配置 GPIO、UART,使能 RXNE 中断接收。用于异常恢复或短帧接收。 * @retval 无 */ void RS485_init(void); /** * @brief RS485 发送数据 * @param ptr 待发送数据指针 * @param len 待发送字节数 * @note 先切换为发送(DE 高),发送完成后切回接收(DE 低)。使用阻塞方式发送。 * @retval 无 */ void RS485_SendBuff(uint8_t *ptr, uint32_t len); #endif /* __RS485_H__ */