11.STM32F4 输入捕获
一、输入捕获概念
输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来说明输入捕获的原理,如图1所示:
图1:输入捕获脉宽测量原理图
STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等。
本文我将用TIM5_CH1来捕获高电平脉宽,捕获原理如图1所示,我就不多介绍了。
二、输入捕获功能及应用
捕获波形:功能,把模拟信号的边沿捕获,得到波形时间。如图2所示:
图2:输入捕获波形图解
遥控器:一般两种(蓝牙遥控器),(红外遥控器),(有线遥控器)
发送装置如图3所示:
图3
接收装置如图4所示:
图4
输入捕获:可以捕获红外发送过来的波形,通过每个波形的高低电平时间,知道你是什么样的键值
遥控器:每个按键都不一样、每个按键都有不同的键值,键值会通过红外发送,就使用红外接收进行输入捕获。
因为我的硬件设备上没有遥控器,也没有接收。所以在我的硬件设备这里没办法实现。但是可以使用按键,可以捕获按键的按下时间,从而达到捕获的效果。
可以用于捕获按键高低电平持续时间,捕获波形时间。
三、输入捕获模式
在输入捕获模式下,当相应的ICx信号检测到跳变沿后,将使用捕获/比较寄存器(TIMx_CCRx)来锁存计数器的值。发生捕获事件时,会将相应的CCXIF标志(TIMx_SR寄存器)置1,并可发送中断或DMA请求(如果已使能)。如果发生捕获事件时CCxIF标志已处于高位,则会将重复捕获标志CCxOF(TIMx_SR寄存器)置1。可通过软件向CCxIF写入0来给CCxIF清零,或读取存储在TIMx_CCRx寄存器中的已捕获数据。向CCxOF写入0后会将
其清零。具体内容如下图所示:
四、输入捕获函数配置步骤
1、开启TIM5时钟,配置PA0为复用功能(AF2),并开启下拉电阻;
2、初始化TIM5,设置TIM5的ARR和PSC;
3、设置TIM5的输入捕获参数,开启输入捕获;
4、使能捕获和更新中断(设置TIM5的DIER寄存器);
5、设置中断优先级,编写中断服务函数;
6、使能定时器(设置TIM5的CR1寄存器)。
五、TIM_ICInitTypeDef的定义及结构体中参数说明
typedef struct{
uint16_t TIM_Channel;//通道
uint16_t TIM_ICPolarity;//捕获极性
uint16_t TIM_ICSelection;//映射
uint16_t TIM_ICPrescaler;//分频系数
uint16_t TIM_ICFilter; //滤波器长度
} TIM_ICInitTypeDef;
六、代码示例
1、tim5.c
//定时器5通道1输入捕获配置
//arr:自动重装值(TIM2,TIM5是32位的!!)psc:时钟预分频数TIM_ICInitTypeDef TIM5_ICInitStructure;
void TIM5_CH1_Cap_Init(u32 arr,u16 psc){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能PORTA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用位定时器5TIM_TimeBaseStructure.TIM_Prescaler = psc; //定时器分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period = arr; //自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端IC1映射到TI1上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置输入分频,不分频 TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000配置输入滤波器不滤波TIM_ICInit(TIM5, &TIM5_ICInitStructure);//初始化TIM5输入捕获参数TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新和捕获中断TIM_Cmd(TIM5,ENABLE );//使能定时器5NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器、
}/**************************************************************************
//捕获状态//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)
u8 TIM5CH1_CAPTURE_STA=0;//输入捕获状态
u32TIM5CH1_CAPTURE_VAL;//输入捕获值(TIM2/TIM5是32位)
**************************************************************************/
//定时器5中断服务程序
void TIM5_IRQHandler(void){//还未成功捕获if((TIM5CH1_CAPTURE_STA&0X80)==0){//溢出if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){//已经捕获到高电平了if(TIM5CH1_CAPTURE_STA&0X40){//高电平太长了if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F){TIM5CH1_CAPTURE_STA |= 0X80;//标记成功捕获了一次TIM5CH1_CAPTURE_VAL = 0XFFFFFFFF;}else TIM5CH1_CAPTURE_STA++;}}//捕获1发生捕获事件if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET){//捕获到一个下降沿if(TIM5CH1_CAPTURE_STA&0X40){TIM5CH1_CAPTURE_STA |= 0X80;//标记成功捕获到一次高电平脉宽 TIM5CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5);//获取当前的捕获值.TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置上升沿捕获}//还未开始,第一次捕获上升沿else {TIM5CH1_CAPTURE_STA = 0;//清空TIM5CH1_CAPTURE_VAL=0;TIM5CH1_CAPTURE_STA |= 0X40;//标记捕获到了上升沿TIM_Cmd(TIM5,ENABLE );//使能定时器5TIM_SetCounter(TIM5,0);//计数器清空TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//设置下降沿捕获 TIM_Cmd(TIM5,ENABLE );//使能定时器5}}}TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
2、tim5.h
#ifndef _TIM5_H_
#define _TIM5_H_#include "stm32f4xx.h"
#include "stdio.h"void TIM5_CH1_Cap_Init(u32 arr,u16 psc);#endif
3、main.c
extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态
extern u32TIM5CH1_CAPTURE_VAL;//输入捕获值
int main(void){long long temp = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2SysTick_Init(168); //初始化延时函数uart_init(115200);//初始化串口波特率为115200TIM14_PWM_Init(500-1,84-1);//84M/84=1Mhz的计数频率计数到500,频率为1M/500=2Khz TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1);//以84M/84=1Mhz的频率计数while(1){Delay_ms(10);TIM_SetCompare1(TIM14,TIM_GetCapture1(TIM14)+1);if(TIM_GetCapture1(TIM14)==300)TIM_SetCompare1(TIM14,0);//成功捕获到了一次高电平if(TIM5CH1_CAPTURE_STA&0X80){temp = TIM5CH1_CAPTURE_STA&0X3F;temp *= 0XFFFFFFFF;//溢出时间总和temp += TIM5CH1_CAPTURE_VAL; //得到总的高电平时间printf("HIGH:%lld us\r\n",temp);//打印总的高点平时间TIM5CH1_CAPTURE_STA = 0;//开启下一次捕获}}
}
七、下载验证结果
在完成代码编写之后,将编译好的文件下载到我们的硬件开发板上,此时,可以看到DS0的状态由暗到亮的循环。即可说明程序已正常在执行了,然后再打开串口调试助手,选择对应的串口,按下KEY_UP按键,可以看到串口打印的高电平持续时间,如下图所示:
从上图中可看出,其中有2次高电平在50us以内的,这种就是按键按下时发生的抖动。这就是为什么我们按键输入的时候,一般都需要做防抖处理,防止类似的情况干扰正常输入。大家还可以用杜邦线连接PA0和PF9,具体的内容可参考STM32F4开发指南—库函数版本中第十四章PWM输出实验。
八、总结
输入捕获是一种用于测量和捕获外部信号的功能,常用于测量信号的频率、周期、占空比等参数。通过配置定时器和GPIO引脚,并设置输入捕获通道的工作模式和触发条件,来实现信号的捕获和测量。通过中断处理程序读取输入捕获寄存器的值,可以获取外部信号的相关参数。学习了输入捕获需要了解定时器和GPIO引脚的配置,掌握了输入捕获通道的设置和中断处理方法,并参考相关的芯片手册和开发环境文档进行实际应用。
九、其他说明
《STM32F4开发指南—库函数版本》可到我的资源进行下载。
TIM14_PWM_Init 函数代码编写可参考9.PWM简单介绍章程。
注意:本人所写文章内容均用于记录自己在学习嵌入式的成长过程!!!!!
相关文章:
11.STM32F4 输入捕获
一、输入捕获概念 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来说明输入捕获的原理,如图1所示: 图1:输入捕获脉宽测量原理图 STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的…...
opencv#30 线性滤波
均值滤波原理 均值滤波步骤 Step1:求和。 Step2:计算平均值。 所谓均值滤波,就是求平均值的意思。我们假设在一个3*3的范围内有一个图像,其中这个图像每一个像素可能含有噪声,也可能不含噪声,我们是不知道的,因此通…...
如何使用iPhone或iPad上的二维码共享Wi-Fi密码?这里有详细步骤
你有没有想过在不泄露网络密码的情况下与客人共享你的家庭或工作Wi-Fi?你肯定不是第一个这样想的人,我们很高兴地通知你,多亏了以下这个的变通方法,你现在可以使用iPhone或iPad做到这一点。 通常,如果你想让其他人访问网络,你需要共享你的Wi-Fi密码。苹果通过引入与任何…...
在游戏里开公司!基于ERNIE SDK的多智能体游戏应用
在虚拟世界有一座神奇的办公室,当你输入你的创业方向,办公室的智慧打工人们将团结合作,为你的项目勤劳奔走,并在过程中,把日报周报都写好,让你随时掌握项目进度和最终成果!该项目基于ERNIE SDK开…...
【SpringCloud Nacos】 微服务治理介绍及Nacos引入初体验
文章目录 前言服务治理介绍什么是服务治理1、服务发现2、服务配置3、服务健康检测 常见的注册中心ZookeeperEurekaConsulNacos Nacos 简介Nacos 实战入门搭建nacos环境1、安装nacos2、配置nacos3、访问nacos 将商品微服务注册到 nacos1、在 pom. xml 中添加 nacos 的依赖2、在主…...
JavaEE进阶(6)SpringBoot 配置文件(作用、格式、properties配置文件说明、yml配置文件说明、验证码案例)
接上次博客:JavaEE进阶(5)Spring IoC&DI:入门、IoC介绍、IoC详解(两种主要IoC容器实现、IoC和DI对对象的管理、Bean存储、方法注解 Bean)、DI详解:注入方式、总结-CSDN博客 目录 配置文件作用 Sprin…...
面包屑是什么
面包屑是网站导航中的一种可视化路径提示,通常以层次结构显示用户当前页面的位置,帮助用户了解他们在网站上的位置和浏览历史。这个术语来源于童话故事《汉赛尔与格莱特》中的面包屑小径,代表着一种追踪轨迹的方法。 假设你在一个电子商务网站…...
C++ 设计模式之责任链模式
【声明】本题目来源于卡码网(卡码网KamaCoder) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是责任链模式(第21种设计模式) 责任链模式是⼀种行为型设计模式&am…...
HTML5与App封装技术将网站一键打包成App
HTML5:跨平台的利器HTML5作为一种先进的网页标记语言,其最大的优势在于跨平台性。开发者仅需编写一次代码,即可在各种操作系统和设备上运行,无需为每个平台单独开发App。这种“编写一次,运行处处”的模式,大…...
openssl3.2/test/certs - 060 - any.bad.com is excluded by CA2.
文章目录 openssl3.2/test/certs - 060 - any.bad.com is excluded by CA2.概述笔记END openssl3.2/test/certs - 060 - any.bad.com is excluded by CA2. 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\openSSL\test…...
SpringBoot整理-数据库操作
在 Spring Boot 中进行数据库操作是一项常见的任务。Spring Boot 提供了多种方式来集成和操作数据库,使得与数据库的交互更为简便和高效。以下是在 Spring Boot 中进行数据库操作的几种主要方式: 1. Spring Data JPA 介绍: Spring Data JPA 是 Spring Data 的一部分,它简化了…...
IP被封怎么办?访问网站时IP被阻止?解决IP禁令全方法
相信很多人遇到过IP禁令:比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问,又或者你的的账号莫名被封,这些由于网络上的种种限制我们经常会遭遇IP被封的情况,导致无法使用继续进行网络行动。在本文中,我们…...
利用aiohttp异步爬虫实现网站数据高效抓取
前言 大数据时代,网站数据的高效抓取对于众多应用程序和服务来说至关重要。传统的同步爬虫技术在面对大规模数据抓取时往往效率低下,而异步爬虫技术的出现为解决这一问题提供了新的思路。本文将介绍如何利用aiohttp异步爬虫技术实现网站数据抓取&#x…...
navicat连接postgresql、人大金仓等数据库报错
navicat连接postgresql、人大金仓数据库报错问题是一个偶现的问题,需要我们特别关注: 1、客户端连接人大金仓数据库 这里注意:navicat连接postgresql、人大金仓数据库时均选择postgresql类型,因为人大金仓数据库底层和psql数据库…...
AUTOSAR看门狗篇 -看门狗驱动(Wdg)
文章目录 功能介绍通用设计规则外部看门狗驱动内部看门狗驱动支持窗口看门狗的触发概念模块API介绍类型定义Wdg_ConfigType函数定义Wdg_InitWdg_SetModeWdg_SetTriggerConditionWdg_GetVersionInfo时序图看门狗初始化、设置触发条件...
数字图像处理:图像内插
图像内插 内插通常在图像放大、缩小旋转和几何校正等任务中使用。内插是用已知数据来估计未知位置的值的过程下面用—个简单的例子开始这—主题的探讨。假设大小为500500像素的—幅图像要放大1.5倍即放大到750750像素。一种简单的放大方法是,创建—个大小为750750像…...
Cantor表(刷题)(C语言)
个人博客主页:https://blog.csdn.net/2301_79293429?typeblog 专栏:https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的&…...
linux install nvm
官网地址:https://github.com/nvm-sh/nvm 1、wget https://codeload.github.com/nvm-sh/nvm/tar.gz/refs/tags/v0.39.7 tar -zxvf v0.39.7 2、vim ~/.bashrc $HOMEroot export NVM_DIR"$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \…...
HTML 炫酷进度条
下面是代码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>Light Loader - CodePen</title><style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr…...
Windows10上使Git Bash支持rsync命令操作步骤
rsync命令是linux上常用的工具之一,用于远程以及本地系统中拷贝/同步文件和文件夹。 Windows Git Bash默认并不支持rsync,如下图所示: 使Git Bash支持rsync命令操作步骤: 1.从https://repo.msys2.org/msys/x86_64/ 下…...
rust for循环里的所有权 - into_iter / iter / iter_mut
文章目录 1 遍历对象实质为 .into_iter() 生成的迭代器2 避免转移 .iter() / .iter_mut()3 for循环里自变量为什么不用加mut // for循环语法糖 for loop_variable in iterator {code() } // 解糖 {let result match IntoIterator::into_iter(iterator) {mut iter > loop {m…...
GitHub README-Template.md - README.md 模板
GitHub README-Template.md - README.md 模板 1. README-Template.md 预览模式2. README-Template.md 编辑模式References A template to make good README.md. https://gist.github.com/PurpleBooth/109311bb0361f32d87a2 1. README-Template.md 预览模式 2. README-Templat…...
【文本到上下文 #6】Word2Vec、GloVe 和 FastText
一、说明 欢迎来到“文本到上下文”博客的第 6 个系列。到目前为止,我们已经探索了自然语言处理的基础知识、应用和挑战。我们深入研究了标记化、文本清理、停用词、词干提取、词形还原、词性标记和命名实体识别。我们的探索包括文本表示技术,如词袋、TF…...
yolov5 opencv dnn部署自己的模型
yolov5 opencv dnn部署自己的模型 github开源代码地址使用github源码结合自己导出的onnx模型推理自己的视频推理条件c部署c 推理结果 github开源代码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人,也是上面作者推荐的…...
Cortex-M4处理器 电源管理
Cortex-M4处理器的休眠模式可以降低功耗。 模式可以是以下一种或两种: 休眠模式停止处理器时钟深度睡眠模式停止系统时钟,关闭锁相环和闪存。 如果设备实现了两种提供不同级别省电的睡眠模式,那么SCR的SLEEPDEEP位将选择使用哪种睡眠模式。…...
Linux 驱动开发基础知识——编写LED驱动程序(三)
个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…...
YOLOv8 视频识别
YOLOv8 是一种目标检测算法,用于识别视频中的物体。要控制视频识别中的帧,可以通过以下方式来实现: 设置帧率:可以通过设置视频的帧率来控制视频的播放速度,从而影响视频识别的速度。 跳帧处理:可以通过跳…...
elementplus Dialog 对话框设置距离页面顶部的距离
默认为 15vh,当弹窗过于高的时候,这个距离其实是不合适的 <el-dialogv-model"dialogVisible"title"Tips"width"30%":before-close"handleClose"top"6vh"><span>This is a message</s…...
便捷接口调测:API 开发工具大比拼 | 开源专题 No.62
hoppscotch/hoppscotch Stars: 56.1k License: MIT Hoppscotch 是一个开源的 API 开发生态系统,主要功能包括发送请求和获取实时响应。该项目具有以下核心优势: 轻量级:采用简约的 UI 设计。快速:实时发送请求并获得响应。支持多…...
openssl3.2/test/certs - 008 - root-nonca trust variants: +serverAuth +anyEKU
文章目录 openssl3.2/test/certs - 008 - root-nonca trust variants: serverAuth anyEKU概述笔记END openssl3.2/test/certs - 008 - root-nonca trust variants: serverAuth anyEKU 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 // \file my_openssl_win_log_doc…...
宿州公司网站建设/代运营靠谱吗
转自:http://blog.csdn.net/kay_wyong/article/details/6631870 大体的思路:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面…...
音乐应用网站模板/西安网站关键词优化费用
求素数只需要到i*i<x for(int i2; i*i<x i) 1、素数,所以没有1,从2开始。 2、一个数如果不是素数,最大的因子该是小于等于x/2,在大根本没法除。 3、进一步确定到根号x,一个数如果不是素数,意味着一定…...
优化服务内容/网站seo优化步骤
2019独角兽企业重金招聘Python工程师标准>>> gulp gulp是基于Node.js的前端自动化构建工具,主要用于代码打包。目前主流的前端打包工具,grunt,gulp,webpack。grunt现在似乎慢慢被gulp取代,而我使用gulp也是…...
想自己搞一个视频网站怎么做/网络销售平台怎么做
3318 天前symb0l ulimit 和 limits.conf 都不能按照百分比设置限制,或许你可以手动算一下。能限制用户内存使用、线程数量和同时打开的文件数量。①以下是 ulimit 使用帮助# ulimit --helpulimit: ulimit [-SHabcdefiklmnpqrstuvxPT] [限制]修改 shell 资源限制。在…...
石家庄城市建设档案馆网站/成都网站建设公司
有时,使用临时的windows机子,要进行ftp简单操作,但又不想装其它的ftp-client,可以直接使用windows command中的命令ftp来操作。 通常,ftp服务器按标准,使用utf8编码格式发送文件名,而widows自带…...
长春模板网站建设企业/百度应用
一、 Web平台的安全审计评审方法分别从黑盒和白盒两方面考虑。黑盒着重从几种常用的攻击手段入手谈谈如何防御。白盒方面,谈谈从代码级做好防御,这方面的攻击往往不太容易,但也要防范于未然。 1)、黑盒攻击及防御Web入侵分为两个步…...