第十九天-输入捕获实验
一、输入捕获概述
1、输入捕获框图
2、输入捕获工作详解
①设置输入捕获滤波器
可以设置滤波,滤除一些高电平脉宽不足的脉冲信号。
②设置捕获极性
③输入捕获映射
④输入捕获分频器
这里的捕获是将计数器的值存入比较寄存器中,分频次的作用是设置几个上升沿/下降沿来临,才执行一次捕获。
⑤发生捕获时产生中断
3、相关引脚
在数据手册中可以查看。
因为我们要使用按键模拟输入的波形,PA0为WAKE_UP按键,所以可以使用TIM5通道1或者TIM2通道1。
二、相关库函数
注意这里GPIO的下拉输入,只是针对该实验,因为按键只会模拟高电平。
一般在输入捕获中,GPIO使用浮空输入。
三、相关实验
1、实验目的
2、相关代码
time.h
#ifndef __TIMER_H
#define __TIMER_H
#include "stm32f10x.h"//标志位 1:是否完成本次捕捉 1:上次是否捕捉到高电平 6:计时器重装载次数
extern u8 flag;
//获取的比较值
extern u16 cValue;void Timer_Int_Init(u16 preScaler,u16 value);void Timer_PWM_Init(u16 preScaler,u16 value);void Timer_Cap_Init(u16 preScaler,u16 value);#endif
time.c
//定义flag
u8 flag = 0;
u16 cValue = 0;void TIM2_IRQHandler()
{//如果计时器发生更新if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){//如果超过最大更新次数,则为捕捉完毕if((flag & 0x3F) == 0x3F){flag |= 0x80;}else{flag++;}//清空中断标志位TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}//如果捕捉到上升沿 / 下降沿if(TIM_GetITStatus(TIM2,TIM_IT_CC1) == SET){//如果上次未捕捉上升沿 此时需要捕捉上升沿if((flag & 0x40) == 0){flag = 0;cValue = 0;TIM_SetCounter(TIM2, 0); // 清零计数器TIM_Cmd(TIM2, ENABLE); // 然后启动flag |= 0x40;TIM_OC1PolarityConfig(TIM2,TIM_OCPolarity_Low);//捕捉下降沿}else //如果上次已捕捉上升沿,此次应该捕捉下降沿{cValue = TIM_GetCapture1(TIM2);TIM_Cmd(TIM2,DISABLE); //停止定时器flag |= 0x80; //最高位设1TIM_OC1PolarityConfig(TIM2,TIM_OCPolarity_High); //捕捉上升沿}//清空中断标志位TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);}
}
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "timer.h"
#include "usart.h"int main()
{extern u8 flag;extern u16 cValue;u16 time = 0; //以ms计数u16 value = 8999;u16 preScaler = 8000;//一个计数周期为1sdelay_init();uart_init(115200);Timer_Cap_Init(preScaler,value);while(1){//需要检测 完成位if((flag & 0x80) == 0x80){time = (flag & 0x3F) * 1000 + cValue / 9;flag = 0;//不会重复检测//通过串口发送时间printf("%d\r\n",time);}}
}
3、实验总结
①:要注意多个中断共用一个中断函数,所以在中断函数中要进行判断。
②:extern修饰的变量,定义一次,多次声明。
③:printf中/r/n表示换行。