请问一下这个中断函数测周期和脉宽的时候不太对啊
void TIM5_IRQHandler(void)
{
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
{
if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
count1=TIM5CH1_CAPTURE_VAL; //存放高电平时间
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}
else //还未开始,第一次捕获上升沿
{
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
count2=TIM5CH1_CAPTURE_VAL; //存放周期
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0);
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
主函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "lcd.h"
extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态
extern u16 TIM5CH1_CAPTURE_VAL; //输入捕获值
extern u32 count1;
extern u32 count2;
u32 temp1;
u32 temp2;
u32 fre;
u16 cyc;
u16 dian;
extern u16 xianshi;
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
LED_Init(); //LED端口初始化
LCD_Init();
KEY_Init();
LCD_Clear(BLACK);
// TIM3_PWM_Init(899,0); //不分频。PWM频率=72000/(899+1)=80Khz
TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
while(1)
{
delay_ms(10);
// TIM_SetCompare2(TIM3,TIM_GetCapture2(TIM3)+1);
// if(TIM_GetCapture2(TIM3)==300)TIM_SetCompare2(TIM3,0);
if(TIM5CH1_CAPTURE_STA&0X40)//成功捕获到了一次上升沿
{
temp1=count1&0X3F;
temp1*=65536;//溢出时间总和
temp1+=count1;//得到总的高电平时间
temp2=count2&0X3F;
temp2*=65536;//溢出时间总和
temp2+=count2;//得到总的时间
// printf("HIGH:%d us\r\n",temp);//打印总的高点平时间
fre=1000000/temp2;
cyc=(1000*temp1)/temp2;
dian=cyc%10;
cyc=cyc/10;
}
  OINT_COLOR=WHITE;
LCD_ShowString(50,0,200,16,16,"Square wave Checking",BLACK);
LCD_ShowString(0,32,200,16,16,"The cycle is:",BLACK);
LCD_ShowString(0,48,200,16,16,"The period is:",BLACK);
LCD_ShowString(0,64,200,16,16,"The fre is:",BLACK);
LCD_ShowString(0,80,200,16,16,"The Pul wid is:",BLACK);
LCD_ShowxNum(150,80,temp1,9,16,0,BLACK);
LCD_ShowString(224,80,200,16,16,"us",BLACK);
LCD_ShowxNum(150,48,temp2,9,16,0,BLACK);
LCD_ShowString(224,48,200,16,16,"us",BLACK);
LCD_ShowxNum(150,32,cyc,8,16,0,BLACK);
LCD_ShowString(232,32,200,16,16,"%",BLACK);
LCD_ShowxNum(224,32,dian,1,16,0,BLACK);
LCD_ShowString(216,32,200,16,16,".",BLACK);
LCD_ShowxNum(150,64,fre,9,16,0,BLACK);
LCD_ShowString(224,64,200,16,16,"hz",BLACK);
TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
}
}
|