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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章