电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
STM32H743平台移植modbus协议从栈学习笔记
分 享
扫描二维码分享
STM32H743平台移植modbus协议从栈学习笔记
学习笔记
STM32H7
modbus
菜鸟冷虎
关注
发布时间: 2019-08-16
丨
阅读: 3339
## 一.前言 因为公司的通信控制接口都是使用的modbus协议,以前都是用的STM32F429作为主控。最近要对控制板性能进行升级所以选用了STM32H7系列作为主控,本笔记主要是记录modbus协议从栈从STM32F4平台移植到STM32H7平台的相关移植细节。 ## 二.硬件平台介绍 1.主控:STM32H743IIT6 2.USB转串口IC:FT232RL 3.硬件框图:![](https://cf02.ickimg.com/bbsimages/201908/ce48893160574527041c52477cb1fc17.png) ## 三.MODBUS协议简介 Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议, 它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。 自从 1979 年出现工业串行链路的事实标准以来, MODBUS 使成千上万的自动化设备能够通信。 目前,继续增加对简单而雅观的 MODBUS 结构支持。互联网组织能够使 TCP/IP 栈上的保留系统端口 502 访问 MODBUS。 MODBUS 是一个请求/应答协议,并且提供功能码规定的服务 ![](https://cf02.ickimg.com/bbsimages/201908/9bdba10b8cc1c043f2dd5d43587e26fc.png) ## 四.移植细节 #### 1.在官网下载好freemodbus库文件 官网链接:https://www.embedded-solutions.at/leistungen/modbus/ #### 2.建立STM32H7工程,添加mobus库到工程中 下面就是我们这次modbus移植所需要用到的文件 ![](https://cf02.ickimg.com/bbsimages/201908/1f0b1a3f4787e29111c028dc86e0f823.png) 注意细节问题: a.注意包含正确的库文件及头文件地址 b.注意把对应的变量声明进行重定义 #### 3.串口相关代码编写 因为modbus的协议里面已经定义好数据发送的硬件驱动API,我们在这里的工作就是把硬件的驱动部分接口API修改成STM32的串口处理相关函数,这一部分代码在mbportserial.c文件中进行修改。 modbus所有的硬件接口API如下: 通信端口初始化,关闭通信端口,使能发送,禁用发送函数 ![](https://cf02.ickimg.com/bbsimages/201908/4fbba3641c297e88f9033fd35736cf4e.png) 通信端口使能接收,禁用接收,发送数据,接收数据函数 ![](https://cf02.ickimg.com/bbsimages/201908/7c0b1dc55c724f793c524962df776854.png) 下面我们就开始移植硬件接口函数为串口驱动函数 1.端口初始化,这里我们就把端口初始化映射成串口初始化函数 ![](https://cf02.ickimg.com/bbsimages/201908/2eb9afc10ef56235a9f186d6e62cd5e5.png) 2.串口的控制函数,这里的工作是把通信端口的控制映射成我们串口通信控制函数 把端口的发送和接收数据函数映射成串口发送接收数据的操作 ![](https://cf02.ickimg.com/bbsimages/201908/9f40e12bff22db2968addfd796c183c4.png) 把端口的发送使能和禁用映射成串口的发送使能和禁用操作 ![](https://cf02.ickimg.com/bbsimages/201908/603c57c6a9f59641c1510ca1a3d2b3dd.png) 把端口的接收使能和禁用映射成串口的接收使能和禁用操作 ![](https://cf02.ickimg.com/bbsimages/201908/71b28bfda6346eb2648861fe1c209561.png) 3.串口中断,这里清除中断标准位就可以了 ![](https://cf02.ickimg.com/bbsimages/201908/e080e41b2620ccde3e88574ea4c3eafc.png) #### 4.定时器相关代码编写 因为modbus的超时处理是用一个标准的1ms定时来进行定时处理的,当在规定时间内没有接收到数据即认为这一帧数据已经结束,所以我们还需要把时钟基准的API修改成我们的硬件定时器处理相关函数,这部分函数在mbporttimer.c文件中进行修改 下面就是modus的时钟处理函数API接口 ![](https://cf02.ickimg.com/bbsimages/201908/4adbddc8b9c199183c649cb776f96d8b.png) 1.定时器初始化 ![](https://cf02.ickimg.com/bbsimages/201908/7c5c07677166a8ab9a4d78e22608526e.png) 2.定时器中断 ![](https://cf02.ickimg.com/bbsimages/201908/95e6a627cc4d76c1cac1105b4a3c2787.png) #### 5.主函数的修改 因为modbus采用的是轮询的方式,移植好modbus库后,只需要在主函数一直循环modbus的轮询任务即可 ```c void Modbus_Task(void) { eMBErrorCode eStatus; xMBSHandle xMBSHdl; USHORT* pTemp; if( MB_ENOERR != ( eStatus = eMBSSerialInit( &xMBSHdl, MB_RTU, MBS_SLAVE_ADDRESS, MBS_SERIAL_PORT, MBS_SERIAL_BAUDRATE, MBS_PARITY ) ) ) { } else if( MB_ENOERR != ( eStatus = eMBSRegisterInputCB( xMBSHdl, eMyRegInputCB ) ) ) { ( void )eMBSClose( xMBSHdl ); } else if( MB_ENOERR != ( eStatus = eMBSRegisterHoldingCB( xMBSHdl, eMyRegHoldingCB ) ) ) { ( void )eMBSClose( xMBSHdl ); } do { /@@* ---主任务轮询---*/ eMBSPoll( xMBSHdl ); App_BlinkTask(); } while( MB_ENOERR == eStatus); ( void )eMBSClose( xMBSHdl ); } ``` ## 五.通信测试 我们把移植好的工程进行编译,并把程序烧录到MCU中,用modbus的软件进行测试,如果用软件能读取到正确的地址数据表示移植成功 ![](https://cf02.ickimg.com/bbsimages/201908/2d5275b92c0186f8b64eced7c140986d.png) 可以看到读取保持寄存器和读取输入寄存器的数据都是正常的 ## 六.笔记总结 其实通过上面的移植工作,我们发现移植的主要部分就是把数据的发送接口修改成我们的串口驱动,其次就是把对应的时钟基准改成我们的硬件定时器,这两个部分是我们本次笔记的重点部分
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
4
)
菜鸟冷虎
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交