捕获按键下降沿的值(基于STM32F10XRBT6)

前言

获取按键的下降沿数据 会分成两种情况  1 发生了捕获事件  2 没有发生捕获事件  也就是他只是固定时间段的一种电平 (0或者1

一 按键

1 按键的下降沿

下降沿是 1-0 变化 就是他是一段时间的电平变化 
就是完成了某个状态的跳变。
不是固定的时间点的电平。(0或者1)
上升沿也是如此(0-1

二 输入捕获

1 捕获

在这里插入图片描述
根据图上可以分析出来

比如 你要捕获下降沿的数据  
捕获他是一种时间点的固定电平 
下降沿捕获的就是 0 只要捕获到0
就可以称为 发生了捕获。
/**************
****(不是一种变化是一种固定的电平) 
********/

2捕获事件

在这里插入图片描述

这里和捕获就不一样了 
捕获事件 必须 是 下降沿完成之后 
才算是一个捕获事件 完成之后 发生更新 
继续下一个发生捕获事件 
比如 在下降沿 怎么才算是完成一个捕获事件 
下降沿是1-0的变化 1是初始化状态(按键没按下 )
当他按下 触发到了 0 这时是不是完成了一次下降沿  
这时就可以成为下降沿捕获事件
我们捕获的数据是它从1-0的时间。 

捕获和捕获事件的最核心的区别

捕获讲究的是 一个固定的电平 
捕获事件讲究的是 一种状态的跳变。

3 代码实现

1)输入捕获 函数
函数构成

1 io 对应的 TIMX 通道 并且初始化 
2 按键输出 
3  定时器配置
4 输入捕获 
{
1 思路反转 :串联的概念 
2 结构体配置 
}

io.c
在这里插入图片描述
为什么我要你看按键对应的定时器通道呢 (很重要 )

捕获按键的下降沿  我们的主导是按键  也就是 需要计算按键定时的时间
 需要配置定时器 有了定时器的值 我们也要配置 输入捕获 这样才是完整的  
		GPIO_InitTypeDef  SPI_GPIOA6_INIT;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	SPI_GPIOA6_INIT.GPIO_Pin =GPIO_Pin_6;   
	SPI_GPIOA6_INIT.GPIO_Mode=GPIO_Mode_IPU;																	  
	SPI_GPIOA6_INIT.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&SPI_GPIOA6_INIT);
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);  

看到这里有迷糊了 为什么按键是配置输出呢 (核心)
{1 } 串联就是短接

因为你需要捕获按键的值  输入捕获需要两个io  才能有数据出来
比如短接PA6和PA0 那么 配置按键的输入捕获 不就想当于 PA6也拥有了同样的配置吗 然后按键配置输出 不就是想当于下降沿的输出的数据吗  
这样完成了输出比较和输入捕获的配置   

2)中断函数

void TIM2_IRQHandler(void)
{
	if((TIM2CH1_CAPTURE_STA&0X80)==0) //如果没有发生捕获事件 
	{
		if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)  //就继续更新中断 
		{
			if(TIM2CH1_CAPTURE_STA&0X40) 
			{
				TIM2CH1_CAPTURE_STA|=0X80; 
				TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
				TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); 
			}
			else   //没有发生捕获 
			{										
			     
				TIM2CH1_CAPTURE_STA=0; 
				TIM2CH1_CAPTURE_VAL=0;
				TIM_SetCounter(TIM2,0);
				TIM2CH1_CAPTURE_STA|=0X40;
				TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); 
			}
		}
	
	}
	  
	 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //
}

在这里插入图片描述

1000 0000   0100 0000
bit7=0x80  bit6=0X40  

结合框图 看

	    if(TIM2CH1_CAPTURE_STA&0X40) 
			{
				TIM2CH1_CAPTURE_STA|=0X80; 
				TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
				TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); ///马上设为为 上升沿  那么 下一次就是 继续是下降沿触发。 
			}
下降沿捕获 不需要考虑捕获事件 因为只要你下降了  就可以认定为捕获事件 
捕获事件判断完成之后  需要把定时器的值存入变量  并且 把马上设为为 上升沿 
那么 下一次就是 继续是下降沿触发。 

没有发生捕获事件

		else  
			{										
			   
				TIM2CH1_CAPTURE_STA=0; 
				TIM2CH1_CAPTURE_VAL=0;
				TIM_SetCounter(TIM2,0);
				TIM2CH1_CAPTURE_STA|=0X40; 
				TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); 
			}
只要清除数据  标记一种状态就行了 
最后的极性也要和上面相反。

3)主函数
在这里插入图片描述
还是结合图上看

bit0-5  == 0011 1111  =0X3f; (次数)
次数就是长度
    if(TIM2CH1_CAPTURE_STA&0x80) //如果发生捕获事件 
		  {
		   	temp=TIM2CH1_CAPTURE_STA&0x3F;//计算定时器溢出次数 
		    temp*=65535;//下降沿的长度 (长度可以理解为 时间)
  		    temp+= TIM2CH1_CAPTURE_VAL;//加上定时器的值 
		    sprintf(string,"PWM_Capture %#d",temp);
		    LCD_DisplayStringLine(Line6,(u8 *)string);
		 
		     TIM2CH1_CAPTURE_STA=0;//完成一次 清除状态 
		  }
还是注意捕获和捕获事件区别 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值