这是程序中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);
}
//
|