天天看點

FreeModbus從站設計(7)-如何讓RTU的定時器正常工作起來

STM32F103、FreeModbus從站設計(7)-如何讓RTU的定時器正常工作起來

關鍵詞:Modbus FreeModbus STM32F103C8T6 CubeMX 移植

1.基本原理

在CubeMX工程配置中,已經将定時器2(TIM2)的時鐘周期(可以了解為心跳一下)設為50us,Counter Period(産生中斷)暫時設為了35,也就是說50us×35=1750us産生一次中斷,這個時間就是判斷RTU中幀間隔的标準。但在Freemodbus協定棧(遵循Modbus國标)中,這個時間不是固定的,在波特率小于19200bps時,需要具體計算這個時間,當波特率大于或等于19200bps時,這個時間固定為1750us,如圖1所示。是以,孔丙火(微信公衆号:孔丙火)認為,把它設為固定值是不友善的,當波特率修改的時候,還要單獨修改此參數,可以用一個變量來設定此參數,變量的值随波特率而改變,這也有利于後期通信參數修改的程式。

FreeModbus從站設計(7)-如何讓RTU的定時器正常工作起來

圖1

2.代碼修改

在mbrtu.c中,有一個eMBRTUInit()函數,在協定棧初始化的時候被調用,在圖2中可以看出,t3.5的計算方法。計算完了以後,調用xMBPortTimersInit()這個函數,這個函數在porttimer.c中,如果參數是寫死的,CubeMX本身已經生成了定時器的初始化函數,這個函數是不用寫的,直接傳回True就行了。孔丙火(微信公衆号:孔丙火)這裡需要根據這個計算結果修改通信參數,是以要用一下這個函數。

FreeModbus從站設計(7)-如何讓RTU的定時器正常工作起來

圖2

在modbus_app.c中定義一個全局變量uint16_t usUsrTimeOutCount;//modbus定時器計數周期(50us的個數),在xMBPortTimersInit()中,将usTimerT35_50us的值賦給usUsrTimeOutCount,然後在函數MX_TIM2_Init()中用這個值對TIM2進行初始化。xMBPortTimersInit()的代碼如圖3所示。MX_TIM2_Init()修改後的代碼如圖4所示。孔丙火(微信公衆号:孔丙火)提醒,這樣修改之後,在main.c中MX_TIM2_Init()這個函數的調用必須在eMBInit( MB_RTU, ucUsrSlaveAddress, 1, ulUsrBaudRate, eUsrParity );之後。在main.c中的初始化階段的調用關系如圖5所示。

FreeModbus從站設計(7)-如何讓RTU的定時器正常工作起來

圖3

FreeModbus從站設計(7)-如何讓RTU的定時器正常工作起來

圖4

FreeModbus從站設計(7)-如何讓RTU的定時器正常工作起來

圖5

文章在公衆号(孔丙火)同步推出,歡迎檢視更多系列文章。

單片機、ARM、現場總線、PLC、嵌入式軟硬體的設計經驗分享,秉承“點點滴滴皆智慧”的理念,以實際項目為單元闡述知識點,一起分享,共同交流。

FreeModbus從站設計(7)-如何讓RTU的定時器正常工作起來