时间:2021-07-01 10:21:17 帮助过:17人阅读
首先访问官网:https://www.embedded-solutions.at/en/freemodbus/在freemodbus DownLoads界面中,可以免费下载freemodbus V1.6,以及freemodbus的源码。
解压freemodbus-v1.6压缩文件,主要包括demo modbus doc tools 四个文件夹,具体如下图所示:
其中tools为上位机测试modbus程序,doc为一些说明文件先不讨论。有用的是demo以及modbus。
1、Demo 文件夹
Demo 文件夹中主要free modbus官方为我们新建好的各种平台的测试例程,其中包括 Win32平台、Linux平台、ARM平台等。我移植S32K144的时候是网上参照STM32的移植过程。Demo 文件夹的内容主要如下图所示:
2、Modbus文件夹
Modbus文件夹下,主要放一些关于Modbus自身协议的源码,其中包括Modbus-Rtu、Modbus-Ascii、Modbus-Tcp等,具体如下图所示,移植的过程中,可根据实际情况的需要对该文件夹进行适当的裁剪。
在demo文件夹中,没有S32K144的工程文件,有一个叫BARE的文件夹,是一些不包括任何处理器的部分源代码,我们就用这个建立工程文件。拷贝BARE文件夹中的port文件和modbus文件夹导入到工程文件夹中。将demo中的main函数等几个函数拷贝到原先的main.c中,注释掉原先的main函数。
1、对时钟的移植
由于modbus RTU模式需要定时器的支持,所以第一步先移植与定时器相关的函数。在porttimer.c中添加BOOL xMBPortTimersInit( USHORT usTim1Timerout50us )的实现,实现50us的基时时钟。添加打开和关闭时钟的函数void vMBPortTimersEnable( )以及voidvMBPortTimersDisable( ),还有超时中断函数void LPIT_ISR(void)。本项目用的是S32K144的32位LPIT计数器。
2、对串口通信的移植
modbus RTU模式是以串口通讯做为载体,需要添加串口的使能BOOL xMBPortSerialInit,收发中断的使能voidvMBPortSerialEnable( BOOLxRxEnable, BOOL xTxEnable ),发送以及接收BOOL xMBPortSerialPutByte( CHAR ucByte ),BOOL xMBPortSerialGetByte( CHAR * pucByte )。
1) xMBPortSerialInit函数
其中PORT_init、LPUART1_init函数如下:
2) vMBPortSerialEnable函数
其中uart_enable_re_int、uart_disable_re_int、uart_enable_tx_int和uart_disable_tx_int函数如下:
注:在关闭发送中断函数中,一开始只有前两句,每次运行关闭发送中断函数,都不能清除CTRL寄存器的TE位。后来对CTRL寄存器赋值,才得以清除了TE位。
3) xMBPortSerialPutByte函数
其中uart_send1函数如下:
4) xMBPortSerialGetByte函数
其中uart_r1函数如下:
按照以上程序配置,亲测可用。
四、freemodbus的发送和接收的整体思路
协议栈以及定时器初始化T35第一次超时—>eMBPoll STATE_RX_IDLE—>收到数据中断—>prvvUARTRxISR—>pxMBFrameCBByteReceived—>xMBRTUReceiveFSM接收数据 —> STATE_RX_RCV—>T35超时—> eMBPollEV_FRAME_RECEIVED(peMBFrameReceiveCur->eMBRTUReceive)提取完整数据帧—> eMBPoll case EV_EXECUTE:xFuncHandlers[i].pxHandler(eMBRegInputCB)对接收的数据进行处理—> peMBFrameSendCur—>eMBRTUSend(&STATE_RX_IDLE)—>STATE_TX_XMIT
串口发送完成中断—> prvvUARTTxReadyISR—> FSMpxMBFrameCBTransmitterEmpty—>xMBRTUTransmitFSM(& STATE_TX_XMIT)—>xMBPortSerialPutByte—>发送数据。
FreeModbus在S32K144上的移植详细过程
标签:input 好的 初始化 send 新建 init frame 部分 timer