历史上的今天
今天是: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.
史海拾趣
|
有用CY7C68013A的吗,如何读出I2CEEPROM中的数据? 如何用cy7c68013a读出I2C总线上EEPROM中的数据,为什么我写进去的正确,多出来的总是不对呢?声明,不用CYPRESS提供的库。… 查看全部问答> |
|
兄弟姐妹们好,我现在要做一个课题是基于FPGA和CCD的图像采集系统设计。但是看了看面阵CCD的datasheet,感觉它的时序都好麻烦,头有点晕。 想看看有没有哪位高人做过这方面的东西啊。可以和我联系一下吗,我的email:mosina@eyou.com qq:94651873。 ...… 查看全部问答> |
|
我这里有佳能PS-ReC SDK v1.1.0c 包括开发包、文档、例子 例子在vc6.0 vc2003 vc2005下都可以执行 有需要的和我联系 qq: 784905761… 查看全部问答> |
|
我是专科毕业,工作两年了,一直从事C++,在mobile上做应用软件,今年27了,考研一直是我的一个必须要完成的任务,因为没有高数的基础,而且工作忙,所以北大北航这类学校不在我考虑的范围内,想考成电的软件学院或兰州大学,不知道各位觉得考兰大 ...… 查看全部问答> |
|
由于项目需要,需要把vivi移植到S3C2410上,vivi默认的波特率是115200,要改成9600,MPLL为200MHZ,分频为1:2:4,然后设置一个宏xxx=(pclk/(9600*16))-1,后面再改head.s文件,在初始化串口部分,(mov指令的立即数限制成一字节)把原来的mov r2 ...… 查看全部问答> |
|
大家好 我们是某美资公司(广州),做软件外包,大量诚聘以下人才: SQA/C/C++/C#/.NET/JAVA/LINUX 最好是2年以上工作经验,为了方便应聘者,外地的可电话面试,面试过凭Offer直接报到。水平差的请勿投简历,谢谢! 一经录用:高薪+福利(社 ...… 查看全部问答> |




