历史上的今天
返回首页

历史上的今天

今天是:2024年11月28日(星期四)

正在发生

2020年11月28日 | 在STM32上移植FreeModbus RTU的一点经验总结

2020-11-28 来源:eefocus

这几天因为工作需要,移植了modbus RTU到STM32来,之前也听说过modbus,但是没有深入了解过,还以为会像usb 那样复杂的,经过这几天的折腾,发现真的太简单了。为了防止过段时间又忘记了怎么移植,在这里把移植过程记录下来,也为了方便初次接触modbus的人。


废话少说,首先去下载源码,我下载的是 freemodbus-v1.5.0 ,解压后如图所示:

 

在demo文件夹中有很多移植好的例子,但是没有STM32的,不要紧,我们参考已有的例子来操作就可以了。在demo文件夹下新建一个文件夹,命名为STM32,将BARE文件夹里的文件全部复制过来。


然后,我们建立一个STM32的工程,我用的是mdk4.72,关于怎么建立工程我就不啰嗦了,在工程里添加modbus 和 port两个文件夹,并在文件夹里添加需要的文件,这些modbus的是在modbus文件夹下面,port的是在刚才新建的那个stm32文件夹下,port.c是我从别的地方弄过来的,里面就是一个开中断和一个关中断的函数,可以不要,我的工程如图:

   

乍一看,也有十几个文件,其实这些文件内容不多,很好理解,而且需要修改的只有port文件夹下的portserial.c 和 porttimer.c 。这两个文件里面有几个空函数,我们看名字就知道这些函数的作用了。


portserial.c 如下:


 

               #include "port.h"

              


                 

              

 

               /* ----------------------- Modbus includes ----------------------------------*/

              

 

               #include "mb.h"

              

 

               #include "mbport.h"

              


                 

              

 

               /* ----------------------- static functions ---------------------------------*/

              

 

               static

               void

               prvvUARTTxReadyISR( 

               void

               );

              

 

               static

               void

               prvvUARTRxISR( 

               void

               );

              


                 

              

 

               /* ----------------------- Start implementation -----------------------------*/

              

 

               void

              

 

               vMBPortSerialEnable(

               BOOL

               xRxEnable,

               BOOL

               xTxEnable )

              

 

               {

              

 

                   

               /* If xRXEnable enable serial receive interrupts. If xTxENable enable

              

 

                    

               * transmitter empty interrupts.

              

 

                    

               */

              

 

               }

              


                 

              

 

               BOOL

              

 

               xMBPortSerialInit(

               UCHAR

               ucPORT,

               ULONG

               ulBaudRate,

               UCHAR

               ucDataBits, eMBParity eParity )

              

 

               {

              

 

                   

               return

               FALSE;

              

 

               }

              


                 

              

 

               BOOL

              

 

               xMBPortSerialPutByte(

               CHAR

               ucByte )

              

 

               {

              

 

                   

               /* Put a byte in the UARTs transmit buffer. This function is called

              

 

                    

               * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been

              

 

                    

               * called. */

              

 

                   

               return

               TRUE;

              

 

               }

              


                 

              

 

               BOOL

              

 

               xMBPortSerialGetByte(

               CHAR

               * pucByte )

              

 

               {

              

 

                   

               /* Return the byte in the UARTs receive buffer. This function is called

              

 

                    

               * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.

              

 

                    

               */

              

 

                   

               return

               TRUE;

              

 

               }

              


                 

              

 

               /* Create an interrupt handler for the transmit buffer empty interrupt

              

 

                

               * (or an equivalent) for your target processor. This function should then

              

 

                

               * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that

              

 

                

               * a new character can be sent. The protocol stack will then call 

              

 

                

               * xMBPortSerialPutByte( ) to send the character.

              

 

                

推荐阅读

史海拾趣

Fortiming Corporation公司的发展小趣事

背景:随着公司规模的扩大和产品线的丰富,Fortiming开始寻求更广阔的市场空间。

发展:公司积极参加国内外电子展会,展示其最新技术和产品,吸引了众多客户的关注。同时,Fortiming还与国际知名电子企业建立了合作关系,共同开发新产品,开拓新市场。这些合作不仅提升了Fortiming的品牌影响力,还为公司带来了更多的商业机会。

Free2Move公司的发展小趣事

背景:随着公司规模的扩大和产品线的丰富,Fortiming开始寻求更广阔的市场空间。

发展:公司积极参加国内外电子展会,展示其最新技术和产品,吸引了众多客户的关注。同时,Fortiming还与国际知名电子企业建立了合作关系,共同开发新产品,开拓新市场。这些合作不仅提升了Fortiming的品牌影响力,还为公司带来了更多的商业机会。

Carlisle Interconnect Technologies公司的发展小趣事

进入21世纪,Carlisle Interconnect Technologies开始了全球化的布局。公司不仅在北美和欧洲设立了多个生产基地和研发中心,还积极开拓亚洲和拉丁美洲等新兴市场。通过全球化的战略布局,公司不仅能够更好地利用全球资源,还能够更深入地了解各地市场需求,进一步推动业务发展。同时,公司还加强了与国际知名企业的合作,共同推动电子行业的发展和进步。

这五个故事只是Carlisle Interconnect Technologies发展历程中的一部分,但它们足以展示公司在电子行业中的创新、进取和不断追求卓越的精神。这些故事也为我们揭示了一个成功企业的发展轨迹:从创业初期的创新与突破,到不断的技术升级和产品多样化,再到全球化的布局与业务拓展,每一步都充满了挑战与机遇。

Advanced Analog公司的发展小趣事

创新是Advanced Analog公司发展的核心动力。公司始终坚持自主研发和技术创新,不断推出新的产品和技术。这些新产品不仅满足了市场的多样化需求,也进一步巩固了公司在电源管理IC领域的领先地位。同时,Advanced Analog还积极关注行业发展趋势和未来技术走向,为公司的长远发展做好战略布局。

Avic公司的发展小趣事

随着全球化的推进,Avic公司不断加强与国际航空工业界的合作。公司与多家国际知名航空企业建立了战略合作关系,共同开展航空电子技术的研发和生产。这些合作不仅促进了中国航空工业与国际先进水平的接轨,也为中国航空工业的国际化发展提供了有力支持。

Cobham Semiconductor Solutions公司的发展小趣事

品质是Cobham Semiconductor Solutions的生命线。公司始终坚持严格的质量管理体系,从原材料采购到生产流程,再到产品出厂,每一个环节都经过严格把控。公司还引入了先进的生产设备和技术,确保产品质量的稳定性和可靠性。这种对品质的执着追求,使得Cobham的产品在市场上赢得了良好的声誉和口碑。

问答坊 | AI 解惑

74系列集成电路

74系列集成电路选用说明,帮你选择IC…

查看全部问答>

有用CY7C68013A的吗,如何读出I2CEEPROM中的数据?

如何用cy7c68013a读出I2C总线上EEPROM中的数据,为什么我写进去的正确,多出来的总是不对呢?声明,不用CYPRESS提供的库。…

查看全部问答>

基于FPGA和CCD的图像采集系统设计

兄弟姐妹们好,我现在要做一个课题是基于FPGA和CCD的图像采集系统设计。但是看了看面阵CCD的datasheet,感觉它的时序都好麻烦,头有点晕。 想看看有没有哪位高人做过这方面的东西啊。可以和我联系一下吗,我的email:mosina@eyou.com qq:94651873。 ...…

查看全部问答>

我这里有佳能PS-ReC SDK v1.1.0c开发包

我这里有佳能PS-ReC SDK v1.1.0c 包括开发包、文档、例子 例子在vc6.0 vc2003 vc2005下都可以执行 有需要的和我联系 qq: 784905761…

查看全部问答>

请行内过来人指点一下

我是专科毕业,工作两年了,一直从事C++,在mobile上做应用软件,今年27了,考研一直是我的一个必须要完成的任务,因为没有高数的基础,而且工作忙,所以北大北航这类学校不在我考虑的范围内,想考成电的软件学院或兰州大学,不知道各位觉得考兰大 ...…

查看全部问答>

关于vivi在s3c2410上的移植

由于项目需要,需要把vivi移植到S3C2410上,vivi默认的波特率是115200,要改成9600,MPLL为200MHZ,分频为1:2:4,然后设置一个宏xxx=(pclk/(9600*16))-1,后面再改head.s文件,在初始化串口部分,(mov指令的立即数限制成一字节)把原来的mov r2 ...…

查看全部问答>

美资公司高薪诚聘(6K-10K)

大家好 我们是某美资公司(广州),做软件外包,大量诚聘以下人才: SQA/C/C++/C#/.NET/JAVA/LINUX 最好是2年以上工作经验,为了方便应聘者,外地的可电话面试,面试过凭Offer直接报到。水平差的请勿投简历,谢谢! 一经录用:高薪+福利(社 ...…

查看全部问答>

分享几个multisim9的仿真电路

里面有555的,D触发器的,还有计数器和与非门的…

查看全部问答>

求助!!!AVRstdio硬件调试问题

刚学AVR,做最简单的硬件流水灯仿真,可是单步到死循环就无法单步了,jtag跟死机一样,是怎么回事啊…

查看全部问答>