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

简介: STM32使用HAL库实现RS485通讯(全双工串口)

一、硬件

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

二、软件设计

1.软件功能

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

2.CubeMX操作

(1)时钟

(2)调试

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

(3)usart2

(4)重映射

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

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

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

(8)配置串口中断

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

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

(10)点击生成工程

3.软件设计

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

while (1)

 {

       //将485芯片设置为发送模式

       HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);

       TxByte = 0x88;

       //发送数据

       HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);

       //将485芯片设置为接收模式

       HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);

       HAL_Delay(1000);

 }

 

(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, 1, 0xFF);

   }

   else

   {

       TxByte = 0x02;

       HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);

       HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);

   }

   HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);   //重新使能串口接收中断

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

}

 

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

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

 

 

齐活,下载验证:

相关文章
|
3月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
465 0
|
3月前
STM32CubeMX 串口收发一帧数据
STM32CubeMX 串口收发一帧数据
44 9
|
3月前
STM32CubeMX RS485接口使用
STM32CubeMX RS485接口使用
242 8
|
3月前
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
54 2
|
4月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
441 4
|
3月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
122 0
|
4月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
164 1
|
3月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
109 0
|
4月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
298 2
|
5月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结