OpenEdv-开源电子网

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

求助通用定时器TIM2延时不准确

[复制链接]

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-8-8
在线时间
18 小时
发表于 2012-9-14 19:42:13 | 显示全部楼层 |阅读模式

求助大伙帮忙看看通用定时器TIM2 延时不准怎么回事 LED 2秒多闪一次    公式计算72M / 时钟预分频 + 1

#include "stm32f10x.h "

unsigned char Count1;

/*
 * GPIO端口配置寄存器子函数
 */
void GPIO_InitStructReadtempCmd(void)
{
 GPIO_InitTypeDef GPIO_InitStruct;
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;   //配置线路为推挽式输出
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;   //配置线路速率
 GPIO_Init(GPIOD, &GPIO_InitStruct);      //初始化
}

/*
 * RCC外设时钟配置寄存器子函数
 */
void RCC_APB2PeriphReadtempyCmd(void)
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);  //打开GPIOD外设时钟
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);  //打开TIM2定时器外设时钟
}

/*
 * 配置中断向量控制器NVIC子函数
 */
void NVIC_InitStructReadtempCmd(void)
{
 NVIC_InitTypeDef NVIC_InitStruct;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);     //配置中断分组
 NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;     //选择中断通道
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;   //配置抢占优先级为0
 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;     //配置从占优先级为0
 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;     //打开使能
 NVIC_Init(&NVIC_InitStruct);         //初始化
}

/*
 * TIMX定时器配置寄存器子函数
 */
void TIMX_InitStructReadtempCmd(void)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
 TIM_DeInit(TIM2);        //重设缺省值
 TIM_TimeBaseInitStruct.TIM_Period = 2000;  //自动重载寄存器
 TIM_TimeBaseInitStruct.TIM_Prescaler = (35999); //时钟预分频
 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;   //时间分割值
 TIM_TimeBaseInitStruct.TIM_CounterMode = 0x0000;           //配置向上计数
 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); //初始化定时器
 TIM_ClearFlag(TIM2, TIM_FLAG_Update);    //清除溢出中断标志
 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);   //打开中断溢出中断
 TIM_Cmd(TIM2, ENABLE);         //使能TIM2定时器
}

/*
 * 函数主体
 */        
int main(void)
{
 SystemInit();      //初始化系统时钟进入72M主频
 RCC_APB2PeriphReadtempyCmd();
 GPIO_InitStructReadtempCmd();
 NVIC_InitStructReadtempCmd();
 TIMX_InitStructReadtempCmd();

 while(1)
 {
  
 }
}

/*
 * TIM2定时器中断服务程序
 */
void TIM2_IRQHandler(void)
{
 Count1++;
 if(Count1 == 2)
 {
  Count1 = 0;
 }
 switch  (Count1)
 {
  case  0:
    // GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_11);
     GPIO_SetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10);
     break;

  case  1:
     GPIO_ResetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10);
    // GPIO_SetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_11);
     break;

  default :   break;
 }
 TIM_ClearFlag(TIM2, TIM_FLAG_Update);     //清除溢出中断标志
}


 

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

使用道具 举报

15

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2012-8-7
在线时间
7 小时
发表于 2012-9-14 21:01:15 | 显示全部楼层
你定时是一秒钟。。。这个你知道吧???

亮一秒钟,灭一秒钟,那就是两秒钟,另加一点点计时误差不就差不多了。。。。。。。。。。
【好好学习天天向上】
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-8-8
在线时间
18 小时
 楼主| 发表于 2012-9-14 21:14:06 | 显示全部楼层
回复【2楼】yougen1314:
---------------------------------
不是啊,LED是亮2秒,灭2秒,我是对照电脑上面时间看得,郁闷不知道为啥
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-8-8
在线时间
18 小时
 楼主| 发表于 2012-9-14 21:16:15 | 显示全部楼层
回复【2楼】yougen1314:
---------------------------------
我是计算1秒延时,但是实验板上面是2多秒闪一次的啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-15 00:17:51 | 显示全部楼层
又是用库,仿真看看寄存器状态吧!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 20:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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