ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

输入输出捕获实验理解

2021-04-16 08:01:11  阅读:193  来源: 互联网

标签:CAPTURE STA TIM5 捕获 输入输出 TIM 实验 TIM5CH1


 程序实现:

 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有