高级定时器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);
        }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。