我在上升沿和下降沿都加了个变量,以便仿真看,只是上升沿的变量加1,下降沿的变量不变,一直是0,然后我断开PB6,和PA0 的连接,直接用按键就好使,困惑中
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "io.h"
//ALIENTEK战舰STM32开发板实验10
//输入捕获实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
u8 num = 0 ;
u8 Label_variable_3 ;
u8 g_rise ;
u8 g_fall;
u8 TIM2CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM2CH1_CAPTURE_VAL; //输入捕获值
int main(void)
{
u32 temp=0;
io_init() ;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
LED_Init(); //LED端口初始化
timer_3_init(59999,7199); //6秒
TIM2_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
while(1)
{
if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
{
num++;
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536;//溢出时间总和
temp+=TIM2CH1_CAPTURE_VAL;//得到总的高电平时间
printf("HIGH:%d us\r\n",temp);//打印总的高点平时间
TIM2CH1_CAPTURE_STA=0;//开启下一次捕获
}
}
}
//定时器2中断服务程序
void TIM2_IRQHandler(void)
{
if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}else TIM2CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
g_fall++;
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
g_rise++;
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
/********************************************************************/
/* 定时计数器3中断-产生一定时间间隔的方波信号 */
/* */
/****************************************************************** */
void TIM3_IRQHandler(void)//TIM3中断函数
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update)!= RESET) //检查中断3是否发生
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除中断3的中断标志
Label_variable_3 = 0;
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
delay_ms(250);
TIM_Cmd(TIM2,DISABLE ); //使能定时器2进行输入捕获,捕捉轨道状态
delay_ms(250);
TIM_Cmd(TIM2,ENABLE ); //使能定时器2进行输入捕获,捕捉轨道状态
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
}
}
|