STM32F103,用系统滴答定时器,1ms的中断中期,USART接收数据过程中有超时检查,读两次时间,会出现第二次读出的时间比第一次小。比如第一次读是16S,905ms。第二次读就是16S,0ms。有个规律,凡是出现时光倒流的时候,第二次读取的毫秒值必定为0。代码如下:
void SysTick_Handler(void)
{
Sys_Msecond++;
if(Sys_Msecond>=1000)
{
Sys_Second++;
Sys_Msecond = 0;
if(Sys_Msecond > YEAR30)//秒数太大不可信,归零
{
Sys_Second = 0;
}
}
}
读取时间的代码:
unsigned int Get_Sys_Secd(void)
{
return Sys_Second;
}
unsigned int Get_Sys_Msecd(void)
{
return Sys_Msecond;
}
void Get_Sys_Time(Sys_Time *time)
{
time->Second = Get_Sys_Secd();
time->Msecond = Get_Sys_Msecd();
return ;
}
////////////////////////////////////等待数据的时候反复读取当前时间,这个肯定是会被滴答定时器中断打断
while(cur_rcv == USART2_Rcv_Done)
{
Get_Sys_Time(&time_now);
if( TURE == Is_TimeOut(&time_pre,&time_now,USART_RCV_TIMEOUT ) )
{
return TIMEOUT;
}
}
后面我就猜测是读数据的顺序问题,抱着试一试的心态,搞了一把,解决了,但是不知其所以然,高手看下。
修改了读时间的顺序,先读毫秒
void Get_Sys_Time(Sys_Time *time)
{
time->Msecond = Get_Sys_Msecd();
time->Second = Get_Sys_Secd();//注意顺序,先读毫秒,不然会出现时光倒流。
return ;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
读事件函数分两次
读完第一次秒,被打断,然后刚好跳秒
然后读第二次ms,组合起来就错了
要保证读的完整性,读事件的时候要关中断
一周热门 更多>