STM32F407VE里面的定时器中断不能调用时钟产生的延时函数,否者会出错

我这里用的是出现的问题是:在定时器7里面调用时钟产生的延时函数,出现延时出错,时间变短,无论延时多少都是一样的结果,修改定时器优先级也是一样。

附上程序供大家借鉴。

int main(void)
{
 
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
   delay_init(168);     //延时函数初始化 *******************************************这里  
    PID_leftinit();
    PID_rightinit();
    KEY_Init();//PD0\PD1\PD2\PD3的IO初始化,用来判断小车转向
    EXTIX_Init();
uart_init(460800); //串口1初始化波特率为460800
uart3_init(115200);//串口3初始化波特率为115200
    Trlg_Init();
    TIM2_Cap_Init(0xffff,83);
    TIM7_Int_Init(14999,83);   *******************************************这里
    TIM3_PWM_Init(1000,83);//84分频。PWM频率=1/((1/(84000000/(83+1)))*10000)=100hz  10ms输给电机驱动模块
    TIM4_PWM_Init(10000,41);//输给舵机,1us*10000=10ms 0度
//  delay_ms(300);  
//  WWDG_Init(0x7F,0X47,WWDG_Prescaler_8);        //计数器值为7f,窗口寄存器为47,分频数为8         
              
   while(1)
   {
//  WWDG_SetCounter(0x7f); //重设窗口看门狗值  
//  WWDG_ClearFlag();//清除提前唤醒中断标志位 
// kalman_Distance();//卡尔曼——距离
    printf("KF_distance1:%f m\r\n",KF_distance1);//打印总的高点平时间
printf("KF_distance2:%f m\r\n",KF_distance2);//打印总的高点平时间
printf("KF_distance3:%f m\r\n",KF_distance3);//打印总的高点平时间
printf("KF_distance4:%f m\r\n",KF_distance4);//打印总的高点平时间
//            printf("HIGH1:%d us\r\n",temp1);//打印总的高点平时间  
//        produce_flag();//判断产生标志位
//        flag_motion();//根据标志位执行相应的动作
//        currency();//根据puslleft_forecase判断输出的moterleft_goorback,
moter_speed2=1080; 
      PWM();//输出PWM给驱动模块 
delay_ms(6000); 
moter_speed2=4000; 
      PWM();//输出PWM给驱动模块 
delay_ms(6000); 
        
   }


 }


void TIM7_IRQHandler(void)   //TIM2中断
{
        if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)  //检查TIM7更新中断发生与否
{
            TIM_ClearITPendingBit(TIM7, TIM_IT_Update  );   //清除TIM7更新中断标志 
            switch(sign)
            {
            case 0:{Trlg0=1;delay_us(25);Trlg0=0;};break;*******************************************这里
            case 1:{Trlg1=1;delay_us(25);Trlg1=0;};break;*******************************************这里
            case 2:{Trlg2=1;delay_us(25);Trlg2=0;};break;*******************************************这里
            case 3:{Trlg3=1;delay_us(25);Trlg3=0;};break;*******************************************这里
            }
            sign++;
          if(sign==4)sign=0;  
puslleft_whlle+=((exti_puslleft+puslright)/2);//轮胎转一圈2939,估算3000
puslleft=exti_puslleft/0.015;
// printf("puslleft_whlle:%ld \r\n",puslleft_whlle);//打印左边的脉冲数/s  14200
 puslright=exti_puslright/0.015;
 if(Turnleft_drection==1)
 {
puslleft=puslleft;
//            printf("puslleft0:%ld \r\n",puslleft);//打印左边的脉冲数/s  14200
 }
 else if(Turnleft_drection==2)
 {
puslleft=0-puslleft;
//            printf("puslleft1:%ld \r\n",puslleft);//打印左边的脉冲数/s  14200
 }
 
 if(Turnright_drection==1)
 {
puslright=puslright;
//            printf("puslright0:%ld \r\n",puslright);//打印右边的脉冲数/s
 }
 else if(Turnright_drection==2)
 {
puslright=0-puslright;
//            printf("puslright1:%ld \r\n",puslright);//打印右边的脉冲数/s
 }


 time15ms++;
 exti_puslleft=0;
 exti_puslright=0;
KF_pusllef=puslleftkalman();
KF_puslright=puslrightkalman();
if(puslleft_whlle>655360)
{
puslleft_whlle=655360;
}
else if(puslleft_whlle<0)
{
puslleft_whlle=0;
}
}
        
      
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值