当前位置: 首页 > news >正文

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&#xff1a;核心为蓝色部分的时基单元&#xff0c;时基单元的时钟源可以来自四种&#xff0c;分别是内部时钟PCLK、外部时钟模式1&#xff0c;外部时钟模式2、内部定时器触发&#xff08;级联&#xff09;。而脉冲计数就是使用外部时钟…...

动态规划LeetCode-121.买卖股票的最佳时机1

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...

网安三剑客:DNS、CDN、VPN

DNS&#xff08;网络地址转换系统&#xff09;的技术原理与安全应用 1. 网络地址转换系统的基本原理 DNS通过解析用户的访问URL&#xff08;超链接&#xff09;&#xff0c;将其映射到服务器上存储的信息。具体来说&#xff1a; 解析URL&#xff1a;DNS从URL中提取出 hostna…...

Linux在x86环境下制作ARM镜像包

在x86环境下制作ARM镜像包&#xff08;如qemu.docker&#xff09;&#xff0c;可以通过QEMU和Docker的结合来实现。以下是详细的步骤&#xff1a; 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件&#xff0c;用于在非目标架构上运行目标架构的二进制文…...

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、显示或隐藏书签边栏&#xff1a;Control-Command-1 2、选择下一个书签或文件夹&#xff1a;向上头键或向下头键 3、打开所选书签&#xff1a;空格键 4、打开所选文件夹&#xff1a;空格键或右箭头键 5、关闭所选文件夹&#xff1a;空格键或左箭头键 6、更…...

Git登录并解决 CAPTCHA

修改公司域账户密码之后&#xff0c;导致今天pull代码时显示&#xff1a;remote error: CAPTCHA required 本文将介绍如何解决 Git 中的常见错误“fatal: Authentication failed for git”。该问题通常出现在尝试访问远程 Git 仓库时&#xff0c;表示身份验证失败。以下是几种常…...

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数

声明 就在 main函数所在的 nginx.c 中&#xff1a; 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&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…...

Centos执行yum命令报错

错误描述 错误&#xff1a;为仓库 ‘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实现订单超时实时关闭功能 准备工作实现步骤解释注意事项&#xff08;重点&#xff09; 使用Redis实现订单超时实时关闭功能&#xff0c;可以利用Redis的延时队列&#xff08;使用Sorted Set实现&#xff09;和过期键&#xff08;使用TTL和Keyspace Notifications…...

485网关数据收发测试

目录 1.UDP SERVER数据收发测试 使用产品&#xff1a; || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A&#xff08;TX&#xff09;连接RX B&#xff08;RX&#xff09;连接TX 打开1个网络调试助手&#xff0c;模拟用户的UDP客户端设…...

RabbitMQ快速上手及入门

概念 概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchang…...

4种架构的定义和关联

文章目录 **1. 各架构的定义****业务架构&#xff08;Business Architecture&#xff09;****应用架构&#xff08;Application Architecture&#xff09;****数据架构&#xff08;Data Architecture&#xff09;****技术架构&#xff08;Technology Architecture&#xff09;*…...

109,【1】攻防世界 web 题目名称-文件包含

进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数&#xff0c;同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法&#xff0c;错误的方法 filename./check.php 还是一样的回显 傻了&#xff0c;题目名称是文件包含&#xff0c;需要用到…...

leetcode90 子集II

1. 题意 给一个可能含有重复元素的数组&#xff0c;求这个数组的所有子集。 2. 题解 跟leetcode 72 子集的差别在于&#xff0c;我们需要将重复的元素给去掉。那如何去重呢&#xff0c;实际上我们可以先排序将重复的元素给放在一起。然后在回溯后&#xff0c;找到下一个不与…...

DeepSeek模型构建与训练

在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...

PyTorch torch.unbind、torch.split 和 torch.chunk函数介绍

pytorch中 torch.unbind、torch.split 和 torch.chunk等函数可用于张量的拆分操作。 1. torch.unbind 功能说明&#xff1a; torch.unbind 沿指定的维度将张量“解包”为多个张量&#xff0c;返回一个元组。解包后被操作的那个维度会消失&#xff0c;每个输出张量的维度数会比…...

LSMO薄膜金属-绝缘体相变及其随机性应用研究

1. 理解LSMO薄膜中的随机性现象La0.67Sr0.33MnO3&#xff08;LSMO&#xff09;是一种典型的强关联电子体系材料&#xff0c;其独特的金属-绝缘体相变&#xff08;MIT&#xff09;特性为开发新型计算范式提供了物理基础。这种材料在相变临界区域表现出的随机性行为&#xff0c;源…...

Perplexity搜索响应延迟超800ms?紧急修复手册:从LLM路由策略到本地缓存穿透的5层优化路径

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity搜索响应延迟超800ms&#xff1f;紧急修复手册&#xff1a;从LLM路由策略到本地缓存穿透的5层优化路径 当Perplexity风格的语义搜索接口P95延迟持续突破800ms&#xff0c;用户会感知明显卡顿…...

AI智能体信用评分系统:构建可评估、可管理的多智能体协作框架

1. 项目概述&#xff1a;一个为AI智能体设计的信用评分系统最近在折腾AI智能体&#xff08;Agent&#xff09;的落地应用时&#xff0c;我遇到了一个挺有意思的问题&#xff1a;当多个智能体协同工作&#xff0c;或者一个智能体需要调用外部工具、API时&#xff0c;如何评估和追…...

7种智能提取方案深度解析:网盘直链下载助手的跨平台文件管理革命

7种智能提取方案深度解析&#xff1a;网盘直链下载助手的跨平台文件管理革命 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云…...

DLSS Swapper完全指南:3步轻松优化游戏性能的终极方案

DLSS Swapper完全指南&#xff1a;3步轻松优化游戏性能的终极方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的智能工具&#xff0c;能够自动管理、下载和替换游戏中的DLSS、F…...

KMS_VL_ALL_AIO智能激活脚本:5分钟搞定Windows和Office永久激活的终极方案

KMS_VL_ALL_AIO智能激活脚本&#xff1a;5分钟搞定Windows和Office永久激活的终极方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活和Office办公软件授权而烦恼吗&…...

DroidCam OBS插件终极指南:3分钟将手机变身高清直播摄像头

DroidCam OBS插件终极指南&#xff1a;3分钟将手机变身高清直播摄像头 【免费下载链接】droidcam-obs-plugin DroidCam OBS Source 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam-obs-plugin DroidCam OBS插件是一款免费开源工具&#xff0c;它能让你的智能手机…...

HarmonyOS 6 CustomDialog 嵌套弹窗使用文档

文章目录完整代码弹窗嵌套结构1. 弹窗层级关系2. 嵌套实现关键逻辑核心参数与API1. CustomDialog 装饰器2. CustomDialogController 弹窗控制器3. 关闭拦截 onWillDismiss4. 数据双向绑定 Link5. 生命周期管理总结完整代码 // xxx.ets CustomDialog struct CustomDialogExampl…...

从控制台账单看使用 Taotoken token plan 带来的实际节省

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从控制台账单看使用 Taotoken token plan 带来的实际节省 在管理大模型 API 调用成本时&#xff0c;除了关注模型单价&#xff0c;…...

Obsidian Importer:一站式笔记数据迁移终极指南

Obsidian Importer&#xff1a;一站式笔记数据迁移终极指南 【免费下载链接】obsidian-importer Obsidian Importer lets you import notes from other apps and file formats into your Obsidian vault. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-importer …...