10949|12

1366

帖子

6

TA的资源

版主

楼主
 

GD32F350体验之八(另类移植freemodbus成功) [复制链接]

 
本帖最后由 RCSN 于 2018-9-2 22:00 编辑

   今天中午又开始移植这个modbus小协议栈,说实话是很容易移植。网上包括论坛也有STM32的移植玩法,但是对于GD32的倒是没有。   对于什么是modbus协议,我也不多说这个。在公司中,我的项目也大多用自定义协议。对于Modbus,我也是第一次接触。 网上的freemodbus的接收一帧完整的Modbus协议帧思路,包括官方,也是按照以下框图来进行解析,也就是说,我需要开启一个硬件定时器T35us,来时刻检测线路是否空闲,若空闲时间到了指定时间则判定为一帧完整数据,这是接收一帧协议数据的思路。对于发送上,官方是通过一个字节一个字节进行发送,然后开启发送完成中断,一个字节一次中断发送,对于串口低速率、数据容量不大来说,这个发送思路是没问题的。这种收发思路对于通用性来说,是适用不同平台的。

   
  但楼主想利用之前的DMA发送一帧数据、接收利用接收+空闲中断接收一帧数据的帖子思路,整合在freemodbus上,也就是发送上,取消了一个字节发送,变成了DMA发送同时使能发送完成中断,发送完一帧数据就进一次中断,这样能减少多次发送进中断的次数。在接收上,利用空闲中断代替T35us定时器中断,减少一个外设的使用。当然这个是不通用的,别的平台也不一定有这个中断事件。于是,收发上的思路变成了以下的框图:

  
此内容由EEWORLD论坛网友RCSN原创,如需转载或用于商业用途需征得作者同意并注明出处





此帖出自单片机论坛

最新回复

很有参考价值,正好想做类似的一个机制:DMA收发+空闲中断   详情 回复 发表于 2023-8-24 20:13
点赞 关注(2)
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复
举报

1366

帖子

6

TA的资源

版主

沙发
 
    那么接下来就讲解下移植过程。按照上贴的freemodbus的源码,源码上是没有STM32的demo工程的。当然移植也很容易。对于协议栈部分,大多抽象化,你只需要写入一些注册接口,比如串口的初始化接口,发送接口等等跟外设相关的东西即可。
  移植之前大体说下freemodbus的协议栈思路,工程框图如下:
  
     在应用上也很简单,初始化外设接口,开启RTU,然后在while轮询查找事件变化接口即可。
   
     那么接下来看下eMBInit函数接口,里面主要是实现相关外设函数注册到协议栈处理接口上,这些外设函数是需要我们实现的
   
    MBPoll函数接口是实现轮询查找事件状态变化,比如接收到一帧数据事件,执行事件,发送事件等,若有相关事件发生执行相对应的事件处理。
  
   
此帖出自单片机论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复

1366

帖子

6

TA的资源

版主

板凳
 
  freemodbus的协议处理大体说完了。一些功能码的具体实现我们也不用太大关注,只需要去关注收发的实际数据即可。那么,如何将上贴的收发思路整合到freemodbus呢,这里官方也提供了接口文件给我们  包括port.c这个是平台的相关配置文件;比较简单,就设置平台的总中断开关接口,这里就相当于临界区,在一些重要的处理上,设置临界区防止外界因素的干扰。但是官方上,好像很多接口都用到临界区。

  portevent.c是平台的事件处理,主要是外设事件的写入以及获取函数接口,这些事件有四个,利用枚举定义声明。包括初始化完成事件、一帧协议帧接收完成事件、协议帧处理事件、发送完成事件。这些事件都可以通过post和get读写。




此帖出自单片机论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

4
 
    postserial.c是对串口外设的一些注册接口,提供了接口但是内部的逻辑需要根据平台移植。下面是代码截图:
  y以上的三个回调函数,我们需要在串口全局中断判断其中断事件标志位,然后再跳转到相对应的回调中。

   porttimer.c是关于定时器的,用来检测总线是否空闲,这里我们的相关接口内部函数我们使用空闲中断来处理。比如使能定时器接口内部弄为开启空闲中断。
  

此帖出自单片机论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

5
 
mbrtu是对rtu的相关操作接口,比如开启,关闭,接收,发送,收发回调等等都在这里,这里我们改动不大,主要就是发送这里,官方使用的是单字节发送,楼主使用的是DMA发送,所以需要改动的是eMBRTUSend发送接口,这里楼主使用上贴调试好的DMA代码即可。

此帖出自单片机论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

6
 
这里使用modbus poll软件,具体使用可以百度。我们先验证下协议栈是否通了。使用的是04功能码,读取输入寄存器。这时候就会有返回相对应的数据上来。循环1000ms收发,效果如下:

   
   





12.png (90.74 KB, 下载次数: 0)

12.png
此帖出自单片机论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

7
 
  目前已经调通RTC、Usart、freemodbus协议栈。下一步:加入硬件PWM控制舵机、太阳追踪算法。打样板。  最后再利用modbus协议制定相关指令,开发QT工具,使之上下位机能进行配置和数据传输。

此帖出自单片机论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

5260

帖子

239

TA的资源

管理员

8
 
现在进度怎么啦,好久不见更新了
此帖出自单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

最近工作上挺忙的。中秋又捡起来搞了。目前在怼上位机呢  详情 回复 发表于 2018-9-25 08:58
 
 
 

回复

1366

帖子

6

TA的资源

版主

9
 
nmg 发表于 2018-9-23 10:11
现在进度怎么啦,好久不见更新了

最近工作上挺忙的。中秋又捡起来搞了。目前在怼上位机呢
此帖出自单片机论坛
 
 
 

回复

5

帖子

1

TA的资源

一粒金砂(初级)

10
 

楼主的太阳追踪算法怎么实现的,能不能分享下哈

此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

11
 

移植好的源码有吗 部分移植的地方看不懂 根据stm32转不过来 功力不够深厚

此帖出自单片机论坛
 
 
 

回复

5260

帖子

239

TA的资源

管理员

12
 

源码参考作者作品帖:https://bbs.eeworld.com.cn/thread-1054488-1-1.html

此帖出自单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

13
 

很有参考价值,正好想做类似的一个机制:DMA收发+空闲中断

此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表