输入输出捕获实验理解

输入输出捕获实验理解

 程序实现:

 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  

 

上一篇:二叉树的重要遍历问题


下一篇:LR分析程序