码迷,mamicode.com
首页 > 数据库 > 详细

FreeModbus在S32K144上的移植详细过程

时间:2021-05-24 13:35:38      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:input   好的   初始化   send   新建   init   frame   部分   timer   

一、freemodbus源码获取

 首先访问官网: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

1Demo 文件夹

Demo 文件夹中主要free modbus官方为我们新建好的各种平台的测试例程,其中包括 Win32平台、Linux平台、ARM平台等。我移植S32K144的时候是网上参照STM32的移植过程。Demo 文件夹的内容主要如下图所示:

技术图片

2、Modbus文件夹

Modbus文件夹下,主要放一些关于Modbus自身协议的源码,其中包括Modbus-RtuModbus-AsciiModbus-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)。本项目用的是S32K14432LPIT计数器。

技术图片

 技术图片 

 技术图片

 2、对串口通信的移植

  modbus RTU模式以串口通讯做为载体,需要添加串口的使能BOOL xMBPortSerialInit,收发中断的使能voidvMBPortSerialEnable( BOOLxRxEnable, BOOL xTxEnable ),发送以及接收BOOL xMBPortSerialPutByte( CHAR ucByte )BOOL xMBPortSerialGetByte( CHAR * pucByte )

1 xMBPortSerialInit函数

技术图片

其中PORT_initLPUART1_init函数如下:

技术图片

技术图片

2 vMBPortSerialEnable函数

 技术图片

其中uart_enable_re_intuart_disable_re_intuart_enable_tx_intuart_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_RECEIVEDpeMBFrameReceiveCur->eMBRTUReceive)提取完整数据帧—> eMBPoll case EV_EXECUTE:xFuncHandlers[i].pxHandlereMBRegInputCB)对接收的数据进行处理—> peMBFrameSendCur—>eMBRTUSend&STATE_RX_IDLE—>STATE_TX_XMIT

   串口发送完成中断—> prvvUARTTxReadyISR—> FSMpxMBFrameCBTransmitterEmpty—>xMBRTUTransmitFSM& STATE_TX_XMIT—>xMBPortSerialPutByte—>发送数据。

 

 

 

 

 

FreeModbus在S32K144上的移植详细过程

标签:input   好的   初始化   send   新建   init   frame   部分   timer   

原文地址:https://www.cnblogs.com/huanhuaxinyue/p/14775937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!