(7)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);
齐活,下载验证:
分类:
STM32
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现