STM32 学习12 输入捕获与触摸按键

STM32 学习12 输入捕获与触摸按键

  • 一、输入捕获介绍
    • 1. 概念
    • 2. STM32F1 资源
    • 3. 捕获原理
  • 二、输入捕获配置步骤
    • 1. 使能时钟、设置端口模式
    • 2. 初始化定时器
    • 3. 设置捕获参数
    • 4. 开启捕获和定时器中断(溢出中断|更新中断)
    • 6. 编写定时器中断服务函数
    • 7. 使能定时器
  • 三、代码实现
    • 1. catch_utils.h
    • 2. catch_utils.c
    • 3. main.c
  • 四、触摸按键捕获

一、输入捕获介绍

1. 概念

输入捕获(Input Capture)是一种用于测量外部信号脉冲宽度或者频率的技术,常用于测量传感器输出、编码器信号、脉冲调制信号等。输入捕获通常通过定时器模块来实现输入捕获功能。

2. STM32F1 资源

STM32F1除了基本定时器TIM6和TIM7,其它定时器都具有输入捕获功能。

3. 捕获原理

捕获原理是指通过定时器模块捕获外部信号的特定事件,例如脉冲的上升沿或下降沿,以便测量脉冲宽度或频率。 输入捕获时,相应的ICx检测到跳变沿,TIMx_CCRx寄存器记录TIMx_CNT计数值;下次跳变时,对TIMx_CNT值进行比较。

图示如下:
在这里插入图片描述
注意CNT计数的次数是 N ∗ A R R + C C R ∗ x 2 N*ARR+CCR*x2 NARR+CCRx2,因为在检测周期里计数可能多次溢出,需要记录溢出次数N。
由计数效数*CNT计数周期,即捕获到信号持续时间。

二、输入捕获配置步骤

1. 使能时钟、设置端口模式

定时器需要的头文件在 stm32f10_tim.h 文件中。
下面示例使用 PA0/TIM5_CH1 引脚。
在这里插入图片描述

RCC_APB1PerihpClockCmd(RCC_APB1Periph_TIM5,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
// GPIO 设置为输入拉低
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;

2. 初始化定时器

配置定时器的时钟源、预分频器、计数模式等。

void TIM_TimeBaseInit(TIM_TypeDef *TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

3. 设置捕获参数

开启捕获。

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStrcut);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
TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising);

4. 开启捕获和定时器中断(溢出中断|更新中断)

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
// 捕获通道1
TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1,ENABLE);NVIC_Init()

6. 编写定时器中断服务函数

TIM5_IRQHandler

7. 使能定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

三、代码实现

1. catch_utils.h

#ifndef __CATCH_UTILS_H__
#define __CATCH_UTILS_H__
#include "stm32f10x.h"
#include "stdio.h"// 定时器溢出的次数
static u8 TIM5_Overflow = 0;
// 捕获到上升沿
static u8 TIM5_Capture = 0;
void catch_gpio_init(u16 period, u16 prescaler);
void catch_timer_enable(void);
#endif

2. catch_utils.c

#include "catch_utils.h"#define RISING 0
#define FALLING 1/*** @brief  捕获初始化
*/
void catch_gpio_init(u16 period, u16 prescaler)
{// GPIO 初始化GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 定时器初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = period;TIM_TimeBaseStructure.TIM_Prescaler = prescaler;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);// 输入捕获初始化TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICFilter = 0x00;TIM_ICInit(TIM5, &TIM_ICInitStructure);TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising);// 开启捕获和定时器中断TIM_ITConfig(TIM5, TIM_IT_Update | TIM_IT_CC1, ENABLE);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/*** 中断函数
*/
void TIM5_IRQHandler(void)
{// 如果捕获到,要翻转一下捕获方向,如果捕获到下降沿,就设置为上升沿,并计算捕获时间并输出if (TIM_GetITStatus(TIM5, TIM_IT_CC1)){if (TIM5_Capture == RISING){printf("catch rising irq, TIM5_Capture= %d \n", TIM5_Capture);TIM5_Capture = FALLING;// 关闭定时器TIM_Cmd(TIM5, DISABLE);TIM_SetCounter(TIM5, 0);TIM5_Overflow = 0;TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Falling);TIM_Cmd(TIM5, ENABLE);}else{// 捕获到下降沿TIM5_Capture = RISING;// 计算 总时间u16 time = TIM_GetCapture1(TIM5);u32 total_time = TIM5_Overflow * 0xffff + time;printf("catch falling irq, capture time= %d, overflow count = %d \n, total=%dus", time, TIM5_Overflow, total_time);TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising);}TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);}else if(TIM_GetITStatus(TIM5, TIM_IT_Update)){TIM5_Overflow++;TIM_ClearITPendingBit(TIM5, TIM_IT_Update);}
}
/*** @brief 使能定时器
*/
void catch_timer_enable(void)
{TIM_Cmd(TIM5, ENABLE);
}

3. main.c

#include "gpio_utils.h"
#include "rcc_utils.h"
#include "stm32f10x.h"
#include "sys_tick_utils.h"
#include "led_utils.h"
#include "usart_utils.h"
#include "stdio.h"
#include "catch_utils.h"// 主函数
int main(void)
{GPIO_Configuration(); // 调用GPIO配置函数// tick 初始化sys_tick_init(72);led_all_off();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);USART3_Init(9600);printf("starting...");// led 初始化custom_led_init();int i = 0;// 捕获初始化catch_gpio_init(0xffff, 72 - 1);catch_timer_enable();while (1) // 无限循环{delay_ms(990);led_lightn(i);i++;if(i>9){i=0;}}
}

四、触摸按键捕获

我的开发板没有带触摸组件,所以本实验使用外置的触摸按键模块。
在这里插入图片描述
这个触摸按键在感应到触摸时,会在SIG引脚输出高电平。 直接把SIG接在 PA0 上即可使用。
但该电路对原KEY_UP按键模块有影响,开发板按键按下的时候,PA0 获取不到足够高的电平。

运行中串口输出示例

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

针对教育行业的网络安全方案有哪些

智慧校园”是教育信息化进入高级阶段的表现形式,比“数字校园”更先进。集体知识共融、共生、业务应用融合创新、移动互联网物联网高速泛在是其重要特征。特别是在互联网教育的大环境下,为了更好的发挥智慧化教学服务和智慧化教学管理功能,需…

node.js入门—day02

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:给自己一个梦想,给世界一个惊喜。 🎅**学习目标: 坚持每一次的学习打卡 文章目录 什么是单线程…

计算机服务器中了devos勒索病毒怎么解密,devos勒索病毒解密工具流程

随着网络技术的不断发展与更新,越来越多的企业利用网络开展了各项工作业务,网络也为企业提供了极大便利,大大提高了办公效率。但网络是一把双刃剑,企业的数据安全问题一直是企业关心的主要话题,近日,云天数…

InDesign 2024:创意不熄火,设计不止步mac/win版

InDesign 2024,不仅仅是一个设计软件更新,它更是设计界的一次革命性飞跃。这款全新的设计软件将为您打开前所未有的创意大门,让您在设计的海洋中畅游无阻。 InDesign 2024 mac/win版获取 InDesign 2024以其卓越的性能和稳定性,确…

钉钉魔法盒:解锁企业数字化转型新密码

在数字化的浪潮中,一家公司在企业团队管理和商场综合运营中致力于实现数字化转型。于是,该公司在与无雀科技商讨后,决定引入钉钉平台,不仅要打造商业地产平台,更要优化团队管理流程,提升组织运营效率。 针对…

Linux中mysql的安装、远程访问、基础操作、文件导入

Linux中mysql的安装、远程访问、基础操作、文件导入 cheet card1. 安装1. 使用root账号安装mysql 2. 启动mysql并创建root、管理员两个账号3. 基础操作3.1 数据库的查看、创建、修改、删除3.2 mysql的数据类型3.3 数据表的基本操作3.4 数据表结构的修改3.5 表中数据的增、删、改…

git基础命令(一)

目录 基础概念git statusgit addgit diffgit loggit commit文件可以处于以下三种状态之一远程存储库与本地存储库参考 用于知识记录。后续有新的的内容,例子,将持续更新本文档。 基础概念 工作树:git add 之前,变动内容的文件列表…

从金蝶云星空到钉钉通过接口配置打通数据

从金蝶云星空到钉钉通过接口配置打通数据 对接系统金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”,旨在帮助企业打造面…

想要自己制作一款游戏,需要掌握哪些基本技能?

你是否曾经沉浸在游戏的世界中,感受到游戏带来的无限乐趣?你是否曾经梦想能够亲手制作一款属于自己的游戏,为玩家带来独特的体验?然而,要实现自己的游戏创作梦想,并不是一件轻松的事情。需要掌握各种技能和…

蓝桥杯历年真题省赛java b组 2016年 第六届 剪邮票

一、题目 剪邮票 如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连) 比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。…

机器学习 Python库 乱记录

MLFlow—模型实验和跟踪 MLflow是一个平台,帮助你从头到尾管理你的机器学习实验,确保可追溯性和可重复性。它提供了一个集中的存储库,用于存储你的代码、数据和模型工件,以及一个跟踪系统,记录你所有的实验&#xff0c…

CSS 03

1.选择器 1.1 结构伪类选择器 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>结…

[云原生] Prometheus自动服务发现部署

一、部署服务发现 1.1 基于文件的服务发现 基于文件的服务发现是仅仅略优于静态配置的服务发现方式&#xff0c;它不依赖于任何平台或第三方服务&#xff0c;因而也是最为简单和通用的实现方式。 Prometheus Server 会定期从文件中加载 Target 信息&#xff0c;文件可使用 YAM…

使用Lua配置NeoVim

使用Lua配置NeoVim 源码地址依次添加插件视频地址 源码地址 Github: my-neovim-lua 依次添加插件 Lazy.nvim: nvim的插件管理器catpuccin: 舒缓柔和的主题插件telescope: 负责查找、过滤、预览treesitter: 基于语法树实现语法高亮neo-tree: 文件导航栏 。。。等待解锁更多 …

Zabbix 监控 tomcat

zabbix-java-gateway服务组件 zabbix监控tomcat需要用到zabbix-java-gateway组件&#xff0c;它充当zabbix服务和java应用程序之间的网关。它允许zabbix服务器用过java网关与java应用程序进行通信&#xff0c;从而监控和收集java应用程序的性能数据。 zabbix-agent服务&#xf…

数据仓库原理(二)

目录 四、数据仓库的概念模型&#xff08;一&#xff09;多维数据模型&#xff08;二&#xff09;维度与粒度 五、数据仓库的逻辑模型&#xff08;一&#xff09;多维模型&#xff08;二&#xff09;星形模型&#xff08;三&#xff09;雪花模型 六、数据仓库的物理模型&#x…

CVPR2023 | 3D Data Augmentation for Driving Scenes on Camera

3D Data Augmentation for Driving Scenes on Camera 摄像机驾驶场景的 3D 数据增强 摘要翻译 驾驶场景极其多样和复杂&#xff0c;仅靠人力不可能收集到所有情况。虽然数据扩增是丰富训练数据的有效技术&#xff0c;但自动驾驶应用中现有的摄像头数据扩增方法仅限于二维图像…

Flutter 多语言自动化本地化生成器

Flutter 多语言自动化本地化生成器 这是一个为Flutter设计的插件&#xff0c;通过从Excel表格提取的CSV文件自动生成Dart本地化文件&#xff0c;以简化应用程序本地化的流程。这个工具通过自动化创建多语言资源文件&#xff0c;简化了开发人员和翻译人员的工作流程。 特点 默…

国外visa卡怎么办理,可充ChatGPTPLUS、Claude、Midjourney

很多小伙都在使用ChatGPT&#xff0c;但是想充值ChatGPTPLUS缺需要国外的visa卡&#xff0c;拿自己的银联卡&#xff0c;尝试了好多次还是不行&#xff0c;其实用一张国外的visa卡几分钟就可以升级好 办理国外visa卡&#xff0c;点击获取 国外的visa卡&#xff0c;具体要看你…

ArcGIS全系列实战视频教程——9个单一课程组合+系列直播回放

《ArcGIS全系列实战视频教程》是由9个单一课程组合合成。组成一条ArcGIS入门实战各项专题深入应用学习全链条&#xff0c;让你学有方向、学有目的&#xff0c;系统全面掌握ArcGIS。 ArcGIS全系列实战视频教程——9个单一课程组合https://edu.csdn.net/combo/detail/2569 《Ar…