当前位置: 首页 > news >正文

第十九天-输入捕获实验

一、输入捕获概述

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表示换行。

http://www.lryc.cn/news/615668.html

相关文章:

  • AI编程工具 | Trae介绍
  • Linux高级编程-文件操作
  • SpringBoot 集成 MapStruct
  • Vue 3.6 Vapor模式完全指南:告别虚拟DOM,性能飞跃式提升
  • 使用GTX ip core + SDI IP core实现SDI设计
  • Vue3 路由
  • C++算法练习:单词识别
  • 决策树技术详解:从理论到Python实战
  • 【ref、toRef、toRefs、reactive】
  • 多级缓存详解
  • 《励曼旋耕》Liman Rotary Tillage
  • Python如何合并两个Excel文件
  • 花生4CL基因家族鉴定及对干旱与盐胁迫响应分析--文献精读157
  • 本地进行语音文字互转
  • CVPR中深度学习新范式:通用性、鲁棒性与多模态的创新突破
  • 分布式事务Seata TCC模式篇
  • Linux网络转发系统框架分析
  • 【密码学】7. 数字签名
  • orcad的操作(1)
  • 【LLM】Openai之gpt-oss模型和GPT5模型
  • 【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)
  • DAY35打卡
  • 【js】判断异步函数的返回值要加await
  • 【机器学习深度学习】模型选型:如何根据现有设备选择合适的训练模型
  • Redis面试题及详细答案100道(01-15) --- 基础认知篇
  • 力扣 30 天 JavaScript 挑战 第二题笔记
  • 服务器硬件电路设计之I2C问答(二):I2C总线的传输速率与上拉电阻有什么关系?
  • 常用信号深度解析(SIGINT、SIGPIPE、SIGALRM、SIGTERM等)
  • Java安全-组件安全
  • 谷歌搜索 sg_ss 逆向分析