HAL库配置RS485通信

HAL库配置RS485通信_第1张图片

在配置好串口的基础上完成RS485的配置

一、使能RS485的发送和接收模式引脚

  __HAL_RCC_GPIOG_CLK_ENABLE();

  //高电平是发送模式,低电平是接收模式,默认是接收模式
  HAL_GPIO_WritePin(PG4_RS485_DIR1_Port, PG4_RS485_DIR1_Pin, GPIO_PIN_RESET);

  GPIO_InitStruct.Pin = PG4_RS485_DIR1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(PG4_RS485_DIR1_Port, &GPIO_InitStruct);
#define RS485_Receive() HAL_GPIO_WritePin(PG4_RS485_DIR1_Port, PG4_RS485_DIR1_Pin, GPIO_PIN_RESET);
#define RS485_Send() HAL_GPIO_WritePin(PG4_RS485_DIR1_Port, PG4_RS485_DIR1_Pin, GPIO_PIN_SET);

 

二、编写RS485发送函数

/**
 * @description: 控制rs485发送数据
 * @param {uint8_t} *data 要发送的数据
 * @param {size_t} len  要发送数据的长度
 * @return {*}   0 :发送成功;-1:发送失败;
 */
int Rs485_SendData(uint8_t *data, size_t len)
{
     HAL_StatusTypeDef status;
     RS485_Receive();
     status = HAL_UART_Transmit(&huart1, data, len, 0xffff);
     RS485_Send();
     return status == HAL_OK ? 0 : -1;
}

 三、编写RS485接收函数

RS485默认是接收模式,在函数的初始化时会设置为接收函数,然后每次发送完数据也配置为接收

#define RXBUFFERSIZE    1                       /* 缓存大小 */
uint8_t  g_usart_rx_buf[200];  //接收缓冲,最大200个字节
uint16_t g_usart_rx_len;   	   //接收长度
uint8_t g_usart_rx_flag=0;	   //接收完成标志
uint8_t g_rx_buffer[RXBUFFERSIZE];       /* HAL库USART接收Buffer */
 
在串口初始化函数中使能接收中断
/* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
 
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{  
	if(huart->Instance == USART1)     
    {
		g_usart_rx_buf[g_usart_rx_len] = g_rx_buffer[0] ;
        g_usart_rx_len++;
		if(g_rx_buffer[0]==0x0a)
		{
			g_usart_rx_flag=1;
		}
		HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
	}
}

 

 

你可能感兴趣的:(STM32,HAL库,单片机,stm32,嵌入式硬件)