一、硬件

如下图所示,485芯片链接到单片机的USART2上,但是默认的USART2并不是在PD5和PD6上,这里是需要重映射的。另外PG4作为485收发的控制(在485协议中,RE、DE同时为高电平那么芯片使能发送,如果同时为低电平那么芯片使能接收)

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

二、软件设计

1.软件功能

默认485芯片是接收功能,每隔1s发送一个0x88,如果接收到0x55那么返回0x01,如果接收到的数据不是0x55就返回0x00。

2.CubeMX操作

(1)时钟

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

(2)调试

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

注意:这里一定要选择上,否则会导致Jlink无法下载,Cube这里默认是不使能的,那么调试引脚就会被配置成普通IO。

(3)usart2

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

(4)重映射

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

(5)配置485芯片使能引脚-PG4

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

(6)配置时钟,这个要根据具体的芯片与晶振来配置

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

(7)配置串口,这里默认就行

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

(8)配置串口中断

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

(9)配置485收发使能引脚PG4

默认是接收功能,所以是低电平

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

(10)点击(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP生成工程

3.软件设计

(1)根据功能,系统要每一秒发送一个0x88出去,那么就在main的while(1)循环中填写如下代码:

  while ()
{
//将485芯片设置为发送模式
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);
TxByte = 0x88;
//发送数据
HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, , 0xFF);
//将485芯片设置为接收模式
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_Delay();
}

(2)如果接收到0x55那么返回0x01,如果接收到的数据不是0x55就返回0x00。

这里用到中断,写一个中断回调函数如下:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (0x55 == RxByte)
{
TxByte = 0x01;
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);
HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, , 0xFF);
}
else
{
TxByte = 0x02;
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);
HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, , 0xFF);
}
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);
  //重新使能串口接收中断
HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, );
}

(3)默认是要使能485接收的,那么串口接收中断默认应该也是开启的,所以在main函数的while(1)之前添加上下面的代码:

HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, );

齐活,下载验证:

(7)STM32使用HAL库实现RS485通讯(全双工串口)-LMLPHP

05-11 16:25