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

news2024/10/1 22:32:05

在这里插入图片描述

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.coloradmin.cn/o/2183280.html

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

相关文章

vue3 环境配置vue-i8n国际化

一.依赖和插件的安装 主要是vue-i18n和 vscode的自动化插件i18n Ally https://vue-i18n.intlify.dev/ npm install vue-i18n10 pnpm add vue-i18n10 yarn add vue-i18n10 vscode在应用商城中搜索i18n Ally:如图 二.实操 安装完以后在对应项目中的跟package.jso…

谈谈英国论文写作复合句式的运用

每次在写英国论文的时候,为了力求表达准确,很多留学生会选择使用简单句型来完成整篇文章的写作。这样的写作虽然可以完整地表达论文的意思,但是只用简单句完成全文,可能在grammar部分的评分会比较低。因此学会运用复合句型也成为留…

QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug

如图所示的.ui,执行却无法点击,需要删除布局,重新布局,并且QGroupBox放到后面。

每天五分钟深度学习pytorch:基于pytorch搭建一元线性回归模型

本文重点 前面我们学习了很多零散的知识,比如优化器,学习率,损失函数,反向传播参数计算等等,从本节课程起,我们将这些知识总结起来,本节课程我们看一下,如何才能通过pytorch搭建一元线性回归模型 什么是一元线性回归模型? 一元线性回归是只有一个自变量 (自变量x和…

RabbitMQ的相关题

一、 MQ的作⽤及应⽤场景 类似问题: 项⽬什么场景下使⽤到了MQ, 为什么需要MQ? RabbitMQ 的作⽤?使⽤场景有哪些? RabbitMQ…

python之with

with上下文管理是什么呢? 一般都是使用系统提供的一些with语句,列如我要去读取一些数据进行分析,就可以使用with open去读取某些数据,或者我要把一些图片给他保存到某些地方,可以用with给他写入。 上下午管理器with是…

墙绘艺术在线市场:SpringBoot实现指南

2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术,英文名称缩写是SSM,在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等,作为一个课题程序采用SSH框架也可以,SSM框架也可以,SpringMVC也可以。SSH框架…

精选算法入门——day1

题目一 题干 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含…

【STM32单片机_(HAL库)】4-3-1【定时器TIM】串口打印功能打开

1.硬件 STM32单片机最小系统CH340模块 2.软件 main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h"int main(void) {HAL_Init(); /* 初始化HAL库 */stm32_clock_init(R…

常见的RTSP播放器有哪些?

VLC播放器 特点:VLC 是一款功能强大、跨平台的多媒体播放器,支持多种音频和视频格式以及流媒体协议,包括 RTSP。它具有广泛的解码器支持,能播放大多数常见的视频和音频格式。其开源特性使得它拥有活跃的开发者社区,不断…

【教学类-59-01】20241001双面五星红旗国旗(中2班)

背景需求: 国庆在即,怎么能不做一面五星红旗呢? 【教学类-39】A4红纸-国旗灯笼纸模(庆祝中华人民共和国成立74周年)_a4 打印 灯笼-CSDN博客文章浏览阅读626次。【教学类-39】A4红纸-国旗灯笼纸模(庆祝中华…

车辆重识别(注意力 U-Net:学习在哪些区域寻找胰腺)论文阅读2024/10/01

什么是注意力机制? 什么是加性注意力? 大致说一下流程: 对于一张特征图来说,对于这张图中的每一个像素向量(例如a),计算该向量与所有像素向量的相似度,对这些相似度进行激活函数…

nvm实现nodejs版本管理

nvm相关操作 1. nvm的作用2. 下载nvm之前的操作3. 下载nvm3.1 zip不同的名称区别 4. 验证是否安装成功5. 配置镜像,提高下载速度6. 安装nodeJS7. 查看目前已经安装的版本8.安装成功后npm无法使用9. 卸载指定node版本10. 切换node版本11.NVM常用命令 1. nvm的作用 nvm是一个方便…

24-10-1-读书笔记(二十一)-《契诃夫文集》(四)下([俄] 契诃夫 [译] 汝龙) 我爱你,娜坚卡。

文章目录 《契诃夫文集》(四)下([俄] 契诃夫 [译] 汝龙 )目录阅读笔记记录总结 《契诃夫文集》(四)下([俄] 契诃夫 [译] 汝龙 ) 十月第一篇,放假了,挺高兴的&…

如何使用SCCMSecrets识别SCCM策略中潜在的安全问题

关于SCCMSecrets SCCMSecrets是一款针对SCCM策略的安全扫描与检测工具,该工具旨在提供一种有关 SCCM 策略的全面安全检测方法。 该工具可以从各种权限级别执行,并将尝试发现与策略分发相关的潜在错误配置。除了分发点上托管的包脚本外,它还将…

螺狮壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习01(环境准备)

1 准备工作 由于创建数据中心需要安装很多服务器,这些服务器要耗费很所物理物理计算资源、存储资源、网络资源和软件资源,作为穷学生只有几百块的n手笔记本,不可能买十几台服务器来搭建数据中心,也不愿意跑实验室,想躺…

信息安全数学基础(23)一般二次同余式

前言 信息安全数学基础中的一般二次同余式是数论和密码学中的一个重要概念,它涉及到了二次方程、模运算以及同余关系等多个方面。 一、定义 设m是正整数,a,b,c是整数,且a0,则形如ax2bxc≡0(modm)的同余式称为模m的二次同余式。…

Git傻傻分不清楚(上)

环境:Idea2022.3.3、Git(忘辽~) 怎么上传自己的项目到Github上? Idea和Github进行账号关联将项目上传到本地仓库(Commit)将本地仓库中的项目上传到Github上(Push) 一、关联账号 …

移动应用中提升用户体验的因素

用户体验(UX)是任何移动应用程序成功的关键因素。随着数以百万计的应用程序争夺注意力,提供无缝、愉快和高效的体验可能是获得忠实用户或在一次互动后失去忠实用户之间的区别。无论是商业应用程序、游戏还是社交平台,增强用户体验…

TypeScript 封装 Axios 1.7.7

随着Axios版本的不同,类型也在改变,以后怎么写类型? 1. 封装Axios 将Axios封装成一个类,同时重新封装request方法 重新封装request有几个好处: 所有的请求将从我们定义的requet请求中发送,这样以后更换…