以下是我的定时器配置: APB1时钟为8MHz,TIM_Times在串口接收中断里面被赋值
void TIM_Configuration(u16 TIM_Times)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/*定时((7999+1)/8M)*TIM_Times=TIM_Times毫秒*/
TIM_TimeBaseInitStructure.TIM_Period = TIM_Times; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = 7999; //预分频值
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //时钟分割
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方式
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许定时器2的定时中断源
}
void TIM2Delay_ms(u16 nTimes)
{
TIM_Configuration(nTimes);
TIM_Cmd(TIM2,ENABLE); //允许定时器2
}
在接收中断里面调用这个函数:TIM2Delay_ms(1000);//定时1秒
在定时器中断里面:
void TIM2_IRQHandler(void)
{
u16 Data_Temp = RxData_Temp[0]<<8 | RxData_Temp[1];
if(TIM_GetITStatus(TIM2,TIM_FLAG_Update) == SET)
{
TIM_Cmd(TIM2,DISABLE); //关闭定时器2
if(Data_Temp == 0x4343)
FactorySetMode_Flag = SET;
RxDataTemp_Len = RxData_Len; //转存接收数据长度
RxData_Len = 0; //接收数据长度归零,为下一次接收数据作准备,若不归零,则下一次收到的数据会接着上一次数据的末尾存放,会出现数据混乱
Data_Receive_Over = SET; //数据接收完毕
TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update); //清定时器2中断标志
}
}
我用定时器2是为了在串口接收延时以确认串口的数据接收完毕,由于串口接收的数据没有结束符,也没有固定长度,所以接收数据的时候没办法确认什么时候接收完毕,所以我就用了定时器2,每进入一次接收中断,我就在定时器2中装一个值然后允许开始计数,当数据接收完成后,它全延时一会,时间到后进行定时器中断,在定时器中断里面,我设置一个标志位以说明我的串口数据接收完毕,主程序可以处理它了,而且在定时器中断里面,我还把接收到的数数据长度转存,然后把接收数据长度归零。
把接收长度归零是为了下一次接收数据准备的,若不归零的话,下一次接收数据的时候数据会接着上一次数据末尾存放,这样一来数据就会混乱。
我现在的问题是:串口每次都只能收到最后一个字节,前面所有的数据都丢了,Rx接收缓冲数组中的Rx[0]中始终存放着最后接收到的一个字节,前面所有的数据都丢了;
我在调试的时候,我在定时器中断里面设了一个断点,每次收到数据后立即进入了定时器中断。正是这个原因,每次收到一个字节数据立即进入定时器中断,然后就把接收数据长度归零,故每次都只能收到最后一个字节的数据,是因为每次收到的数据都被存在了接收缓冲数组的开始位置即Rx[0]里面,把上一个字节覆盖了。
所以问题还是比较明确的,就是定时器出问题了,但也不是定时器时间短了,我有论将时间设多久,都是一样,只要收到一个字节数据就立马进入定时器中断,然后把接收数据长度给清零。所以可能是定时器配置出问题了,但是我觉得自己的定时器配置的也没有问题呃,所以请大家帮帮忙,看看配置哪里出问题了。
|