OpenEdv-开源电子网

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

TIM1应用问题。

[复制链接]

10

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2013-8-9
在线时间
0 小时
发表于 2013-9-5 08:22:48 | 显示全部楼层 |阅读模式

这是程序中TIM1的部分,发现TIM1的溢出中断无法进入,捕获中断进入正常。请原子哥指教!


#define FILE_timer1_c


#include "header.h"

static uint16_t count_overflow_up;
static uint32_t count_overflow;
static uint32_t count_capture,ref_capture_count;
static uint16_t val_capture[16],val_capture_first;
static uint8_t  fb[10],dir;

static uint8_t  en_freq_correction,systick_handle_capture;

void timer1_gpio_init(void)
   {
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   }


void start_setup_timer1(void)
   {
    count_overflow=0;
    count_capture=0;
    en_freq_correction=0;
    count_overflow_up=0;
    systick_handle_capture=get_handle_count_systick();

   }


void start_capture_pwm1(void)
   {
    count_overflow=0;
    count_capture=0;
    en_freq_correction=1;
    ref_capture_count=0;
    count_overflow_up=0;
    create_task_led2_continue(500);
    clear_count_systick(systick_handle_capture);
    TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE); 
    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
   }

//????1?????????????????????í?ó??????
void TIM1_UP_IRQHandler(void)
   {
    if(TIM_GetITStatus(TIM1 , TIM_IT_Update) != RESET)
      {
        TIM_ClearITPendingBit(TIM1 , TIM_FLAG_Update); 
        if(en_freq_correction==0)  { goto end_up; }
        count_overflow_up++;
//         create_task_beep_continue(100);
        if(count_overflow_up>=130)
          {
            fb[0]=0xAA;  fb[1]=0x60; 
            //·????í?ó????
            uart3_sendout_data(fb,2);
            create_task_led2_continue(200);
            create_task_beep_continue(200);
            count_overflow_up=0;
            TIM_ITConfig(TIM1, TIM_IT_CC1, DISABLE); 
            TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE);
          }
       }
       end_up:
       ;
   }


//??????????256-32768Hz??????·??ò?ù????????????????·?·¨???????á???????ò??±¨?í
void TIM1_CC_IRQHandler(void)
   {
uint32_t k,n,a,b,c,d;
    uint32_t ticks;
    uint16_t val;
    
    if( TIM_GetITStatus(TIM1 , TIM_IT_CC1) != RESET ) 
 {
        TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
        if(en_freq_correction==0)  { goto end; }
        
        count_capture++;
        if(count_capture==5)
          {
            clear_count_systick(systick_handle_capture);
            val_capture_first=TIM_GetCapture1(TIM1);
            val_capture[0]=val_capture_first;
            count_overflow=0;
          }
        if(count_capture>5) 
          {
            k=count_capture-5;
            k&=0x0f;
            val_capture[k]=TIM_GetCapture1(TIM1);
            n=k-1;
            n&=0x0f;
            if(val_capture[k]<=val_capture[n])  { count_overflow++; }
          }
        
        ticks=get_count_systick(systick_handle_capture);
        if((ticks>500)&&(ref_capture_count==0)) 
          {
            a=256-64;  b=256+128;  c=512;
            k=count_capture-5;
            if((k>=a)&&(k<b))  { ref_capture_count=c; }         //512
            a=a<<1;  b=b<<1;  c=c<<1;
            if((k>=a)&&(k<b))  { ref_capture_count=c; }         //1024
            a=a<<1;  b=b<<1;  c=c<<1;
            if((k>=a)&&(k<b))  { ref_capture_count=c; }         //2048
            a=a<<1;  b=b<<1;  c=c<<1;
            if((k>=a)&&(k<b))  { ref_capture_count=c; }         //4096
            a=a<<1;  b=b<<1;  c=c<<1;
            if((k>=a)&&(k<b))  { ref_capture_count=c; }         //8192
            a=a<<1;  b=b<<1;  c=c<<1;
            if((k>=a)&&(k<b))  { ref_capture_count=c; }         //16384
            a=a<<1;  b=b<<1;  c=c<<1;
            if((k>=a)&&(k<b))  { ref_capture_count=c; }         //32768
          }
        
        if(ticks>1200)        //???í 
          { 
            fb[0]=0xAA;  fb[1]=0x60; 
            //·????í?ó????
            uart3_sendout_data(fb,2);
            create_task_led2_continue(200);
            create_task_beep_continue(200);
            en_freq_correction=0;
            TIM_ITConfig(TIM1, TIM_IT_CC1, DISABLE);
            TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE);            
            goto end;
          }
        
        k=count_capture-5;
        if((k==ref_capture_count)&&(ref_capture_count>0)) 
          {
            k&=0x0f;
            if(val_capture[k]>=val_capture_first)  { val=(val_capture[k]-val_capture_first); }
            else  { val=(65536+val_capture[k]-val_capture_first); count_overflow--; }
            a=(uint32_t)count_overflow;
            a=a<<16;
            b=a+(uint32_t)val;
            if(b>8000000) { c=b-8000000; dir=1; }
            else  { c=8000000-b; dir=0; }
            
            a=c*125;            //?????á??????8M?±?????ù????
            a+=50;              //???á????
            b=a/1000;           //??????????·?
            c=a%1000;
            d=c/100;            //??????????·?

            if(dir==0&&dir_x==0)    //GPS??×???????·?
              {
                b=b+b_x;
                d=d+d_x;
                if(d>10) {b++;d=d-10;}
                dir=0; 
              }
            if(dir==1&&dir_x==1) 
              {
                b=b+b_x;
                d=d+d_x;
                if(d>10) {b++;d=d-10;} 
                dir=1;
              }
            if(dir==1&&dir_x==0) 
              {
                if(b>b_x)
                  {
                    b=b-b_x; dir=1;
                    if(d>=d_x) { d=d-d_x; }
                    else {d=d+10-d_x;b--;}
                  }
                else if(b==b_x)
                  {
                    b=0;
                    if(d>=d_x) { d=d-d_x;dir=1; }
                    else {d=d_x-d;dir=0;}
                  }
                else
                  {
                    b=b_x-b;dir=0;
                    if(d_x<=d) {d=d_x-d;}
                    else {d=d_x+10-d;}
                  }
              }
              if(dir==0&&dir_x==1) 
              {
                if(b>b_x)
                  {
                    b=b-b_x;dir=0;
                    if(d>=d_x) { d=d-d_x; }
                    else {d=d+10-d_x;b--;}
                  }
                else if(b==b_x)
                  {
                    b=0;
                    if(d>=d_x) { d=d-d_x; dir=0;}
                    else {d=d_x-d;dir=1;}
                  }
                else
                  {
                    b=b_x-b;dir=1;
                    if(d_x<=d) {d=d_x-d;}
                    else {d=d_x+10-d;}
                  }
              }
            
            
            fb[0]=0xAA;  fb[1]= 0x61;  fb[2]= dir;  
            fb[3]=(uint8_t)b;  fb[4]=(uint8_t)d;
            uart3_sendout_data(fb,5);
            create_task_led2_continue(200);
            create_task_beep_continue(200);
            en_freq_correction=0;
            TIM_ITConfig(TIM1, TIM_IT_CC1, DISABLE); 
            TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE);
          }
      }
     end:
     ;
   }






void timer1_pwm_cfg(void)
   {
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 3600;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
   }



void timer1_pwm_capture(void)
  {
    TIM_ICInitTypeDef        TIM_ICInitStructure;


    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x0;    //???¨
    TIM_PWMIConfig(TIM1, &TIM_ICInitStructure);
    
    TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);                
    TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);   
  }


/*******************************************************************************
* Function Name : TIM_Configuration
* Description   : TIM_Configuration program.
* Input         : None
* Output         : None
* Return         : None
* Attention : None
*******************************************************************************/
void TIM1_Configuration(void)
  {
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
    TIM_DeInit(TIM1);

    TIM_TimeBaseStructure.TIM_Period=0xffff; /* ×?????×°???????÷????????(??????) */
/* ???? TIM_Period???????ó?ú?ú?????ü???ò?????? */
    TIM_TimeBaseStructure.TIM_Prescaler= 8;        /*9·???*/
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* ???ù·??? */
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* ?ò?????????? */
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    
       
    TIM_ClearFlag(TIM1, TIM_FLAG_Update);    /* ????????????±ê?? */
    TIM_ARRPreloadConfig(TIM1,DISABLE) ;
    TIM_ITConfig(TIM1,TIM_IT_Update,DISABLE);
    TIM_Cmd(TIM1, ENABLE); /* ?????±?? */
    
    timer1_pwm_capture();
//     timer1_pwm_cfg();
  }
  
  
  
void TIM1_NVIC_Configuration(void)
  {
    NVIC_InitTypeDef NVIC_InitStructure; 
 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn | TIM1_UP_IRQn ;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
  }
//


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-5 10:09:43 | 显示全部楼层
回复【楼主位】yaoxiaofeng:
---------------------------------
TIM1有几个中断服务函数,溢出中断是另外一个中断服务函数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2013-8-9
在线时间
0 小时
 楼主| 发表于 2013-9-5 10:18:42 | 显示全部楼层
void TIM1_UP_IRQHandler(void)
void TIM1_CC_IRQHandler(void)
两个中断的函数都用了啊~
回复 支持 反对

使用道具 举报

10

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2013-8-9
在线时间
0 小时
 楼主| 发表于 2013-9-5 10:29:18 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
void TIM1_UP_IRQHandler(void)
void TIM1_CC_IRQHandler(void)
两个中断的函数都用了啊~
回复 支持 反对

使用道具 举报

10

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2013-8-9
在线时间
0 小时
 楼主| 发表于 2013-9-5 10:46:27 | 显示全部楼层
void TIM1_NVIC_Configuration_cc(void)
  {
    NVIC_InitTypeDef NVIC_InitStructure; 
 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn ;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
  }

void TIM1_NVIC_Configuration_up(void)
  {
    NVIC_InitTypeDef NVIC_InitStructure; 
 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn ;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
  }


改成这样OK,谢谢原子哥。


回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 18:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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