STM32CubeMx配置通用定时器实现高精度脉冲计数

STM32CubeMX实战:5分钟搞定通用定时器脉冲计数(附按键清零功能) 本文提供了一份基于STM32CubeMX快速配置通用定时器实现外部脉冲计数的实战指南。通过图形化配置将定时器设置为外部时钟模式1,并利用输入捕获通道统计脉冲信号。文章详细演示了从工程创建、参数设置到代码编写的完整流程,并附带了实用的按键清零功能实现方法,帮助开发者高效完成硬件事件计数应用。 阅读详情

1. 脉冲计数:从生活场景到STM32的精准实现

你有没有想过,家里的水表是怎么工作的?或者,工厂里那些飞速旋转的电机,我们如何知道它到底转了多少圈?这背后都离不开一个核心动作:数数,专业点说,就是脉冲计数。简单来讲,脉冲就是一个短暂的电平跳变,就像你用手指“哒、哒、哒”地敲桌子,每敲一下就是一个“脉冲”。我们的任务,就是让单片机准确无误地“听到”并“记住”这些敲击声。

在嵌入式开发里,尤其是用STM32做项目,脉冲计数是个超级实用的基本功。无论是处理旋转编码器信号来测量电机转速和位置,还是测量外部信号的频率(比如超声波测距的回波),甚至是统计光电传感器感应到的物体通过次数,都离不开它。手动去检测每个脉冲的上升沿、下降沿,然后用代码累加?理论上可以,但一旦脉冲频率高了,你的主程序就会被彻底“绑死”,啥也干不了,而且精度根本无法保证。

这时候,STM32内置的通用定时器就该大显身手了。它就像单片机内部一个不知疲倦、自带秒表的“计数专员”。你只需要告诉它:“看到那个引脚上的电平从低跳到高(上升沿)就给我加1”,它就能在后台自动、精准地完成计数工作,完全不影响CPU去处理其他任务。而STM32CubeMX这个图形化配置工具,让设置这个“计数专员”变得像搭积木一样直观。今天,我就手把手带你,用CubeMX配置通用定时器,实现一个既稳定又高精度的脉冲计数功能。我会把配置中的每一个选项、代码里的每一行关键语句都掰开揉碎了讲,保证你跟着做一遍就能彻底搞懂。

2. 核心原理:定时器如何“兼职”成为计数器?

在开始动手配置之前,我们花几分钟彻底搞明白定时器是怎么“数脉冲”的,这能让你后面遇到问题时知道从哪儿下手。STM32的通用定时器(比如TIM2, TIM3, TIM4等)功能非常强大,它不仅仅能定时,还能计数。

你可以把一个通用定时器想象成一个带有向上/向下计数功能的数字秒表。在普通的定时模式下,这个秒表由单片机内部系统时钟来“滴答滴答”地驱动,每来一个时钟信号,计数值就加1。而在我们需要的脉冲计数模式下,我们要改变这个驱动源——不让内部时钟驱动,而是让外部的一个引脚上的电平变化来驱动。

STM32为定时器提供了几种外部时钟模式,其中最适合我们做脉冲计数的就是 “外部时钟模式1”。在这个模式下,定时器不再关心内部的系统时钟,它只“监听”指定的外部输入引脚(通常是定时器的某个输入捕获通道,比如TIMx_CH1)。当这个引脚上发生我们预设的事件(比如一个上升沿)时,定时器内部的计数器就自动加1。

这里涉及到几个关键角色,我们结合CubeMX的配置项来理解:

  • 触发信号源 (Trigger Source):告诉定时器,你要“听”哪个引脚的信号。我们选择 TI1FP1,这代表“定时器1输入1,经过滤波后的信号”。简单理解,就是选择TIMx_CH1这个引脚作为信号输入。
  • 从模式 (Slave Mode):定时器的工作模式。我们选择 “外部时钟模式1” (External Clock Mode 1)。这个模式一旦启用,定时器的计数时钟就完全交给了我们选择的触发信号源。
  • 触发极性 (Trigger Polarity):定义什么样的信号变化算作一个有效事件。我们选择 “上升沿” (Rising Edge)。这意味着只有当输入引脚的电平从低(0)跳到高(1)的瞬间,计数器才会加1。如果你选择“下降沿”或“双边沿”,计数的规则就会不同。

我画个简单的比喻:定时器就像一个坐在门口记录人数的保安。“外部时钟模式1” 就是他进入工作状态的口令。TI1FP1 就是他盯着的那扇门(特定引脚)。“上升沿触发” 就是他记录人数的规则:只有看到一个人从门外完全走进门内(电平

STM32CubeMX应用 -- 定时器输入脉冲计数 目录 一、实现过程 二、STM32CubeMX配置示例 三、C语言示例程序 一、实现过程 当选择外部的同步时钟信号(TI1F_ED、TI1FP1、TI2FP2)作为计数器的时钟源,也就是计数器时钟源选择为外部模式1时,计数器可以在选定输入端的每个上升沿或下降沿计数,以此来统计输入脉冲,实现脉冲计数功能 除了要配置 选择要使用的通用定时器(TIM2~TIM5),选择计时器的时钟... 阅读详情

相关推荐

通用定时器脉冲计数实验(STM32CubeMx配置)

通用定时器脉冲计数实验

a1169511636的博客 5510

STM32CUBEMX配置 定时器中断 和 上升沿中断(实现检测1s以内的脉冲个数)

⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动,包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。⏩本篇文章对STM32CUBEMX配置STM32CUBEMX配置 定时器中断 和 上升沿中断以实现检测1s以内的脉冲个数做一个详细的教程。

qq_52608074的博客 4192

避坑指南:STM32通用定时器脉冲计数常见问题与解决方案(基于STM32CubeMx)

本文深入解析STM32通用定时器脉冲计数的实现原理与常见问题,基于STM32CubeMx提供详细的避坑指南。涵盖时钟源配置、通道选择、滤波器设置等关键环节,帮助开发者解决计数不稳定、信号丢失等问题,提升嵌入式系统的可靠性和精度。

zzz56的博客 232

STM32脉冲计数实现教程

STM32微控制器系列是STMicroelectronics(意法半导体)公司生产的一系列32位ARM Cortex-M微控制器。它们以高性能、低功耗、价格亲民、丰富的集成外设而受到广泛欢迎,广泛应用于物联网、汽车电子、工业控制、医疗设备以及消费电子产品等领域。

weixin_42596214的博客 1852

利用STM32的HAL库进行脉冲计数(捕获方式)

利用STm32的HAL库,用STM32CubeMX来进行配置,对脉冲进行计数,并显示在TFTLCD上,同时当上位机传来命令后可以将脉冲个数上传到上位机。

输出定量的脉冲个数,并读取脉冲个数

stm32外部脉冲计数程序,通过产生定量的脉冲个数,然后通过串口读取个数

基于STM32CubeMX的基本定时器

本次实验中,对基本定时器6进行了初始化配置,周期为500ms,也就是每500ms发生溢出并产生一个上溢事件,并在回调函数中对LED灯进行翻转操作,所以实验现象是每500msLED灯翻转一次

STM32外部计数器程序

对于需要用STM32读取编码器的反馈值,需要计数外部方波个数的同学有福了,下载可以直接用,本代码提供TIM1 TIM2的外部计数器代码。

USB-Type-C PCB布局布线设计规范

USB Type-C连接器有24个引脚。图1和图2分别显示了USB Type-C插座和插头的插针。母头/母座公头/插头可以很明显看出,插口内的Pin功能相对于中心对称。公头插入母头,无论正反插,引脚功能都完美契合。而且电源VBUS/GND都拥有4个Pin,最大支持5A电流,在保证高速数据传输的同时也提高了电流承载能力。表 1 和表 2 分别汇总了在 USB Type-C 型插座和插头上所使用的信号列表。

weixin_63005522的博客 8286

论文阅读------Exposure Fusion: A Simple and Practical Alternative to High Dynamic Range Photography

Mertens T, Kautz J, Van Reeth F. Exposure fusion: A simple and practical alternative to high dynamic range photography[C]//Computer graphics forum. Oxford, UK: Blackwell Publishing Ltd, 2009, 28(1): 161-171. 摘要 本文提出了一种将包围曝光的序列融合到高质量图像中的技术,而无需先转换为高动态范围(HD.

qq_25283239的博客 3398

vit的cam和注意力图: VIT模型的可解释性

VIT的热力图怎么画

YI_SHU_JIA的博客 1万+

afe模拟前端的重要性_高性能模拟前端信号链解决方案如何助力医疗超声系统发展...

1942年,奥地利TDussik使用A型超声成像系统穿透性探测颅脑,并于1949年获得头部的超声图像,此举昭示超声系统进入到医疗领域。直到如今,超声系统作为用于人体内部的无创可视化技术,被广泛用于医疗领域。最近一份报告称到2022年,中国医疗超声诊断仪器行业的市场规模预计将达到15.8亿美元,保持6%左右的年均增长率。高性能模拟信号链前端是超声设备的关键组成部分,作为高性能模拟技术主要的提供商AD...

weixin_28799111的博客 1091

odoo19/18集成reportbro 打印插件 完美支持静默打印

ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。ReportBro Designer可以轻松集成到您的Web应用程序中。每个人都可以设计和编辑文档模板,并直接在浏览器中预览它们。可以使用服务器上的 (有关完整的文档和演示,请参阅上的ReportBro项目网站。reportBro官方没有提供。测试环境:odoo17社区版。2.产品标签打印设计。

zxltwins的博客 2774

软件可靠性测试与评价

本文系统介绍了软件可靠性工程的核心内容,包括可靠性概念、模型分类、测试方法和评价体系。重点解析了可靠性测试的三大步骤:定义运行剖面、设计测试用例和实施测试收集数据,并以智能安防系统为例说明具体应用。可靠性评价需结合业务场景,通过量化指标(MTBF、失效率等)和模型预测持续优化系统。文章强调可靠性需贯穿软件全生命周期,通过闭环反馈实现持续改进,为关键系统提供质量保障。

moton2017的博客 2050

Open3D 实现CSF布料模拟算法【2025最新版】

CSF布料模拟算法在open3d模块下的实现,博客长期更新,本文最近更新时间为:2025年1月16日。。

点云侠的博客 5749

SLAM 轨迹评估工具——EVO安装、使用介绍

evo是一款用于视觉里程计和SLAM问题的轨迹评估工具. 核心功能是能够绘制相机的轨迹, 或评估轨迹与真值之间的误差. 支持多种数据集的轨迹格式(TUM、KITTI、EuRoC MAV、ROS的bag), 同时支持这些数据格式之间的相互转换,本文轨迹展示以tum数据格式为例。

u010196944的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: Debian老手也不一定知道的/tmp空间管理技巧——解决Xsession报错与登录失败
下一篇: UE4关卡蓝图入门:5分钟学会引用Actor和添加事件(附实操截图)
vim8coder
博客等级 码龄1天 0粉丝 1693原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值