前言
获取按键的下降沿数据 会分成两种情况 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;//完成一次 清除状态
}
还是注意捕获和捕获事件区别