STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数
一、脉冲计数实验原理

1、 外部时钟模式1:核心为蓝色部分的时基单元,时基单元的时钟源可以来自四种,分别是内部时钟PCLK、外部时钟模式1,外部时钟模式2、内部定时器触发(级联)。而脉冲计数就是使用外部时钟模式1和外部时钟模式2。
当使用外部时钟模式1的时候,输入信号主要来自定时器的通道1和通道2,然后通过信号TI1FP1和TI2FP2来到TRGI,然后经过从模式控制器来到时基单元。在从模式控制器里边的从模式选择外部时钟模式1,而外部时钟模式1实际上信号可以来自于TI1FP1、TI2FP2、TI1F_ED三种,其中TI1F_ED为双边沿检测,当来一个脉冲之后,无论是上升沿还是下降沿,TI1F_ED都有效,都会触发计数器计数,如果分频系数是1,一个脉冲会记两个数。而TI1FP1和TI2FP2只能是一种边沿,记一个信号。
分频系数为1时,直接读取计数器的值就是脉冲的个数。
2、外部时钟模式2:信号来自TIMx_ETR引脚,经过极性选择、边沿检测器、预分频器、输入滤波器,来到ETRF,设置从模式控制器模式为外部时钟模式2,然后来到时基单元。
例子:外部时钟模式1,信号配置成通道2输入。

设置SMS为111,外部时钟模式1,信号从定时器通道2来到TI2,然后首先经过滤波器,滤波器可以设置ICF进行设置。 然后设置边沿检测器,通过CC2P位来设置是上升沿还是下降沿有效,然后设置TRGI信号源,设置为110,信号来自TI2FP2,这块的设置跟输入捕获时候设置有些类似。
二、通用定时器脉冲计数实验配置步骤
1、HAL_TIM_IC_Init()函数,配置定时器基础工作参数。跟base_init函数一样。
2、HAL_TIM_IC_Msplnit()函数,配置NVIC、CLOCK、GPIO等。
3、HAL_TIM_SlaveConfigSynchro()函数,配置定时器从模式等。
4、HAL _TIM_IC_Start()函数,使能输入捕获并启动计数器。
5、__HAL_TIM_GET_COUNTERO()宏定义,获取计数器的值。
6、__HAL_TIM_SET_COUNTERO()宏定义,设置计数器的值。

三、通用定时器脉冲计数实验
实验:将定时器2通道1输入的高电平脉冲作为定时器2的时钟,并通过串口打印脉冲数,定时器2通道1为PA0 PA0接的按键 按下一次产生一个脉冲
1、寄存器配置版本
注意:在配置过程中PSC设置为1时,都正常,但是PSC设置的值不是1时,一定要软件产生更新事件,由于PSC有影子寄存器,实际起作用的是影子寄存器,不软件产生更新事件,PSC的值会在计数器溢出的时候进入影子寄存器。
在HAL库里边这个软件更新事件在初始化函数最后写了。

#include "./BSP/TIMER/TIM_IC.h"void TIM_IC_Init(void)
{//开启GPIOA时钟RCC->APB2ENR |= (1 << 2);//设置PA0为输入模式GPIOA ->CRL &= ~(0X03 << 0);//设置PA0为输入下拉GPIOA->CRL |= (1 << 3);GPIOA->CRL &= ~(1 << 2); //开启定时器2时钟RCC->APB1ENR |= (1 << 0);//设置分频系数PSCTIM2->PSC = 5;//开启ARR寄存器缓冲功能TIM2->CR1 |= (1 << 7);//设置计数器向上计数模式TIM2->CR1 &= ~(1 << 4);//设置TS位 为 101接TI1FP1TIM2->SMCR |= (1 << 6);TIM2->SMCR &= ~(1 << 5);TIM2->SMCR |= (1 << 4);//设置SMS为外输时钟模式1 111TIM2->SMCR |= 0X07;//设置输入滤波 IC1F 0000TIM2->CCMR1 &= ~(0X0F << 4); //设置CC1P 上升沿捕获TIM2->CCER &= ~(1 << 1);//设置ARR值为999 TIM2->ARR = 999;//使能计数器 CEN位TIM2->CR1 |= (1<< 0);//***********注意:重要****************//软件产生更新事件 使PSC的值立即生效 //由于PSC有影子寄存器 不软件产生更新事件 PSC的值会等到计数器溢出是才生效TIM2->EGR |= (1 << 0);
}
2、 库函数版本
tim_inCapture.h头文件程序
#ifndef __TIM_INCAPTURE_H
#define __TIM_INCAPTURE_H#include "stm32f1xx.h"void TIM_IC_Init(uint16_t psc,uint16_t arr);#endif
tim_inCapture.c源文件程序
#include "./BSP/TIMER/tim_inCapture.h"TIM_HandleTypeDef htim;void TIM_IC_Init(uint16_t psc,uint16_t arr)
{htim.Instance = TIM2;htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;htim.Init.CounterMode = TIM_COUNTERMODE_UP;htim.Init.Period = arr;htim.Init.Prescaler = psc;//定时器初始化 PSC ARR 计数模式 ARR缓冲功能HAL_TIM_IC_Init(&htim);TIM_SlaveConfigTypeDef sSlaveConfig = {0};//设置双边沿触发//sSlaveConfig.InputTrigger = TIM_TS_TI1F_ED;//设置单边沿触发sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; sSlaveConfig.TriggerFilter = 0X0;sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;//这个是输入分频的 这个在外部时钟模式1没有用 外部时钟模式2有分频 sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;//定时器从模式配置HAL_TIM_SlaveConfigSynchro(&htim, &sSlaveConfig);//启动定时器 HAL_TIM_IC_Start(&htim, TIM_CHANNEL_1);
}void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if(htim ->Instance == TIM2){//开启定时器2时钟__HAL_RCC_TIM2_CLK_ENABLE();//开启GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_Init;GPIO_Init.Mode = GPIO_MODE_INPUT;GPIO_Init.Pin = GPIO_PIN_0;GPIO_Init.Pull = GPIO_PULLDOWN;GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;//速度是输出用的 可以不设置//初始化PA0为下拉输入HAL_GPIO_Init(GPIOA, &GPIO_Init); }
}
main,c主函数程序
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/TIMER/tim_inCapture.h"uint8_t count = 0;//捕获高电平完成
int main(void)
{HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */led_Init(); /* LED初始化 */usart_init(115200);TIM_IC_Init(0 ,999);while(1){ LED0(1);LED1(0);delay_ms(500);LED0(0);LED1(1);delay_ms(500);count = TIM2->CNT;printf("脉冲个数:%d\r\n",count);}
}
相关文章:
STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数
一、脉冲计数实验原理 1、 外部时钟模式1:核心为蓝色部分的时基单元,时基单元的时钟源可以来自四种,分别是内部时钟PCLK、外部时钟模式1,外部时钟模式2、内部定时器触发(级联)。而脉冲计数就是使用外部时钟…...
动态规划LeetCode-121.买卖股票的最佳时机1
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...
网安三剑客:DNS、CDN、VPN
DNS(网络地址转换系统)的技术原理与安全应用 1. 网络地址转换系统的基本原理 DNS通过解析用户的访问URL(超链接),将其映射到服务器上存储的信息。具体来说: 解析URL:DNS从URL中提取出 hostna…...
Linux在x86环境下制作ARM镜像包
在x86环境下制作ARM镜像包(如qemu.docker),可以通过QEMU和Docker的结合来实现。以下是详细的步骤: 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件,用于在非目标架构上运行目标架构的二进制文…...
Vue3+codemirror6实现公式(规则)编辑器
实现截图 实现/带实现功能 插入标签 插入公式 提示补全 公式验证 公式计算 需要的依赖 "codemirror/autocomplete": "^6.18.4","codemirror/lang-javascript": "^6.2.2","codemirror/state": "^6.5.2","cod…...
Lua中文语言编程源码-第十一节,其它小改动汉化过程
__tostring 汉化过程 liolib.c metameth[] {"__转换为字符串", f_tostring}, lauxlib.c luaL_callmeta(L, idx, "__转换为字符串") lua.c luaL_callmeta(L, 1, "__转换为字符串") __len 汉化过程 ltm.c luaT_eventname[] ltablib.c c…...
Safari常用快捷键
一、书签边栏 1、显示或隐藏书签边栏:Control-Command-1 2、选择下一个书签或文件夹:向上头键或向下头键 3、打开所选书签:空格键 4、打开所选文件夹:空格键或右箭头键 5、关闭所选文件夹:空格键或左箭头键 6、更…...
Git登录并解决 CAPTCHA
修改公司域账户密码之后,导致今天pull代码时显示:remote error: CAPTCHA required 本文将介绍如何解决 Git 中的常见错误“fatal: Authentication failed for git”。该问题通常出现在尝试访问远程 Git 仓库时,表示身份验证失败。以下是几种常…...
Websocket从原理到实战
引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议,它使得客户端和服务器之间能够进行实时、双向的通信,既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数
声明 就在 main函数所在的 nginx.c 中: static ngx_int_t ngx_get_options(int argc, char *const *argv); 实现 static ngx_int_t ngx_get_options(int argc, char *const *argv) {u_char *p;ngx_int_t i;for (i 1; i < argc; i) {p (u_char *) argv[i]…...
判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0
要判断您的Mac当前使用的是Zsh还是Bash,可以使用以下方法: 查看默认Shell: 打开“终端”应用程序,然后输入以下命令: echo $SHELL这将显示当前默认使用的Shell。例如,如果输出是/bin/zsh,则说明您使用的是Z…...
Centos执行yum命令报错
错误描述 错误:为仓库 ‘appstream’ 下载元数据失败 : Cannot prepare internal mirrorlist: Curl error (6): Couldn’t resolve host name for http://mirrorlist.centos.org/?release8&archx86_64&repoAppStream&infrastock [Could not resolve h…...
订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能
如何使用redis实现订单超时实时关闭功能 准备工作实现步骤解释注意事项(重点) 使用Redis实现订单超时实时关闭功能,可以利用Redis的延时队列(使用Sorted Set实现)和过期键(使用TTL和Keyspace Notifications…...
485网关数据收发测试
目录 1.UDP SERVER数据收发测试 使用产品: || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A(TX)连接RX B(RX)连接TX 打开1个网络调试助手,模拟用户的UDP客户端设…...
RabbitMQ快速上手及入门
概念 概念: publisher:生产者,也就是发送消息的一方 consumer:消费者,也就是消费消息的一方 queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理 exchang…...
4种架构的定义和关联
文章目录 **1. 各架构的定义****业务架构(Business Architecture)****应用架构(Application Architecture)****数据架构(Data Architecture)****技术架构(Technology Architecture)*…...
109,【1】攻防世界 web 题目名称-文件包含
进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数,同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法,错误的方法 filename./check.php 还是一样的回显 傻了,题目名称是文件包含,需要用到…...
leetcode90 子集II
1. 题意 给一个可能含有重复元素的数组,求这个数组的所有子集。 2. 题解 跟leetcode 72 子集的差别在于,我们需要将重复的元素给去掉。那如何去重呢,实际上我们可以先排序将重复的元素给放在一起。然后在回溯后,找到下一个不与…...
DeepSeek模型构建与训练
在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...
PyTorch torch.unbind、torch.split 和 torch.chunk函数介绍
pytorch中 torch.unbind、torch.split 和 torch.chunk等函数可用于张量的拆分操作。 1. torch.unbind 功能说明: torch.unbind 沿指定的维度将张量“解包”为多个张量,返回一个元组。解包后被操作的那个维度会消失,每个输出张量的维度数会比…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
