STM32CubeMX应用 -- 定时器输入脉冲计数

2023-05-16

目录

参考链接

一、实现过程

二、STM32CubeMX配置示例

三、C语言示例程序


参考链接

https://blog.csdn.net/m0_37845735/article/details/105395643

 

一、实现过程

当选择外部的同步时钟信号(TI1F_ED、TI1FP1、TI2FP2)作为计数器的时钟源,也就是计数器时钟源选择为外部模式1时,计数器可以在选定输入端的每个上升沿或下降沿计数,以此来统计输入脉冲,实现脉冲计数功能

 

除了要配置 选择要使用的通用定时器(TIM2~TIM5),选择计时器的时钟源为内部时钟(CK_INT)、根据要定时的时间计算预分频系数(TIMx_PSC)、自动重装载值(TIMx_ARR)、内部时钟的分频系数以外,更重要的还需要配置:

  • 捕获/比较模式寄存器1/2(TIMx_CCMR1/2):有2个寄存器,一个寄存器只能设置2个通道;该寄存器用于设置通道的输入(捕获模式)或输出(比较模式)参数,就输入捕获而言,主要设置滤波器、预分频器、输入映射关系
  • 捕获/比较使能寄存器(TIMx_CCER):配置捕获触发的信号级性、捕获使能,每个定时器有4个通道,这里的CC1P/CC1E表示的是第一个通道
  • 从模式控制寄存器(TIMx_SMCR):选择触发输入源和从模式

例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:

1. 配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测TI2输入的上升沿

2. 配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000) 注: 捕获预分频器不用作触发,所以不需要对它进行配置

3. 配置TIMx_CCER寄存器的CC2P=’0’,选定上升沿极性

 

4. 配置TIMx_SMCR寄存器的SMS=’111’,选择定时器外部时钟模式1

5. 配置TIMx_SMCR寄存器中的TS=’110’,选定TI2作为触发输入源

6. 设置TIMx_CR1寄存器的CEN=’1’,启动计数器 当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。

 

二、STM32CubeMX配置示例

 

三、C语言示例程序

下面拿一个测量电容式湿度传感器的脉冲频率为例。如下图所示,湿度传感器会在FOUT输出脚 输出 频率大概为6K-7K的脉冲,频率大小与湿度有一个一 一对应的关系,通过查表的方法就可以将统计的脉冲频率转换成湿度。可以定时1S统计输入的脉冲,这样就可以很方便的计算湿度传感器的频率,进而算出湿度。

/* TIM2 init function */
/*
  TIM2用作湿度传感器定时1S,计算频率
  溢出时间 = (Autoreload + 1) * (Prescaler + 1)/TCCLK72M 
*/
void MX_TIM2_Init(void)
{
    LL_TIM_InitTypeDef TIM_InitStruct;

    /* Peripheral clock enable */
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);

    TIM_InitStruct.Prescaler         = 9999;
    TIM_InitStruct.CounterMode       = LL_TIM_COUNTERMODE_UP;
    TIM_InitStruct.Autoreload        = 7199;
    TIM_InitStruct.ClockDivision     = LL_TIM_CLOCKDIVISION_DIV1;
    TIM_InitStruct.RepetitionCounter = 0;  //重复计数器
    LL_TIM_Init(TIM2, &TIM_InitStruct);
    LL_TIM_EnableARRPreload(TIM2);   //使能自动重装载预装载,ARR寄存器有缓冲区

    LL_TIM_SetClockSource  (TIM2, LL_TIM_CLOCKSOURCE_INTERNAL);
    LL_TIM_SetTriggerOutput(TIM2, LL_TIM_TRGO_RESET);
    LL_TIM_DisableMasterSlaveMode(TIM2);
    
    /* TIM2 interrupt Init */
    NVIC_EnableIRQ(TIM2_IRQn);
    
    LL_TIM_EnableIT_UPDATE (TIM2);//使能更新中断
    LL_TIM_ClearFlag_UPDATE(TIM2);
    LL_TIM_EnableCounter   (TIM2);

}

/* TIM1-CH1 init function */
/*
  TIM1-CH1用作湿度传感器外部计数
*/
void MX_TIM1_Init(void)
{
    LL_TIM_InitTypeDef     TIM_InitStruct = {0};

    /* Peripheral clock enable */
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM1);
    /**TIM1 GPIO Configuration  
    PA8   ------> TIM1_CH1 湿度传感器脉冲计数
    */
    
    
    TIM_InitStruct.Prescaler     = 0;
    TIM_InitStruct.CounterMode   = LL_TIM_COUNTERMODE_UP;
    TIM_InitStruct.Autoreload    = 0xffff;
    TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
    LL_TIM_Init(TIM1, &TIM_InitStruct);
    LL_TIM_DisableARRPreload     (TIM1);
	
	/*从模式控制寄存器(TIMx_SMCR)*/
    LL_TIM_SetTriggerInput       (TIM1, LL_TIM_TS_TI1FP1);//TIMx_SMCR->TS 设置输入触发源
    LL_TIM_SetClockSource        (TIM1, LL_TIM_CLOCKSOURCE_EXT_MODE1);//TIMx_SMCR->SMS 选择计数器的时钟来源
	/*捕获/比较模式寄存器1(TIMx_CCMR1)*/
    LL_TIM_IC_SetFilter          (TIM1, LL_TIM_CHANNEL_CH1, LL_TIM_IC_FILTER_FDIV1);//设置输入滤波器,不滤波 TIMx_CCMR1->ICxF
	/*捕获/比较使能寄存器(TIMx_CCER)*/
    LL_TIM_IC_SetPolarity        (TIM1, LL_TIM_CHANNEL_CH1, LL_TIM_IC_POLARITY_FALLING);//设置输入捕获极性,下降沿捕获 TIMx_CCER->CCxP
	
    LL_TIM_DisableIT_TRIG        (TIM1);
    LL_TIM_DisableDMAReq_TRIG    (TIM1);
	
    LL_TIM_SetTriggerOutput      (TIM1, LL_TIM_TRGO_RESET);
    LL_TIM_DisableMasterSlaveMode(TIM1);

    /* TIM1 interrupt Init */
    NVIC_EnableIRQ(TIM1_UP_IRQn);
    
    LL_TIM_SetCounter      (TIM1, 0);
    LL_TIM_EnableIT_UPDATE (TIM1);
    LL_TIM_ClearFlag_UPDATE(TIM1);
    LL_TIM_EnableCounter   (TIM1);   
	
}

/*
  * @brief This function handles TIM1-CH1 update interrupt.
  * 湿度传感器脉冲计数溢出中断
  * 中断优先级大于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,所以在中断中不可调用FreeRTOS函数
  * 湿度传感器频率大概为6K-7K,而TIM1溢出计数为65536,溢出视为错误
*/
void TIM1_UP_IRQHandler(void)
{
    if(LL_TIM_IsActiveFlag_UPDATE(TIM1))
    {
        Humit_FreqOver_Set();
        LL_TIM_ClearFlag_UPDATE(TIM1);	       
    }
}


/*
  * @brief This function handles TIM2 update interrupt.
  * 湿度传感器定时1S中断
  * 中断优先级大于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,所以在中断中不可调用FreeRTOS函数
*/
void TIM2_IRQHandler(void)
{
    unsigned int iFreq = 0;
    
    if(LL_TIM_IsActiveFlag_UPDATE(TIM2))
    {
        iFreq = LL_TIM_GetCounter(TIM1); //获取TIM1湿度传感器脉冲计数
        Humit_Freq_Set(iFreq);
        LL_TIM_SetCounter(TIM1,0);
        
        LL_TIM_SetCounter(TIM2,0);   //清空计数
        LL_TIM_ClearFlag_UPDATE(TIM2);	
    }
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeMX应用 -- 定时器输入脉冲计数 的相关文章

  • csdn如何修改文字体及颜色

    csdn如何修改文字体及颜色
  • Android实战SDK对接机智云平台(基础篇) > 6、配网界面的UI搭建 学习笔记

  • 如何保证APP与服务端通信安全

    如何保证APP与服务端通信安全
  • 奎享雕刻使用教程

    软件下载地址 提取码 xff1a g3zk 将类似于u盘似的加密狗插在电脑上 机器和软件连接 xff1a 参数配置 xff1a 实心图 xff1a 1 打开要绘制的图片 2 选择绘制方式 xff1a 笔记 页面宽 xff1a 纸张的宽 左边
  • 万用表的使用方法,焊接

    万用表的使用方法 测量电容时 xff0c 现将电容 短接放电 测量电流时 xff0c 先将电路断开 通断挡在70欧姆以下认为导通 吸锡带 引脚密集的贴片元件在焊接的过程中 xff0c 很容易造成焊锡过多导致引脚短路的现象 xff0c 使用吸
  • STM32学习教程

    STM32学习教程 硬石电子 资料下载库的区分启动模式选择NVICDMAstm32 hal库 pb3做普通ioUSART 串口通讯DMA 直接存储寄存器读取DMA USART1接发RS 485通信 洋桃电子 STM32入门100步第33步U
  • 写字机器人使用教程

    一次制作写字机器人的过程 xff08 含制作教程 xff09 arduino 写字机器人制作教程 写字机器人制作教程2 0 购买链接 资料下载地址 xff1a 智宇科技 写字机器人 光盘资料 xff08 A盘资料 xff09 解压密码 xf
  • Inter RealSenseT265测试总结

    1 光线对定位有影响 xff0c 在一定范围内 xff0c 光线越充足 xff0c 定位精度越高 xff0c 但是当光线达到一定条件之后 xff0c 光照强度就不再跟定位精度成正比了 xff1b 2 周围环境对定位有影响 xff0c 周围的
  • 论文小技巧

    文件 选项 LM3405AXMKE NOPB與LM3405AXMK NOPB LM3405AXMKX NOPB對比 激光二极管 期刊查询 在word里面插入图片时怎样才成是100 比例的 文献 封装与功率 高手支招 xff1a 教你利用裸露
  • 激光啄木鸟使用教程

    软件下载地址 1 红色方框内的按钮长按开机 2 红色方框内的按钮轻触自动对焦 3 打开手机APP选择要雕刻的素材 4 设置要雕刻区域的大小 xff0c 开始预览可以查看雕刻的位置 5 打开蓝牙 xff0c 点击连接设备 6 选择被雕刻物件的
  • STM32 HAL库

    STM32 HAL库 第三章 MDK5 软件入门bug解决关键文件介绍程序仿真User Keywords语法提示代码编辑 查看技巧 第四章 STM32F1 基础知识入门MDK 下 C 语言基础复习STM32F103 时钟系统STM32F10
  • LWIP网络-基于STM32平台

    LWIP P1无操作系统移植RAW UDP实验RAW TCP实验Webserver实验 P1无操作系统移植 MAC 43 PHY 通过符合 IEEE802 3的MII和RMII接口与外接快速以太网PHY进行通信 MII和RMII实现数据交换
  • 树莓派学习

    树莓派学习教程 系统安装数据源的更新与配置命令设定固定IP网络地址 xff1a 法一法二 给树莓派安装中文环境和中文输入法远程控制树莓派SSH方式 xff1a 通过putty软件实现 xff08 不需要屏幕 xff09 VNC方式 xff0
  • C++学习教程

    C 43 43 学习教程 C 43 43 内存分区模型数据类型循环语句for循环语句 跳转语句指针指针 数组 函数 结构体指针 内存分区模型 工具vs codeDEV C 43 43 C 43 43 内存分区模型 程序运行前 全局区和代码区
  • core dumped ?完了?

    微信公众号 xff1a linux码头 core dumped xff1a 当程序在运行过程中发生异常 xff0c 这时linux系统可以把程序出错的内存 内容存储在一个core文件中 xff0c 又叫核心转存 应用程序在运行过程汇总经常会
  • Ubuntu18.04安装网络调试助手 NetAssist

    下载地址 链接 xff1a https pan baidu com s 1DUqZBtxFh pGTsRR2kXaPA 提取码 xff1a fp32 安装步骤 1 xff09 建立依赖关系 sudo apt get install f 2
  • C语言中左移(<<)和右移(>>)的理解

    lt lt 左移 xff1a 相当于乘法 a lt lt b 61 a 2 b 举例 xff1a 1 lt lt 5 xff0c 相当于1 2 5 61 32 1 lt lt 0 xff0c 相当于1 2 0 61 1 gt gt 右移 x
  • 《Linux运维总结:firewalld防火墙使用教程》

    文章目录 一 firewalld基础知识1 1 firewalld基本介绍1 2 firewalld与iptables关系与区别1 3 firewalld默认策略1 4 firewalld配置模式1 5 firewalld配置方法1 6 f
  • ROS常用的功能包

    坐标系 坐标变换 xff08 tf xff09 tf功能包提供了一个基于ROS的分布式框架 xff0c 可以随着时间的推移计算多个坐标系的位置 3D可视化工具 xff08 rviz xff09 机器人模型的可视化 图像数据的可视化 地图数据
  • 树莓派4B+Ubuntu 18.04 LTS + 桌面desktop + ros安装@树莓派4B、Ubuntu、desktop、ros

    树莓派4B 43 Ubuntu 18 04 LTS 43 桌面desktop 43 ros安装 64 树莓派4B Ubuntu desktop ros 久违的一篇博客 xff0c 说实话CSDN的编辑器还是用不太习惯 xff0c 记录一下树

随机推荐

  • 云台控制协议总结(VISCA/PELCOD/PELCOP)

  • error: #20: identifier "TIM_TimeBaseInitTypeDef" is undefined

    如果出现多句错误 xff1a identifier 34 34 is undefined 解决问题方法一 xff1a C C 43 43 include paths 把文件路径添加进去 解决问题方法二 xff1a 在stm32f10x co
  • 使用pyqt5实现键盘(含组合键)鼠标事件响应

    使用pyqt5实现键盘 xff08 含组合键 xff09 鼠标事件响应 使用python3 6 xff0c pyqt5 xff0c 在macOS上测试有效 span class hljs keyword import span sys sp
  • 递归思想刷题总结

    核心思想 我们在调用递归函数的时候 xff0c 把递归函数当做普通函数 xff08 黑箱 xff09 来调用 xff0c 即明白该函数的输入输出是什么 xff0c 而不用管此函数内部在做什么 xff08 千万不要跳进去了 xff0c 你脑袋
  • anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions

    在keil工程下移植代码 xff0c 编译出现了这个问题 xff0c 字面上解决办法有 xff1a 1 打开GNU模式 option gt GNU extensions 2 在代码前加上 pragma anon union 就是代表支持匿名
  • 串口的深入理解

    1 串口是如何发送数据的 xff1f 一般说来 xff0c 串口发送数据是往数据寄存器sbuf填写数据 xff0c 一个字节一个字节的写入 xff0c 如果有串口中断 xff0c 那么发送完一个字节的数据 xff0c 就会进入串口中断一次
  • CMakeLists.txt的简单使用

    Makefile和CMakeLists的关系 环境准备 xff1a 需要安装gcc xff0c g 43 43 xff0c make sudo apt get install gcc g 43 43 sudo apt get isntall
  • .so文件的基本理解,使用。

    一 基本概念 Linux下的 so是基于Linux下的动态链接 其功能和作用类似与windows下 dll文件 代码编译 xff0c 链接 xff0c 最后生成可执行文件 xff1b 这个可执行文件就可看作是一个静态链接 xff0c 因为代
  • jz2440:QT控制LED灯点亮熄灭(11)

    1 LED灯的驱动 xff1a 首先要准备好在驱动文件 xff0c 通过insmod led ko来加载模块 xff0c 然后在QT的代码里面配合调用open xff0c write read函数来点亮 xff0c 关闭LED灯 这一步 x
  • win10下安装ubuntu双系统

    本文章记录自己在Win10系统下安装ubuntu双系统的过程 xff0c 以及注意事项 另一个不错的安装教程 1 下载系统镜像 在官网或清华镜像 xff0c 根据需要的ubuntu版本下载需要的ubuntu镜像文件 这里要注意 xff0c
  • C++ shared_ptr的reset 用法

    include lt iostream gt include lt memory gt class Tmp public Tmp int a Tmp void print a std cout lt lt 34 value 61 34 lt
  • C++ 模板类的继承

    模板类 xff1a template lt typename T gt 说白了就是向之后的内容传递参数类型 xff0c 把T当作一个数据类型传递 xff0c 而在声明一个变量的时候 xff0c 通过base lt xxxx gt pp xx
  • linuxptp源码研究

    目录 1 检查网卡是否支持相应的时间戳 2 linuxptp的目录架构 3 ptp4l的大致流程分析 4 gptp协议对应的sync follow up delay request delay response消息在代码的位置 5 slav
  • xv6---Lab3: page tables

    目录 参考资料 RISC V页表的简化图如下所示 编辑 多级页表 xv6内核页表 3 6 Process Address Space 3 7 Code Sbrk 3 8 Code Exec Print a page table A kern
  • 内存管理---分页机制

    目录 物理内存管理带来的问题 直接映射 一级页表 二级页表 参考 xff1a xff08 C语言内存七 xff09 分页机制究竟是如何实现的 xff1f Smah 博客园 物理内存管理带来的问题 比如4GB的flash 如果应用程序可直接访
  • xv6---Lab4 traps

    参考 xff1a Lab Traps 关于寄存器s0和堆栈 https pdos csail mit edu 6 828 2020 lec l riscv slides pdf RISC V assembly Q 哪些寄存器包含函数的参数
  • stm32F4 hal库之CAN通信的实现

    本文的目的是为了能够实现功能 xff0c 故写的时候比较简略 参考资料 xff1a https blog csdn net u012308586 article details 81001102 正点原子开发手册 目标 xff1a 通过ca
  • 调试sim800L模块

  • 51单片机 串口中断

    1 什么是中断 广义上的中断是指一个过程 xff0c 举个简单的例子 xff0c 打开了电脑 xff0c 你正在放音乐 xff0c 点击了暂停按钮 xff0c 于是歌停了 这就是一个很明显的中断的例子 CPU正在做自己的事情 xff08 放
  • STM32CubeMX应用 -- 定时器输入脉冲计数

    目录 参考链接 一 实现过程 二 STM32CubeMX配置示例 三 C语言示例程序 参考链接 https blog csdn net m0 37845735 article details 105395643 一 实现过程 当选择外部的同