STM32 --通用定时器输入捕获功能

2023-11-19

问题:

开始的时候没有搞清楚 定时器时基定时器溢出中断的概念,导致在计算频率的时候一直有问题。

开始并没有怀疑是配置有问题,因为之前接触过定时器输入捕获功能,靠着自己的记忆配置了一下,认为 捕获功能 的定时是通过定时器设置的定时溢出频率来计算的(真心抽自己两巴掌)。结果导致问题的发生。

真的是这些东西最好是通过博客的方式记录下来,方便自己,方便他人。

现在让我们重新回顾一下这个功能:通用定时器输入捕获。

内部定时器结构

STM32定时器系列 - STM32常规定时器时基与时钟源 这篇博文中,我们讲述过,定时器的结构。

其实我们只需要看这张图就可以了:
在这里插入图片描述
看流程的走向,由 时钟源 提供时钟 到 时间基(一般时钟源都是选择内部的CLK)
在这里插入图片描述
这里需要注意的就是看定时器时挂在那个总线下的,APB1 与 APB2 CLK不一样。

然后流向 输入捕获 的只有 PSC(预分配器) 并没有 重装载寄存器,因此,采样的频率就是定时器经过预分配器之后的频率,与重装载无关。

输入捕获【Input Capture】基本原理

定时器针对外部输入信号或者内部触发信号实现"边沿捕获";产生捕捉事件,并可以触发中断或者DMA请求,同时记录捕捉时刻计数器的值,基于这个原理,配合计数器实时计数器功能可以对捕捉信号进行脉冲宽度的测量,进而实现对周期性波形测量其周期与占空比,或者用来做通信解码(红外通信解码)。
在这里插入图片描述
具体到我们的定时器,输入捕获的功能主要是靠捕获比较单元来实现。输入捕获模式下:当捕获单元捕获到外来有效信号边沿事件【上升沿或者下降沿】,将此刻计数器的值锁存到CCR影子寄存器并自动将CCR影子寄存器的值拷贝进CCR预装寄存器,以供用户读取。

关于CCR寄存器,它是由影子寄存器与预装寄存器组成,带预装使能控制位。在输入模式下,此时CCR对用户是只读的,不可对其修改、赋值。

外部输入信号作为输入捕获信号,往往需要经过如下几个阶段:一般经过滤波,边沿检测,极性选择,捕获信号选择,捕获信号分频,最终进入捕获功能模块从而实现输入捕获。其中边沿检测、极性选择确定捕获单元对捕获信号的捕获极性,即捕获上升沿还是下降沿,甚至双边沿。

捕获信号选择是指:对输入捕获信号的信号进行选择,即前面提到过的作为捕获信号的信号源有两大类;
捕获信号分频是指对将被用作捕获信号的信号进行分频,比如2分频,3分频等,分频之后送到捕获功能模块去完成输入捕获。
(这里如果输入信号频率大于采样频率就可以采用捕获信号分频的方法降低信号频率,达到可以采集的目标,计算结果后,在乘以分频系数)

外部输入信号的滤波

为了防止因为输入信号上的噪声或边沿抖动而导致误计数、误触发,我们可以针对外部输入信号进行合适的滤波。

用户要做的就是针对输入信号具体情况【频率、噪声等】,通过寄存器配置适当的滤波参数,选择适当采样时钟和采样次数,其它事情交给定时器硬件去处理。这样也可以减少因为做滤波而导致的软件开销。
在这里插入图片描述
在这里插入图片描述
假设我们让定时器对某输入通道的信号进行捕捉,捕捉极性为上升沿。设置滤波的采样时钟与定时器内部时钟频率一致,采样次数为4次。则每当捕捉到上升沿时,硬件连续根据采样频率来采样4次【包括发生捕捉触发沿的那一次】。如果4次采样结果均为高电平,则此次触发有效。并可以产生触发事件,该事件可以触发中断或DMA请求,同时捕捉单元将此刻计数器的值放入到捕捉比较寄存器CCR中。

当然,如果捕捉到触发边沿后,没法做到连续4次采样均为高电平,则该触发无效,将会被丢弃。这样达到滤除噪声的目的。

内部触发输入信号【ITRx】作为输入捕获信号

在这里插入图片描述
在这里插入图片描述

与输入捕获相关的事件

  1. 捕获时刻的计数器值锁存到对应捕获通道的CCRx寄存器。
  2. 对应通道的捕获事件/中断会被置位;【CCxIF@TIMx_SR】
  3. 如果允许了捕获中断或者DMA请求,可以触发中断或者DMA请求。取决于【CCxIE/CCxDE@TIMx_DIER】配置。
  4. 如果运行连续捕获事件,前一次没有清零的话会置位【CCxOF@TIMx_SR】
  5. 对于CCxIF标志可以软件清零或者读取CCR来清零。
  6. 可以通过设置位【CCxG@TIMx_EGR】来软件触发输入捕获事件。

与输入捕获相关的事件主要就这些,我们要做到心中有数。只要了解它们后,在我们的定时器的实际应用中才能灵活使用它们,实现我们需要的功能。如在发生输入捕获事件时,利用相关中断或DMA请求实现其它功能,比如做数据的更新、ADC的启动、其它定时器的启动等等。

通过输入捕获测量脉冲周期

在输入捕捉模式下,定时器可用于测量外部信号周期。根据定时器时钟、预分频器和定时器分辨率,可推导出最大测量周期。

相应的定时器配置包括:

  1. 通过对CCMRx 寄存器中的 CCxS 位选择有效输入。
  2. 根据需要,通过对 CCMRx 寄存器中的 IC1F[3:0] 位执行操作以编程滤波器参数,并通过对IC1PSC[1:0] 位执行写操作以编程预分频器。
  3. 通过对 CCxNP/CCxP 位执行写操作选择极性,即选择上升沿触发、下降沿触发或边沿触发。

当输入通道检测到相应的信号发生跳变时,可使用输入捕捉模块进行捕捉。要获取外部信号周期,需连续进行两次捕捉,通过将两次捕捉到的值相减可计算得到周期。

对于单沿捕捉,计数器采用向上计数模式,待测信号不长于计数器的计数周期时:

假设两次连续捕捉值为 CCRx_tn 和 CCRx_tn+1
● 如果 CCRx_tn < CCRx_tn+1:捕捉宽度= CCRx_tn+1 - CCRx_tn
● 如果 CCRx_tn > CCRx_tn+1:捕捉宽度= (ARR_max - CCRx_tn) + CCRx_tn+1

如果待测信号周期长于当前计数器周期的话,需要考虑溢出问题。实际应用中有时因为忽略了这点而导致测试不正确。

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

STM32 --通用定时器输入捕获功能 的相关文章

  • 如何在 Cortex-M3 (STM32) 上从 RAM 执行函数?

    我正在尝试从 Cortex M3 处理器 STM32 上的 RAM 执行函数 该函数会擦除并重写内部闪存 所以我肯定需要在 RAM 中 但我该怎么做呢 我尝试过的是 使用 memcpy 将函数复制到 RAM 中的字节数组 检查它是否正确对齐
  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • Unity 使用Photon Server 联网开发(二)游戏同步+房间列表

    photon联机的配置 直接去官网下载Pun的资源包导入项目 设置PhotonServerSettings配置文件 配置appid 通讯协议 服务器地址 端口号 服务器地址可以配置成自己本地服务器 云服务器 直接使用photon服务器 也可
  • 吕聪贤SwiSHmax中文视频教程打包下载(连接已失效)

    教程介绍 SwiSHmax是Flash编辑工具 SwiSHzone家族的新成员 假如您想要不使用Flash来制作强大或令人惊叹的动画 SwiSHmax是您最佳的选择 SwiSHmax操作方便 您将可轻易的在短时间内制作出复杂的文本 图像 图
  • HashTable HashMap ConcurrentHashMap 的介绍以及区别

    目录 今日良言 投资自己才是最好的投资 一 HashMap 二 HashTable 三 ConcurrentHashMap 四 三者的区别 今日良言 投资自己才是最好的投资 这篇博客主要介绍的是 HashTable HashMap Conc
  • 计算机图形学 3D渲染 笔记(一)

    1 坐标系 大多数计算机屏幕采用的坐标系是以左上角为原点 水平 右 为x轴 纵向 下 为y轴 3D图形学习中通常使用另一种坐标系 即 正中心为原点 水平 右 为x轴 纵向 上 为y轴 当前者坐标系转化到后者 需要进行简单的转化 Sx Sy为
  • IDEA2021.2安装与配置(持续更新)

    IDEA2021 2安装与配置 持续更新 一 下载 二 安装 三 配置 3 1 配置全局生效 3 2 首次启动 3 3 激活 3 4 字体 字体大小 3 5 配色方案 3 6 注解生效 3 7 自动导包移包 3 8 自动补全快捷键 3 9
  • vue-nginx刷新404问题

    文章目录 1 背景介绍 2 问题描述 2 1 问题一 2 2 问题二 3 原因分析 3 1 问题一 3 2 问题二 4 排查问题一原因 5 反思 6 nginx root与alias的使用 7 更优雅地解决vue网页浏览器刷新404 7 1
  • Mongodb——使用Mongodb对字段中字符串内容进行截取,并进行分组统计

    最近忙的厉害 除了发一发之前写的存货只能写一些简单的东西了 这里就简单分享下最近遇见针对数据进行指标统计遇见的问题 针对字段中某部分内容的指标统计 在使用mongodb进行指标统计的时候可能遇见下面的数据结构 1 id ObjectId 5
  • 短信备份到另一个手机android,旧手机的短信怎么转移到新手机上?三种方法总有一种适合你...

    手机短信一直以来都是我们和其他对象传输信息的工具 更是存储了大量重要的信息 如果我们更换手机需要保留下来这些短信该怎么办呢 有没有什么方法可以将这些短信转移到新手机中去 或者导出到电脑上进行保管呢 这里有三种方法 第一种方法用内存卡 可以打
  • C++仿函数

    1 仿函数的定义 仿函数简单说就是在类中定义的特殊函数 没有函数名 或者说函数名统一为 operation 或者可以认为是重载运算符 格式为 返回类型 operator 参数列表 定义了仿函数的对象 可以直接通过下面格式调用仿函数 对象名
  • 异步加载vue组件

    什么时候使用 组件较大 或者不是必用的 通常组件在script标签对中导入 而异步组件在component中使用 例如 components ForData gt import view Fordata
  • J2EE集合框架

    1 UML 二 集合的基本特点 list集合的特点 增删改查 有序 可重复 三 List集合的三种遍历方式 for foreath iterator 四 ArrayList LinkedList 的比较与分析 比较 1 ArrayList
  • 基于Matlab的灰狼算法优化LSTM风电功率预测

    基于Matlab的灰狼算法优化LSTM风电功率预测 随着可再生能源的快速发展 风能作为一种重要的清洁能源形式变得越来越受关注 风电功率预测在风电场的运营和调度中起着关键作用 然而 由于风速的不稳定性和不确定性 精确地预测风电功率仍然具有一定
  • SpringCloud Gateway:status: 503 error: Service Unavailable

    使用SpringCloud Gateway路由请求时 出现如下错误 yml配置如下 可能的一种原因是 yml配置了gateway discovery locator enabled true 此时gateway会使用负载均衡模式路由请求 但
  • Lim接口测试平台-接口测试功能详解

    一 接口测试 项目地址 Gitee Github 接口测试模块是整个Lim平台的核心 左侧是接口的模块树 右侧顶部是用例操作功能区 列表展示接口用例信息 文章目录 一 接口测试 二 维护接口用例 各步骤类型详解 1 执行步骤 1 接口步骤
  • Unity --- 触摸方法,以及灯光与烘培的使用

    触摸方法 1 首先触摸分为两大类 多点触摸和单点触摸 这两种方式的触摸通过下面这个触摸数来进行判断 当其等于1的时候 为单点触摸 当其大于1的时候为多点触摸 2 当我们在调用触摸方法的时候我们首先需要打开对应的多点 单点触摸 上面这个是开启
  • QObject的d_ptr成员——箭头符号的重载

    QObject中的d ptr是这样定义的 QScopedPointer
  • vscode cmake 编译32位程序

    vscode cmake 编译32位程序 为什么要用cmake vscode中的C C 插件直接支持的只是最简单的单文件编译 运行和调试 要管理大的项目 或者生成库 C C 插件不能直接支持 需要开发者利用vscode的task功能 结合脚
  • 【由浅入深】爬虫技术,值得收藏,来了解一下~

    爬虫技术 来了解一下 一 为什么需要爬虫技术 现在的互联网来说 包含着各种海量的信息 无孔不入 包罗万象 出于数据分析或产品需求 我们需要从某些网站 提取出我们感兴趣 有价值的内容 我们需要一种能自动获取网页内容并可以按照指定规则提取相应内
  • 关于两数交换的两种方法

    目录 前言 一 引入变量 这个方法也是最常用的方法 二 通过使用数学的方法相加或者相减从而得到两数运算 这种方法不常见 总结 前言 从键盘输入两个整数 并交换两位数字 这里小编用两种方法告诉大家 注意小编这里用的是VS2019 所以在代码的
  • STM32 --通用定时器输入捕获功能

    问题 开始的时候没有搞清楚 定时器时基 于 定时器溢出中断的概念 导致在计算频率的时候一直有问题 开始并没有怀疑是配置有问题 因为之前接触过定时器输入捕获功能 靠着自己的记忆配置了一下 认为 捕获功能 的定时是通过定时器设置的定时溢出频率来