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

2019-10-15 18:02发布

本帖最后由 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 ",Angle_Balance,Accel_Y);
        }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
zhaoyuaiweide
1楼-- · 2019-10-16 20:33
东北小辉辉 发表于 2017-1-4 18:16
好久之前遇到过这个问题,记得是与TIMx_RCR这个寄存器有关,不进行配置的话,TIMER1的更新速率是通用定时器 ...

恩恩   完全正确   太感谢了   哈哈
zhaoyuaiweide
2楼-- · 2019-10-17 00:48
 精彩回答 2  元偷偷看……
zhaoyuaiweide
3楼-- · 2019-10-17 04:54
我上传的那个图就是查手册看到的   
东北小辉辉
4楼-- · 2019-10-17 06:54
zhaoyuaiweide 发表于 2017-1-5 10:05
可以了  完全正确  我设为了0   感谢感谢     奇怪的是寄存器版本的就不用设置这些

void Timer1_Init( ...

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

库函数的话,可能在程序里给这个寄存器赋了一个非0的初始值,可能是8,楼主可以硬件仿真一下,用keil观察这个地址里面的值,看看具体是多少。
zhaoyuaiweide
5楼-- · 2019-10-17 07:48
东北小辉辉 发表于 2017-1-5 14:59
这个问题是可以进行验证的,我猜是因为,手册上这个寄存器的默认值应该是0,所以用寄存器的时候,就不需 ...

恩恩  有道理 我看看
zhaoyuaiweide
6楼-- · 2019-10-17 09:01
这个是库函数里面的定义:/*******************  Bit definition for TIM_RCR register  ********************/ #define  TIM_RCR_REP                         ((uint8_t)0xFF)               /*!< Repetition Counter Value */  

一周热门 更多>