LV16-32-定时器-02-通用定时器-04-通用定时器输入捕获

本文主要是STM32开发——定时器 通用定时器 的输入捕获 相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
开发板 正点原子 i.MX6ULL Linux阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
STM32开发板 正点原子战舰V3(STM32F103ZET6)
点击查看本文参考资料
  • 通用
分类 网址说明
官方网站https://www.arm.com/ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.st.com/content/st_com/zh.htmlST官方网站,在这里我们可以找到STM32的相关文档
https://www.stmcu.com.cn/意法半导体ST中文官方网站,在这里我们可以找到STM32的相关中文参考文档
http://elm-chan.org/fsw/ff/00index_e.htmlFatFs文件系统官网
教程书籍《ARM Cortex-M3权威指南》ARM公司专家Joseph Yiu(姚文祥)的力作,中文翻译是NXP的宋岩
《ARM Cortex-M0权威指南》
《ARM Cortex-M3与Cortex-M4权威指南》
开发论坛http://47.111.11.73/forum.php开源电子网,正点原子的资料下载及问题讨论论坛
https://www.firebbs.cn/forum.php国内Kinetis开发板-野火/秉火(刘火良)主持的论坛,现也做STM32和i.MX RT
https://www.amobbs.com/index.php阿莫(莫进明)主持的论坛,号称国内最早最火的电子论坛,以交流Atmel AVR系列单片机起家,现已拓展到嵌入式全平台,其STM32系列帖子有70W+。
http://download.100ask.net/index.html韦东山嵌入式资料中心,有些STM32和linux的相关资料也可以来这里找。
博客参考http://www.openedv.com/开源网-原子哥个人博客
http://blog.chinaaet.com/jihceng0622博主是原Freescale现NXP的现场应用工程师
cortex-m-resources这其实并不算是一个博客,这是ARM公司专家Joseph Yiu收集整理的所有对开发者有用的官方Cortex-M资料链接(也包含极少数外部资源链接)
点击查看相关文件下载
分类 网址 说明
STM32相关 STM32F103xx英文数据手册 STM32F103xC/D/E系列的英文数据手册
STM32F103xx中文数据手册 STM32F103xC/D/E系列的中文数据手册
STM32F10xxx英文参考手册(RM0008) STM32F10xxx系列的英文参考手册
STM32F10xxx中文参考手册(RM0008) STM32F10xxx系列的中文参考手册
Arm Cortex-M3 处理器技术参考手册-英文版 Cortex-M3技术参考手册-英文版
STM32F10xxx Cortex-M3编程手册-英文版(PM0056) STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版
STM32 HAL库开发实战 野火STM32开发教程在线文档——基于F103系列开发板
STM32库开发实战指南 野火STM32开发教程在线文档——基于野火霸道开发板
SD卡相关 SD卡相关资料——最新版本 有关SD卡的一些资料可以从这里下载
SD卡相关资料——历史版本 有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议
SD 2.0 协议标准完整版 这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看
ESP32 SD卡相关资料——最新版本 这个⼿册介绍了 ESP8266EX 的产品参数。
ESP8266 系列入门教程 一个入门手册(安信可官网)
ESP8266 AT 指令集 这是一篇关于ESSP8266的AT指令集的文档(安信可官网)
ESP8266 AT 指令使用实例 这是一篇关于ESSP8266的AT指令集使用实例的文档(安信可官网)
ESP-AT 用户指南 本指南详细介绍 ESP-AT 是什么、如何连接硬件、以及如何下载和烧录 AT 固件(乐鑫官网)
乐鑫官方技术文档 这里是乐鑫官方技术文档的入口,文档都可以来这里找(乐鑫官网)

一、脉宽测量基本原理

输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来说明输入捕获脉宽测量原理:

image-20240114103053113

t1 到 t2 的时间段,就是我们需要测量的高电平时间。测量方法如下:假如定时器工作在递增计数模式,首先设置定时器通道 x 为上升沿捕获,这样在 t1 时刻上升沿到来时,就会发生捕获事件。这里我们还会打开捕获中断,所以捕获事件发生就意味着捕获中断也会发生。在捕获中断里将计数器值清零,并设置通道 x 为下降沿捕获,这样 t2 时刻下降沿到来时, 就会发生捕获事件和捕获中断。捕获事件发生时,计数器的值会被锁存到捕获/比较寄存器中(比如通道 1 对应的是 CCR1 寄存器)。那么在捕获中断里,我们读取捕获/比较寄存器就可以获取到高电平脉冲时间内,计数器计数的个数,从而可以算出高电平脉冲的时间。这里是假设定时器没有溢出为前提的。

实际上, t1 到 t2 时间段,定时器可能会产生 N 次溢出,这就需要我们对定时器溢出做相应的处理,防止高电平太长,导致测量出错。在 t1 到 t2 时间段,假设定时器溢出 N 次,那么高电平脉冲时间内,计数器计数的个数计算方法为: N*(ARR+1) + CCRx2, CCRx2 表示 t2 时间点,捕获/比较寄存器的值。经过计算得到高电平脉宽时间内计数器计数个数后,用这个个数乘以计数器的计数周期,就可得到高电平持续的时间。就是输入捕获测量高电平脉宽时间的整个过程。

STM32F103 的定时器除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。输入捕获,简单的说就是通过检测 TIMx_CHy 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)时,会发生捕获事件,将当前定时器的值( TIMx_CNT)锁存到对应通道的捕获/比较寄存器(TIMx_CCRy)里,完成一次捕获。同时还可以配置捕获事件发生时是否触发捕获中断/DMA。另外还要考虑测量的过程中是否可能发生定时器溢出,如果可能溢出,还要做溢出处理。

二、相关寄存器

通用定时器输入捕获实验需要用到的寄存器有: TIMx_ARR、 TIMx_PSC、 TIMx_CCMR1、TIMx_CCER、 TIMx_DIER、 TIMx_CR1、 TIMx_CCR1 这些寄存器在前面的笔记都有提到,在这里只需针对性的说明。

1. 捕获/比较模式寄存器 1/2(TIMx_CCMR1/2)

该寄存器我们在 PWM 输出实验时讲解了它作为输出功能的配置,现在重点学习输入捕获模式的配置。因为本实验我们用到定时器 5 通道 1 输入,所以我们要看 TIMx_CCMR1 寄存器,其描述如图:

image-20240114103419290

该寄存器在输入模式和输出模式下,功能是不一样, 所以需要看准不同模式的描述,可以打开手册查看。 TIMx_CCMR1 寄存器对应于通道 1 和通道 2 的设置, CCMR2 寄存器对应通道 3和通道 4。如: TIMx_CCMR1 寄存器位[7: 0]用于捕获/比较通道 1 的控制,而位[15: 8]则用于捕获/比较通道 2 的控制。我们用到定时器 5 通道 1 输入,所以需要配置 TIMx_CCMR1 的位[7:0]。

其中 CC1S[1:0],这两个位用于 CCR1 的通道配置,这里我们设置 IC1S[1:0]=01,也就是配置 IC1 映射在 TI1 上。

输入捕获 1 预分频器 IC1PSC[1:0],这个比较好理解。我们是 1 次边沿就触发 1 次捕获,所以选择 00 就行了。

输入捕获 1 滤波器 IC1F[3:0],这个用来设置输入采样频率和数字滤波器长度。其中, fCK_INT是定时器时钟源频率,按照例程的配置为 72Mhz,而 fDTS 则是根据 TIMx_CR1 的 CKD[1:0]的设置来确定的,如果 CKD[1:0]设置为 00,那么 fDTS=fCK_INT。 N 值采样次数,举个简单的例子:假设 IC1F[3:0]=0011,并设置 IC1 映射到 TI1 上。表示以 fCK_INT 为采样频率,当连续 8 次都是采样到 TI1 为高电平或者低电平,滤波器才输出一个有效输出边沿。当 8 次采样中有高有低,那就保持原来的输出,这样可以滤除高频干扰信号,从而达到滤波的效果。这里,我们不做滤波处理,所以设置 IC1F[3:0]=0000。

2. 捕获/比较使能寄存器(TIMx_CCER)

TIM2/TIM3/TIM4/TIM5 的捕获/比较使能寄存器,该寄存器控制着各个输入输出通道的开关和极性。 TIMx_CCER 寄存器描述如图:

image-20240114104518575

我们要用到这个寄存器的最低 2 位, CC1E 和 CC1P 位。要使能输入捕获,必须设置 CC1E=1,而 CC1P 则根据自己的需要来配置。我们这里是保留默认设置值 0,即高电平触发捕获。

3. 其他几个寄存器

DMA/中断使能寄存器: TIMx_DIER,该寄存器在前面已经了解过了,具体可以看手册。对于输入捕获功能,我们需要用到中断来处理捕获数据,所以必须开启通道 1 的捕获比较中断,即 CC1IE 设置为 1。同时我们还需要在定时器溢出中断中累计定时器溢出的次数,所以还需要使能定时器的更新中断,即 UIE 置 1。

控制寄存器: TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的。

捕获/比较寄存器 1: TIMx_CCR1,该寄存器用来存储发生捕获事件时,TIMx_CNT 的值,我们从 TIMx_CCR1 就可以读出通道 1 捕获事件发生时刻的 TIMx_CNT 值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度(注意,对于高电平脉宽太长的情况,还要计算定时器溢出的次数)。