canOpen学习十一之canOpen应用出现问题-通过SDO修改了从机心跳时间后等好长时间从机才会按照修改的时间发送心跳

产生上述问题的主要原因是当我们修改心跳时间后系统会调用OnHeartbeatProducerUpdate这个函数去更新NextTime的值,下面看看定时器中的处理:
这是一个1ms的定时器

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
	{
		TimeCNT++;
		
		if (TimeCNT >= TIMER_MAX_COUNT)
		{
			TimeCNT=0;
		}
		if (TimeCNT == NextTime)
		{
			last_time_set = TimeCNT;
			TimeDispatch();     //定时时间到,执行时间相关的分发任务
		}
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}

当我们修改了NextTime的值后会造成TimeCNT的值大于NextTime的值,所以TimeCNT就会一直自加,直到大于TIMER_MAX_COUNT清零后才会自动发送心跳包。
解决方法就是在OnHeartbeatProducerUpdate这个函数中处理一下,加上这么一句:

	if(NextTime>10)
		TimeCNT=NextTime-10;
	else
		TimeCNT=0;

猜你喜欢

转载自blog.csdn.net/qq_15181569/article/details/106209419