好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

FreeModbus在S32K144上的移植详细过程

源码获取

  首先访问官网: https://HdhCmsTestembedded-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_ r 1 函数如下:

按照以上程序配置,亲测可用。

四、 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   

查看更多关于FreeModbus在S32K144上的移植详细过程的详细内容...

  阅读:24次