【STM32单片机_(HAL库)】4-3-4【定时器TIM】测量按键按下时间实现3

在这里插入图片描述

1.硬件

  • STM32单片机最小系统
  • 按键模块

2.软件

  • 定时器HAL驱动层文件添加
  • ic驱动文件添加
  • GPIO常用函数
  • 定时器输入捕获实验配置步骤
  • main.c程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "ic.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */led_init();                         /* 初始化LED灯 */uart1_init(115200);printf("hello world!\r\n");ic_init(65536 - 1, 72 - 1);while(1){ pressed_time_get();delay_ms(10);
//        led1_on();
//        led2_off();
//        delay_ms(500);
//        led1_off();
//        led2_on();
//        delay_ms(500);}
}
  • **ic_init(65536 - 1, 72 - 1);//计时1us**语句定时参考

在这里插入图片描述

  • ic.c程序
#include "ic.h"
#include "stdio.h"
#include "string.h"struct
{uint8_t succeed_flag;uint8_t rising_flag;uint8_t falling_flag;uint16_t timout_cnt;
} capture_status = {0};uint16_t last_cnt = 0;TIM_HandleTypeDef ic_handle = {0};
void ic_init(uint16_t arr, uint16_t psc)
{TIM_IC_InitTypeDef ic_config = {0};ic_handle.Instance = TIM2;ic_handle.Init.Prescaler = psc;ic_handle.Init.Period = arr;ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;HAL_TIM_IC_Init(&ic_handle);ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;ic_config.ICPrescaler = TIM_ICPSC_DIV1;ic_config.ICFilter = 0;HAL_TIM_IC_ConfigChannel(&ic_handle, &ic_config, TIM_CHANNEL_2);__HAL_TIM_ENABLE_IT(&ic_handle, TIM_IT_UPDATE);HAL_TIM_IC_Start_IT(&ic_handle, TIM_CHANNEL_2);
}void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE();                           // 使能GPIOB时钟__HAL_RCC_TIM2_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Pin = GPIO_PIN_0;                    // 两个LED对应的引脚gpio_initstruct.Mode = GPIO_MODE_AF_PP;             // 推挽输出gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速HAL_GPIO_Init(GPIOB, &gpio_initstruct);HAL_NVIC_SetPriority(TIM2_IRQn, 2, 2);HAL_NVIC_EnableIRQ(TIM2_IRQn);}
}void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&ic_handle);
}void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{//printf("捕获到下降沿\r\n");if(htim->Instance == TIM2){if(capture_status.succeed_flag == 0){if(capture_status.falling_flag == 1){printf("捕获到上升沿\r\n");capture_status.succeed_flag = 1;last_cnt = HAL_TIM_ReadCapturedValue(&ic_handle, TIM_CHANNEL_2);TIM_RESET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2);TIM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_FALLING);//memset(&capture_status, 0, sizeof(capture_status));}else{printf("捕获到下降沿\r\n");memset(&capture_status, 0, sizeof(capture_status));capture_status.falling_flag = 1;__HAL_TIM_DISABLE(&ic_handle);__HAL_TIM_SET_COUNTER(&ic_handle, 0);//定时器清零TIM_RESET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2);TIM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING);__HAL_TIM_ENABLE(&ic_handle);}}}
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if(capture_status.succeed_flag == 0){if(capture_status.falling_flag == 1)capture_status.timout_cnt++;}}
}void pressed_time_get(void)
{if(capture_status.succeed_flag == 1){printf("按下时间:%d us\r\n", capture_status.timout_cnt * 65536 + last_cnt);memset(&capture_status, 0, sizeof(capture_status));}
}
  • ic.h程序
#ifndef __IC_H__
#define __IC_H__#include "sys.h"
void ic_init(uint16_t arr, uint16_t psc);
void pressed_time_get(void);#endif

3.实物效果

  • 硬件模块接线
    KEY一端—>PA0
    KEY另一端—>GND
    ST-Link下载方式
    打开串口软件,当按键按下时,串口打印输出“捕获到下降沿”;当按键松开时,串口打印输出“捕获到上升沿”;并打印“按下时间:”

测量按键按下时间keil源文件

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

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

相关文章

游戏修改器Cheat Engine CE v7.5修改版下载安装详细方法

Cheat Engine是一个专注于游戏的修改器。它可以用来扫描游戏中的内存,并允许修改它们。它还附带了调试器、反汇编器、汇编器、变速器、作弊器生成、Direct3D操作工具、系统检查工具等。 具体安装方法如下: 地址:Cheat Engine 7.5.zip 解压文件…

C++之String类(下)

片头 嗨喽~ 我们又见面啦,在上一篇C之String类(上)中,我们对string类的函数有了一个初步的认识,这一篇中,我们将继续学习string类的相关知识。准备好了吗?咱们开始咯~ 二、标准库中的string类 …

【MYSQL】授权远程连接的用户

文章目录 一、Navicat新建查询1.点击新建查询,授权远程连接的用户语句:2.刷新权限 二、Navicat用户 一、Navicat新建查询 1.点击新建查询,授权远程连接的用户语句: GRANT ALL PRIVILEGES ON *.* TO 库的用户名授权IP IDENTIFIED …

php email功能实现:详细步骤与配置技巧?

php email发送功能详细教程?如何使用php email服务? 无论是用户注册、密码重置,还是订单确认,电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能,并提供一些配置技巧,帮助你更好…

【pytorch】pytorch入门5:最大池化层(Pooling layers )

文章目录 前言一、定义概念 缩写二、参数三、最大池化操作四、使用步骤总结参考文献 前言 使用 B站小土堆课程 一、定义概念 缩写 池化(Pooling)是深度学习中常用的一种操作,用于降低卷积神经网络(CNN)或循环神经网…

《软件工程概论》作业一:新冠疫情下软件产品设计(小区电梯实体按钮的软件替代方案)

课程说明:《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论(第6版)》(张海藩等编著,清华大学出版社)作为教材。以《软件设计文档国家标准GBT8567-2006》…

本地生活服务项目有哪些:如何利用本地生活市场,打开线下流量!

随着各大互联网公司在本地生活服务板块的布局力度持续加大,越来越多的人都开始意识到了它背后所蕴含着的发展前景和收益潜力,进而纷纷打听起了与之相关的消息。而就小编与多位创业者的交流情况而言,在众多问题中,属本地生活服务项…

springboot中有哪些方式可以解决跨域问题

文章目录 什么是跨域解决方案CrossOrigin注解实现WebMvcConfigurer接口CorsFilter过滤器如何选择? 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 Talk is cheap &#xff0…

算法专题二: 滑动窗口

目录 1. 长度最小的子数组2. 无重复字符的最长子串3. 最大连续1的格数Ⅲ4. 将x减到0的最小操作数5. 水果成篮6. 找到字符串中所有字母异位词7. 串联所有单词的子串8. 最小覆盖子串 1. 长度最小的子数组 题目思路: 首先暴力解法就是依次枚举出所有的子数组, 从第一个元素为左端…

婚恋交友小程序的设计思路与用户体验优化

在数字化时代,婚恋小程序作为一种新兴的婚恋交友平台,正逐渐成为单身人士寻找伴侣的重要工具。一个优秀的婚恋小程序不仅要有创新的设计思路,还要注重用户体验的优化。编辑h17711347205以下是婚恋小程序的设计思路与用户体验优化的详细阐述&a…

ELK--收集日志demo

ELK--收集日志demo 安装ELK日志收集配置启动容器springboot配置测试 之前项目多实例部署的时候,由于请求被负载到任意节点,所以查看日志是开多个终端窗口。后来做了简单处理,将同一项目的多实例日志存入同一个文件,由于存在文件锁…

景联文科技精准数据标注:优化智能标注平台,打造智能未来

景联文科技是一家致力于为人工智能提供全面数据标注解决方案的专业公司。 拥有一支由经验丰富的数据标注师和垂直领域专家组成的团队,确保数据标注的质量和专业性。 自建平台功能一站式服务平台,提供从数据上传、标注、审核到导出的一站式服务&#xff0…

【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 timer驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "timer.h"int main(void) {H…

【LeetCode HOT 100】详细题解之链表篇

LeetCode HOT 100题解之链表篇 160 相交链表题目分析代码 206 反转链表方法一:迭代 234 回文链表方法一:将值复制到数组中方法二:快慢指针 141 环形链表方法一:哈希表方法二:快慢指针 142 环形链表II方法一&#xff1a…

<<机器学习实战>>10-11节笔记:生成器与线性回归手动实现

10生成器与python实现 如果是曲线规律的数据集,则需要把模型变复杂。如果是噪音较大,则需要做特征工程。 随机种子的知识点补充: 根据不同库中的随机过程,需要用对应的随机种子: 比如 llist(range(5)) random.shuf…

鸿蒙NEXT开发环境搭建(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南

使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南 本文详细介绍了如何在 2375 端口未开放的情况下,通过 SSH 连接 Docker 服务器并在 Idea 中进行开发。通过修改用户权限、生成密钥对以及配置 SSH 访问,用户可以安全地远程操作…

python画图|自制渐变柱状图

在前述学习过程中,我们已经通过官网学习了如何绘制渐变的柱状图及其背景。 掌握一门技能的最佳检验方式就是通过实战,因此,本文尝试做一些渐变设计。 前述学习记录可查看链接: Python画图|渐变背景-CSDN博客 【1】柱状图渐变 …

Mac制作Linux操作系统启动盘

前期准备 一个 Mac 电脑 一个 U 盘(8GB 以上) 下载好 Linux 系统镜像(iso 文件) 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘,打开终端输入下面的命令查看 U 盘是否已经 m…

Springboot3 + MyBatis-Plus + MySql + Vue + ProTable + TS 实现后台管理商品分类(最新教程附源码)

Springboot3 MyBatis-Plus MySql Uniapp 商品加入购物车功能实现(针对上一篇sku) 1、效果展示2、数据库设计3、后端源码3.1 application.yml 方便 AliOssUtil.java 读取3.2 model 层3.2.1 BaseEntity3.2.1 GoodsType3.2.3 GoodsTypeSonVo3.3 Controll…