OpenEdv-开源电子网

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

定时器,使用TIM3定时器,定时5s 重复3次,累计15s 但是仿真每次仅有4.5s 一共12s左右,定时器的误差这么大,还是我参数算错了呢??求解答

[复制链接]

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-7-31 22:29:43 | 显示全部楼层 |阅读模式
定时器,使用TIM3定时器,定时5s 重复3次,累计15s 但是仿真每次仅有4.5s 一共12s左右,定时器的误差这么大,还是我参数算错了呢??求解答
main函数
main ()
{
RCC_Configuration();  //配置系统时钟
NVIC_Configuration(); //系统中断管理
  LED_Init();   //LED端口初始化
Timerx_Init(50000);//10Khz的计数频率,(计数到5000为500ms)已修改后,计数为nms 即500ms

 while (1)
  {
     ;
  }
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!

//static u8  count=0;//定时计数数
 
void Timerx_Init(u16 arr )
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

TIM_TimeBaseStructure.TIM_Period = (arr*10); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(  //使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update  |  //TIM 中断源
TIM_IT_Trigger,   //TIM 触发中断源 
ENABLE  //使能
);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
 
}

void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
count++;
if(count==3)
{ count=0;
LED1=!LED1;
}
}
}
一开始,用每次定时一秒的时候,误差没有这样大的,是不是参数要自己设定调整的呢??要准确定时,还是用sys系统定时器会精确点呢??

人的梦想,是不会终结噶!!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-31 22:36:57 | 显示全部楼层
这个可以从peripheral里面查看到.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
 楼主| 发表于 2012-7-31 23:07:31 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,这个我会看,定时1s的时候Timerx_Init(10000);//10Khz的计数频率,计数为nms 即1000ms误差很小,但是,改为Timerx_Init(5000);//10Khz的计数频率,计数为nms 即5000ms 但是仿真才4.12S,这样算是误差吗?
人的梦想,是不会终结噶!!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-1 01:27:49 | 显示全部楼层
回复【3楼】AB绝对LY:
---------------------------------
5000,不是500ms么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
 楼主| 发表于 2012-8-1 15:26:46 | 显示全部楼层
恩恩,对啊,我为了看着方便,把初始化函数改了,
TIM_TimeBaseStructure.TIM_Period = (arr*10); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
然后5000 应该就成为了定义5000ms了,应该没有问题吧,也没有溢出,最大值65536
人的梦想,是不会终结噶!!!!
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
 楼主| 发表于 2012-8-1 15:53:26 | 显示全部楼层
仿真例程定时器,误差没有这么大,可以准确定时5s 看来是我修改例程出问题了,我还是好好对照,谢谢原子哥
人的梦想,是不会终结噶!!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-1 16:49:25 | 显示全部楼层
回复【6楼】AB绝对LY:
---------------------------------
你改动哪里了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
 楼主| 发表于 2012-8-1 17:08:38 | 显示全部楼层
TIM_TimeBaseStructure.TIM_Period = (arr*10); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 
人的梦想,是不会终结噶!!!!
回复 支持 反对

使用道具 举报

8

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2017-9-13
在线时间
18 小时
发表于 2017-11-9 11:09:37 | 显示全部楼层
为什么要加上死循环呢?并且在死循环里还有延时?这几天一直在纠结这个问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-26 08:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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