天天看點

移植FreeModbus+ModbusMaster(主機)+STM32至RT-Thread(1、2階段)簡述FreeModbus移植驗證

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。  聯系信箱:[email protected]】

簡述

     由于之前做過STM32+FreeModbus+uC/OSII(示例代碼,點選下載下傳)  的移植,是以這兩天的努力整體移植工作還算比較順利,已經成功提前完成之前制定的1、2階段任務,源碼位于FreeModbus+RT-Thead+STM32(示例代碼,點選下載下傳)。現将部分移植過程做以說明。

     移植采用的是FreeModbus1.5源碼,RT-Thread使用的最新的1.1.1穩定版,STM32選用序列槽1作為從機序列槽,并增加了RS485發送/接收使能引腳,考慮的Timer2到時候留住Modbus主機使用,是以這裡從機選用了Timer3。

     移植RT-Thread至STM32網上的例程很多,同時RTT提供相應BSP,這裡就不在重複說明。

FreeModbus移植

     FreeModbus的移植過程中主要需修改以下幾個檔案

1、/FreeModbus/port/portserial.c   裡面涉及多了很多序列槽配置,我這次把暫時隻實作了序列槽1,序列槽模式支援奇偶校驗,序列槽的發送及接收都采用中斷模式,發送使用發送緩沖區空中斷,而非采用序列槽發送完成中斷,還需要在該檔案增加序列槽中斷服務程式。

2、/FreeModbus/port/porttimer.c   裡面主要是設定了一個50us的定時器,采用定時器3溢出中斷,并在檔案中增加定時器中斷服務程式

3、/FreeModbus/port/port.h     裡面增加自己需要的相關頭檔案,定義RS485發送/接收使能引腳

4、/FreeModbus/port/port.c     裡面增加開啟、關閉全局中斷,可是使用STM32庫函數自帶的,也可以使用RT-Thread中自帶的,我這裡使用的是STM32自帶的開關全局中斷

     移植好最基本的FreeModbus架構之後就得開始編寫相應的Modbus功能實作方法,我在移植STM32+FreeModbus+uC/OSII時候這個工作已經做過了,是以這次就直接拷貝過來用,檔案位于/APP/src/UserModbusSlaver.c

驗證

    至此FreeModbus的移植工作就算告于段落了,為了驗證移植的成功性,我這裡想通過ModbusPoll上位機軟體檢視作業系統的CPU使用率來驗證,CPU使用率的整數位及小數位分别儲存在Modbus保持寄存器的位址1、2裡,下面來描述下具體過程

1、增加兩個線程一個起名:SysMonitor(系統監控),另一個起名:ModbusSlaverPoll(Modbus從機輪訓)

2、在系統監控線程中增加擷取RTT的CPU使用率、閃爍訓示燈和喂狗功能

3、在Modbus輪訓線程中增加FreeModbus初始化(波特率115200、偶校驗、RTU、序列槽1、從機ID1),及FreeModbus輪訓方法

4、接下來就是見證奇迹的時刻,打開ModbusPoll軟體,設定好序列槽資訊及輪訓的功能即可

看看就源碼就更好了解了,兩個過程非常簡單,有問題歡迎大家提問。

//***************************系統監控線程***************************
//函數定義: void thread_entry_SysMonitor(void* parameter)
//入口參數:無
//出口參數:無
//備    注:Editor:Armink   2013-08-02    Company: BXXJS
//******************************************************************
void thread_entry_SysMonitor(void* parameter)
{
	while (1)
	{
		cpu_usage_get(&CpuUsageMajor, &CpuUsageMinor);
		usRegHoldingBuf[HD_CPU_USAGE_MAJOR] = CpuUsageMajor;
		usRegHoldingBuf[HD_CPU_USAGE_MINOR] = CpuUsageMinor;
		LED_LED1_ON;
		LED_LED2_ON;
		rt_thread_delay(DELAY_SYS_RUN_LED);
		LED_LED1_OFF;
		LED_LED2_OFF;
		rt_thread_delay(DELAY_SYS_RUN_LED);
		IWDG_Feed(); //喂狗
	}
}

//*************************** Modbus從機線程***************************
//函數定義: void thread_entry_ModbusSlaverPoll(void* parameter)
//入口參數:無
//出口參數:無
//備    注:Editor:Armink   2013-08-02    Company: BXXJS
//******************************************************************
void thread_entry_ModbusSlaverPoll(void* parameter)
{
	eMBInit(MB_RTU, 0x01, 1, 115200,  MB_PAR_EVEN);
	eMBEnable();
	while (1)
	{
		eMBPoll();
		rt_thread_delay(DELAY_MB_SLAVER_POLL);
	}
}
           

 為了友善大家關于項目的進展,目前項目源碼已在Github上開源,https://github.com/armink/FreeModbus_Slaver-Master-RTT-STM32

大家可以關注檢視下載下傳,也可以pull request。

繼續閱讀