OpenEdv-开源电子网

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

高级定时器1 定时时间不对 求助!

[复制链接]

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
发表于 2017-1-4 17:58:31 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 zhaoyuaiweide 于 2017-1-5 10:35 编辑

定时器1和4相同的配置   相同的装载值和与预分频值   为什么这两个中断里面的LED闪烁频率不同   差距还挺大   求助求助@正点原子

定时器1配置和中断:
void TIM1_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //①时钟 TIM1 使能
        //定时器 TIM1 初始化
        TIM_DeInit(TIM1);
        TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //②初始化 TIM1
        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //③允许更新中断
        //中断优先级 NVIC 设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1 中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 1 级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级 3 级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
        NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
        TIM_Cmd(TIM1, ENABLE); //⑤使能 TIM1
}



void TIM1_UP_IRQHandler(void) //TIM1 中断
{
        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查 TIM1 更新中断发生与否
        {
                TIM_ClearFlag(TIM1, TIM_IT_Update ); //清除 TIM1 更新中断标志
                LED1=!LED1;                        
        }
}




定时器4中断和配置

void TIM4_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
        
        //定时器TIM4初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断

        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_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寄存器


        TIM_Cmd(TIM4, ENABLE);  //使能TIMx                                         
}
//定时器4中断服务程序
void TIM4_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //检查TIM4更新中断发生与否
                {
                TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx更新中断标志
                LED1=!LED1;
                }
}



主函数:
int main(void)
{

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        LED_Init();
        TIM1_Int_Init(499,7200);      //定时器1中断5ms   10Khz(72000000/7200) 的计数频率,计数到 5000 为 500ms(50对应5ms)
        //TIM4_Int_Init(499,7199);  
        while(1)
        {
                printf("%f    %f\r\n",Angle_Balance,Accel_Y);
        }
}




捕获.PNG

最佳答案

查看完整内容[请看2#楼]

好久之前遇到过这个问题,记得是与TIMx_RCR这个寄存器有关,不进行配置的话,TIMER1的更新速率是通用定时器的八分之一左右,具体配置成几,忘了,楼主先试一下,初始化TIMER1的时候给这个定时器赋值,看看是否影响TIMER1的更新速率,给0,1,2,3........随便给,试一下是否有影响。 对了,还有就是TIMER1是挂在到APB2上的,看看是不是这个原因。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-4 17:58:32 | 显示全部楼层
本帖最后由 东北小辉辉 于 2017-1-4 18:26 编辑

好久之前遇到过这个问题,记得是与TIMx_RCR这个寄存器有关,不进行配置的话,TIMER1的更新速率是通用定时器的八分之一左右,具体配置成几,忘了,楼主先试一下,初始化TIMER1的时候给这个定时器赋值,看看是否影响TIMER1的更新速率,给0,1,2,3........随便给,试一下是否有影响。
对了,还有就是TIMER1是挂在到APB2上的,看看是不是这个原因。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

35

主题

309

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2641
金钱
2641
注册时间
2016-8-10
在线时间
470 小时
发表于 2017-1-4 18:02:05 | 显示全部楼层
TIM1_Int_Init(4999,7199);   
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2017-1-4 19:05:51 | 显示全部楼层
帮顶!!!
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-4 22:43:44 | 显示全部楼层

多谢多谢
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-4 22:45:35 | 显示全部楼层
huyang201306 发表于 2017-1-4 18:02
TIM1_Int_Init(4999,7199);

抱歉  写错了   调试的时候都是499   后来调试别的尝试贴代码时候王改回来了
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-4 22:47:06 | 显示全部楼层
东北小辉辉 发表于 2017-1-4 18:16
好久之前遇到过这个问题,记得是与TIMx_RCR这个寄存器有关,不进行配置的话,TIMER1的更新速率是通用定时器 ...

好的  我明早试一下   多谢回复
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-5 10:04:02 | 显示全部楼层
东北小辉辉 发表于 2017-1-4 18:16
好久之前遇到过这个问题,记得是与TIMx_RCR这个寄存器有关,不进行配置的话,TIMER1的更新速率是通用定时器 ...

恩恩   完全正确   太感谢了   哈哈
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-5 10:05:56 | 显示全部楼层
东北小辉辉 发表于 2017-1-4 18:16
好久之前遇到过这个问题,记得是与TIMx_RCR这个寄存器有关,不进行配置的话,TIMER1的更新速率是通用定时器 ...

可以了  完全正确  我设为了0   感谢感谢     奇怪的是寄存器版本的就不用设置这些

void Timer1_Init(u16 arr,u16 psc)  
{  
        RCC->APB2ENR|=1<<11;//TIM1时钟使能   
        TIM1->ARR=arr;      //设定计数器自动重装值   
        TIM1->PSC=psc;      //预分频器7200,得到10Khz的计数时钟
        TIM1->DIER|=1<<0;   //允许更新中断                               
        TIM1->DIER|=1<<6;   //允许触发中断          
        TIM1->CR1|=0x01;    //使能定时器
        MY_NVIC_Init(1,3,TIM1_UP_IRQn,2);
}  


好奇怪哦
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-5 10:36:27 | 显示全部楼层
我上传的那个图就是查手册看到的   
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-5 14:59:03 | 显示全部楼层
zhaoyuaiweide 发表于 2017-1-5 10:05
可以了  完全正确  我设为了0   感谢感谢     奇怪的是寄存器版本的就不用设置这些

void Timer1_Init( ...

这个问题是可以进行验证的,我猜是因为,手册上这个寄存器的默认值应该是0,所以用寄存器的时候,就不需要进行配置。

库函数的话,可能在程序里给这个寄存器赋了一个非0的初始值,可能是8,楼主可以硬件仿真一下,用keil观察这个地址里面的值,看看具体是多少。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-5 15:17:43 | 显示全部楼层
东北小辉辉 发表于 2017-1-5 14:59
这个问题是可以进行验证的,我猜是因为,手册上这个寄存器的默认值应该是0,所以用寄存器的时候,就不需 ...

恩恩  有道理 我看看
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-6 10:03:54 | 显示全部楼层
这个是库函数里面的定义:/*******************  Bit definition for TIM_RCR register  ********************/ #define  TIM_RCR_REP                         ((uint8_t)0xFF)               /*!< Repetition Counter Value */  
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-6 10:07:39 | 显示全部楼层
东北小辉辉 发表于 2017-1-5 14:59
这个问题是可以进行验证的,我猜是因为,手册上这个寄存器的默认值应该是0,所以用寄存器的时候,就不需 ...

这个是寄存器里面的定义    也是0XFF                           
/*******************  Bit definition for TIM_RCR register  ********************/
#define  TIM_RCR_REP                         ((uint8_t)0xFF)              

醉了   我还没有仿真      
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-6 11:25:55 | 显示全部楼层
东北小辉辉 发表于 2017-1-5 14:59
这个问题是可以进行验证的,我猜是因为,手册上这个寄存器的默认值应该是0,所以用寄存器的时候,就不需 ...

在库函数和寄存器版本的程序中都定义了      #define  TIM_RCR_REP            ((uint8_t)0xFF)
仿真的时候寄存器的值是0    库函数的值是3              
他们宏定义的不都是0xff吗   为什么我没有对这两个寄存器操作的时候会从0xff变为其他
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-6 11:34:21 | 显示全部楼层
zhaoyuaiweide 发表于 2017-1-6 11:25
在库函数和寄存器版本的程序中都定义了      #define  TIM_RCR_REP            ((uint8_t)0xFF)
仿真的 ...

大学毕业以后基本就没用过stm32了,手头没有IDE、工程文件和手册,也不是很清楚。

现在在上班,一会我抽时间看一下,怀疑这个宏定义多半是个地址什么的,你仿真一下看看这个宏用到哪了,这个问题应该不难解决。

看看其他网友如何回答。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-6 11:38:18 | 显示全部楼层
zhaoyuaiweide 发表于 2017-1-6 11:25
在库函数和寄存器版本的程序中都定义了      #define  TIM_RCR_REP            ((uint8_t)0xFF)
仿真的 ...

我手头没有IDE,用UE看了一下,这个宏是定义在stm32f10x.h里面的,看注释确实是一个值,不是地址,你find in files一下,看看这个宏用在哪里了,可能根本就没有用到,用仿真一步一步跟一下。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2017-1-10 11:13:35 | 显示全部楼层
东北小辉辉 发表于 2017-1-6 11:38
我手头没有IDE,用UE看了一下,这个宏是定义在stm32f10x.h里面的,看注释确实是一个值,不是地址,你find ...

恩恩  今天刚上论坛   找了一下   那个只是一个定义   没有用它就   
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 11:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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