LV16-32-定时器-02-通用定时器-05-通用定时器脉冲计数

本文主要是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 固件(乐鑫官网)
乐鑫官方技术文档 这里是乐鑫官方技术文档的入口,文档都可以来这里找(乐鑫官网)

前面我们介绍了通用定时器的四类时钟源,这一节我们来学习使用通用定时器的外部时钟模式 1 这类时钟源。我们通过脉冲计数实验来学习。

一、需求说明

前面的三个通用定时器实验的时钟源都是来自内部时钟 (CK_INT),在脉冲计数的使用中我们将使用外部时钟模式 1:外部输入引脚 (TIx)作为定时器的时钟源。关于这个外部输入引脚(TIx),我们使用 WK_UP 按键按下产生的高电平脉冲作为定时器的计数器时钟,每按下一次按键产生一次高电平脉冲,计数器加一。

二、定时器资源说明

image-20240114104935667

外部时钟模式 1 的外部输入引脚只能是通道 1 或者通道 2 对应的 IO,通道 3或者通道 4 是不可以的。以通道 1 输入为例,外部时钟源信号通过通道 1 输入后,接下来我们用 TI1 表示该信号。 TI1 分别要经过滤波器、边沿检测器后,来到 TI1FP1,被触发输入选择器选择为触发源,接着来到从模式控制器。从模式选择为外部时钟模式 1,这时候外部时钟源信号就会到达时基单元的预分频器,后面就是经过分频后就作为计数器的计数时钟了。

如果想要时钟源信号的上升沿和下降沿,计数器都计数,可以选择 TI1F_ED 作为触发输入选择器的触发源。

假设计数器工作在递增计数模式,那么每来一个选择的边沿,计数器就加一。最后,外部时钟源信号的边沿计数个数会保存计数器寄存器中,我们只需要直接读取 CNT 的值即可。这里是没有考虑定时器溢出的情况,如果定时器溢出还需要对溢出进行处理。比如开启更新中断,定时器溢出后,在更新中断里,对溢出次数进行记录,然后用溢出次数乘以溢出一次计数的个数,再加上 CNT 现在的值,就可以得到总的计数个数了。

三、相关寄存器

通用定时器脉冲计数实验需要用到的寄存器有: TIMx_ARR、 TIMx_PSC、 TIMx_CCMR1、TIMx_CCER、 TIMx_DIER、 TIMx_CR1、 TIMx_EGR 这些寄存器在前面的笔记都有提到,在这里只需针对性的介绍。

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

该寄存器我们在 PWM 输出实验时讲解了他作为输出功能的配置,在输入捕获实验学习了输入捕获模式的配置,本小节我们的外部信号也同样要作为输入信号给定时器作为时钟源,所以我们要看输入捕获模式定时器对应功能。 WK_UP 按键(PA0)对应着定时器 2 的通道 1,这个可以在《 STM32中文数据手册 .pdf》 21 页找到。接下来我们开始配置TIMx_CCMR1 寄存器,其描述如图所示:

image-20240114105223458

用到定时器 2 的通道 1,所以要配置 TIM2_CCMR1 寄存器的位[7: 0],其中 CC1S[1:0],这两个位用于 CCR1 的通道配置,这里我们设置 IC1S[1:0]=01,也就是配置 IC1 映射在 TI1 上,即 CCR1 对应 TIMx_CH1。

输入捕获 1 预分频器 IC1PSC[1:0],我们是 1 次高电平脉冲就触发 1 次计数,所以不用分频选择 00 即可。

输入捕获 1 滤波器 IC1F[3:0],这个用来设置输入采样频率和数字滤波器长度,关于滤波长度的介绍请看上一个实验。这里,我们不做滤波处理,所以设置 IC1F[3:0]=0000,只要采集到上升沿,就触发捕获。

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

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

image-20240114105313372

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

3. 从模式控制寄存器(TIMx_ SMCR)

TIM2/TIM3/TIM4/TIM5 的从模式控制寄存器,该寄存器用于配置从模式,以及定时器的触发源相关的设置。 TIMx_SMCR 寄存器描述如图所示。

image-20240114105348916

因为我们要让外部引脚脉冲信号作为定时器的时钟源,所以位[2:0]我们设置的值是 111,即外部时钟模式 1。位[6:4]是触发选择设置, TIMx_CH1 对应 TI1FP1, TIMx_CH2 则对应 TI2FP2,我们是定时器通道 1,所以需要配置的值为 101。 ETF[3:0]和 ETPS[1:0]分别是外部触发滤波器和外部触发预分频器,我们没有用到。

2. 其他相关寄存器

DMA/中断使能寄存器: TIMx_DIER。脉冲计数功能需要用到定时器更新中断,在中断服务函数中累加定时器溢出的次数,所以需要使能定时器的更新中断,即 UIE 置 1。

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