FreeModbus版本:1.6
协议栈初始化时会初始化定时器:
eMBInit →
eMBRTUInit →
xMBPortTimersInit( ( USHORT ) usTimerT35_50us )
协议栈使能时会使能定时器:
eMBEnable →
pvMBFrameStartCur →
eMBRTUStart →
vMBPortTimersEnable
定时器使能做的操作是:清除中断标志位,清除计数,使能定时器,重新计数
也就是说每次调用vMBPortTimersEnable
都会清除计数并重新计数
那么这个函数除了使能协议栈时调用了,还用在哪里呢
用在接收状态机里
当接收状态机为空闲态STATE_RX_IDLE,接收到第一个数据时作为帧首,然后接收状态机进入接收态STATE_RX_RCV,并且使能定时器(重新计数)。
当接收状态机为接收态STATE_RX_RCV,接收到的数据放入帧中,然后使能定时器(重新计数)。
也就是每接收到一个数据就要重新计数定时器,以防进入中断。
那看中断里实现了什么
定时器中断:
TIM7_IRQHandler →
prvvTIMERExpiredISR →
pxMBPortCBTimerExpired →
xMBRTUTimerT35Expired →
BOOL
xMBRTUTimerT35Expired( void