OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9794|回复: 4

我的定时器定时感觉老是不对,大家帮我看看设置有没有问题呃。。。

[复制链接]

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
发表于 2011-12-7 14:17:16 | 显示全部楼层 |阅读模式

以下是我的定时器配置: 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]里面,把上一个字节覆盖了。
所以问题还是比较明确的,就是定时器出问题了,但也不是定时器时间短了,我有论将时间设多久,都是一样,只要收到一个字节数据就立马进入定时器中断,然后把接收数据长度给清零。所以可能是定时器配置出问题了,但是我觉得自己的定时器配置的也没有问题呃,所以请大家帮帮忙,看看配置哪里出问题了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-12-7 15:17:37 | 显示全部楼层
应该是TIM_Configuration这个函数一配置,就会产生一次中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

101

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2011-9-6
在线时间
3 小时
发表于 2011-12-7 15:34:27 | 显示全部楼层
我也遇到这样的问题,Jlink仿真发现:时钟开启一开启就产生一次时钟中断,不知道为啥.IWDG也是这样的现象,用原子的例程也是IWDG的时钟已开启中断标志就被置1了.
事无巨细 循序渐进
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-12-7 15:44:27 | 显示全部楼层
还有这样的事情发生呃,你们是怎么解决的呢,到现在这个问题都还没解决,改这里改那里,还是不行。如果不用接收延时的方法来确定USART接收完毕的话,那应该怎么做,以解决串口接收完成的问题呢(接收到的数据没有结束符,每条数据长度不一样,不知道怎么解决呃)。大家指点一下呃,呵呵。。。
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-12-7 15:50:02 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我后来调试的时候也确实发现,单步运行完TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);这一句后,SR寄存器中的UIF就被置位了,也就是配置完定时器UIF就被置位了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表