输入输出捕获实验理解
作者:互联网
程序实现:
1 Timer.h 2 #ifndef __TIMER_H 3 #define __TIMER_H 4 #include "sys.h" 5 6 void TIM5_Cap_Init(u16 arr,u16 psc); 7 #endif 8 9 10 11 Timer.c 12 13 void TIM5_Cap_Init(u16 arr,u16 psc) 14 { 15 //使能TIM5时钟 16 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 17 GPIO_ResetBits(GPIOA,GPIO_Pin_0); //初始化PA0 配置成下拉输入 18 TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);//初始化TIM5定时器 19 TIM_ICInit(TIM5, &TIM5_ICInitStructure);//初始化TIM5输入捕获 20 TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断 21 TIM_Cmd(TIM5,ENABLE ); //使能定时 22 } 23 u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态 24 u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 25 void TIM5_IRQHandler(void) 26 { 27 if((TIM5CH1_CAPTURE_STA&0x80)==0) //未捕获到 28 { 29 if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)//触发更新中断,持续高电平检测 30 { 31 if(TIM5CH1_CAPTURE_STA&0x40)//高电平 32 { 33 if((TIM5CH1_CAPTURE_STA&0x3F)==0x3F)//如果定时器溢出次数达到65535 34 { 35 TIM5CH1_CAPTURE_STA|=0x80;//强制捕获完成 36 TIM5CH1_CAPTURE_VAL=0xFFFF;//填满定时器溢出次数位 37 }else TIM5CH1_CAPTURE_STA++; 38 } 39 } 40 if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//上升沿 41 { 42 if(TIM5CH1_CAPTURE_STA&0x40)//捕获到上升沿 43 { 44 TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽 45 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);//通道捕获值 46 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获 通道极性设置独立函数: 47 } 48 else //还未开始,第一次捕获上升沿 49 { 50 TIM5CH1_CAPTURE_STA=0; //清空 51 TIM5CH1_CAPTURE_VAL=0; 52 TIM_SetCounter(TIM5,0);//获取高电平持续时间 53 TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿 54 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 55 } 56 } 57 58 }TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位 59 } 60 61 Main.c 62 #include "delay.h" 63 #include "key.h" 64 #include "sys.h" 65 #include "usart.h" 66 #include "timer.h" 67 68 69 extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态 70 extern u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 71 int main(void) 72 { 73 u32 temp=0; 74 delay_init(); //延时函数初始化 75 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 76 uart_init(115200); //串口初始化为115200 77 78 TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 //记1个数为1us 定时器的溢出时间为:65536us 79 while(1) 80 { 81 delay_ms(10); 82 if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 83 { 84 temp=TIM5CH1_CAPTURE_STA&0X3F;//得到定时器溢出次数 85 temp*=65536;//溢出时间总和,定时器溢出次数乘以定时器的自动装载值 86 temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间,加上定时器未溢出的1次捕获值 87 printf("HIGH:%d us\r\n",temp);//打印总的高点平时间 88 TIM5CH1_CAPTURE_STA=0;//开启下一次捕获 89 } 90 } 91 } 92
标签:CAPTURE,STA,TIM5,捕获,输入输出,TIM,实验,TIM5CH1 来源: https://www.cnblogs.com/huangkh/p/14665351.html