canOpen学习十一之canOpen应用出现问题-通过SDO修改了从机心跳时间后等好长时间从机才会按照修改的时间发送心跳
原创
©著作权归作者所有:来自51CTO博客作者小灰灰搞电子的原创作品,请联系作者获取转载授权,否则将追究法律责任
产生上述问题的主要原因是当我们修改心跳时间后系统会调用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;