stm32_ota/HARDWARE/RS485/rs485.c

79 lines
3.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "rs485.h"
#include <string.h>
#include <stdbool.h>
#include "sysport.h"
#include "usart.h"
#include "io.h"
/********************************************************************************
* @file rs485.c
* @author 晏诚科技 Mr.Wang
* @version V1.0.0
* @date 11-Dec-2018
* @brief 提供主板rs485外设驱动
******************************************************************************
* @使用方法:
* 先调用RS485Init()对RS485_COM初始化应用层通过RS485SendData()函数调用RS485发送
* 数据通过读取sRS485Queue帧缓冲区的数据来处理RS485接收到的数据
*******************************************************************************/
/*****************************************
*驱动内部使用常变量
****************************************/
/*****************************************
*驱动可供外部使用的常变量
****************************************/
FrameQueue_s sRS485Queue ; //RS485 接收数据帧数据环形缓冲区上层只需要在初始化RS485后处理该缓冲区数据即可
/**************************************************************************************************
* 名 称: void RS485Init(uint32_t baudrate)
* 功能说明: 1、对摄像机RS485的收发控制IO引脚进行初始化。
* 2、对RS485串口初始化
* 3、默认为485输入模式
* 4、初始化RS485接收帧缓冲区sRS485Queue
* 5、注册RS485串口接收帧回调函数
***************************************************************************************************/
void RS485Init(uint32_t baudrate)
{
Gpio_Init(RS485_RT_PORT, RS485_RT_PIN, GPIO_Mode_Out_PP) ; //初始化RS485 收发控制IO引脚
RS485_RX ; //初始化RS485为接收模式
InitQueueMem(&sRS485Queue) ; //初始化RS485接收帧缓冲区sRS485Queue
UARTx_Init(RS485_COM, baudrate, USART_Mode_Rx | USART_Mode_Tx, INT_RANK_5) ;//初始化RS485映射的串口RS485_COM设置为收发模式中断优先级为INT_RANK_5
Uart_RegHookCallback(RS485_COM, Rs485RecFrameCallback) ; //注册RS485接收帧中断回调函数
}
/**************************************************************************************************
* 名 称: void Rs485RecFrameCallback(char *recvBuf, uint16_t recvLen)
* 功能说明: 当RS485串口接收到数据帧时会回调此函数此函数将数据帧插入到“帧环形缓冲区”sRS485Queue中
* 应用层无需关注如何接收只需要在初始化RS485后处理sRS485Queue帧数据即可。
**************************************************************************************************/
void Rs485RecFrameCallback(char *recvBuf, uint16_t recvLen)
{
if( RW_OK != InsertQueueMemData(&sRS485Queue, recvBuf, recvLen) )
{
ErrorLogPrintf("sRS485Queue溢出") ;
}
}
/****************************************************************************
* 名 称void RS485SendData(char* sendData, uint16_t dataLen)
* 功 能通过RS485_COM端口输出dataLen长度的数据 sendData
* 入口参数:
* @param *sendData 输出的数据指针
* @param dataLen 输出数据的长度
* 注 意RS485接口为半双工默认为接收状态所以发送数据之前需要切换到发送状态发送完成后需要立即切换回接收状态
****************************************************************************/
void RS485SendData(char* sendData, uint16_t dataLen)
{
RS485_TX ;
UARTx_SendData(RS485_COM, sendData, dataLen) ;
RS485_RX ;
}