正点原子-STM32通用定时器学习笔记(1)

目录

1. 通用定时器简介(F1为例)

2. 通用定时器框图

①时钟源

②控制器

③时基单元

④输入捕获

⑤捕获/比较(公共)

⑥输出比较

3.时钟源配置

3.1 计数器时钟源寄存器设置方法

3.2 外部时钟模式1

3.3 外部时钟模式2

3.4 定时器级联

4. 通用定时器中断实验


1. 通用定时器简介(F1为例)

F1系列通用定时器有4个,TIM2/TIM3/TIM4/TIM5

主要特性:

16位递增、递减、中心对齐计数器(计数值:0~65535);

16位预分频器(分频系数:1~65536);

可用于触发DAC、ADC;

更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求;

4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式;

使用外部信号控制定时器且可实现多个定时器级联的同步电路(用一个定时器的溢出事件作为下一个定时器的时钟源驱动计数器计数);

支持编码器和霍尔传感器电路等(用于电机)。

2. 通用定时器框图

定时器的核心是③时基单元,不管是通用定时器还是高级定时器,都是在时基单元的基础上拓展出来的

将通用定时器分为六部分来一一介绍:

①时钟源

通用定时器的时钟源有4类

第一类 内部时钟(CK_INT),来自外设总线APB提供的时钟。

第二类 内部触发输入(ITR0~ITR1)。

第三类 外部时钟模式2(TIMx_ETR),来自IO口复用为TIMx_ETR引脚。

第四类 外部时钟模式1,来自定时器通道TIMx_CH1、TIMx_CH2。

为什么说不来自通道3和通道4,因为①时钟源框图里没有对应的TI3FP和TI4FP信号!

TI1F_ED是双边沿检测信号,而TI1FP1和TI2FP2都是单边沿。

 我们可以在《数据手册》或《原理图》中找到管脚定义,各个功能对应的IO口;

总结:

1. 内部时钟(CK_INT),来自外设总线APB提供的时钟

2. 外部时钟模式1:外部输入引脚(TIx),来自定时器通道1或者通道2引脚的信号

3. 外部时钟模式2:外部触发输入(ETR),来自可以复用为TIMx_ETR的IO引脚

4. 内部触发输入(ITRx),用于与芯片内部其它通用/高级定时器级联

②控制器

TRGO触发信号可以触发DAC、ADC以及到其他寄存器。

什么叫触发到其他寄存器呢?

触发输出信号会连接另一寄存器的内部触发输入信号(ITR0~ITR1),从而实现级联的功能;

③时基单元

原理与基本定时器相同,不在赘述,可以参考基本定时器部分帖子!

④输入捕获

应用流程:比如外部信号通过通道1复用的IO口进入通道1产生TI1信号,经过输入滤波器和边沿检测器产生TI1FP1和TI1FP2,通过相关配置选择映射到IC1或IC2(也可理解为输入捕获通道1或输入捕获通道2),经过预分频器,假设边沿检测器配置为上升沿检测,当捕获到上升沿时,会产生捕获事件U并把计数器的值转移到捕获/比较寄存器里,也会产生捕获中断CC1I(需要我们自己开启)。其他通道类似。

(通用IO,就是GPIO外设输入出输出功能。复用就是作为其他外设的的输入或者输出使用)

为什么要有输入滤波器和边沿检测器呢?

答:当外部来一个脉冲信号,这个信号不一定是稳定的,可能会有毛刺,而这些毛刺的频率一定会比脉冲高电平的信号要高,因此控制输入滤波器就可以把高频的毛刺信号过滤掉,来保证脉冲信号的稳定;

      边沿检测器的作用是检测信号是上升沿还是下降沿。

⑤捕获/比较(公共)

属于公共部分。

⑥输出比较

应用流程:我们会往捕获/比较寄存器里写入比较值,计数器正常计数,当CNT计数器的计数值=捕获/比较寄存器的比较值(影子)时,会产生比较事件、输出参考信号(OC1REF,高电平有效)、比较中断(前提要配置),来进行输出控制(8种模式)产生OC1信号通过通道1输出给对应的IO口。其他通道类似。

图下面的ETRF信号是控制输出参考信号OC1REF的,会把OC1REF强制清零。

总结:输入捕获和输出比较是分时复用的,当输入捕获模块工作时,输出比较模块失效,当输出比较模块工作时,输入捕获模块失效。

3.时钟源配置

3.1 计数器时钟源寄存器设置方法

计数器时钟选择类型

             设置方法

内部时钟(CK_INT)

 设置TIMx_SMCRSMS=000,ECE保持为0

外部时钟模式1:外部输入引脚(TIx)

设置TIMx_SMCR的SMS=111,ECE保持为0

外部时钟模式2:外部触发输入(ETR)

设置TIMx_SMCRECE=1

内部触发输入(ITRx)

设置可参考STM32F10xxx参考手册_V10(中文版).pdf 14.3.15节

从模式控制寄存器(TIMx_SMCR): 

3.2 外部时钟模式1

接下来介绍“输入捕获滤波”“边沿检测方式选择”两部分寄存器配置,以及从模式控制寄存器(TIMx_SMCR) 。

1. 捕获/ 比较模式寄存器 1(TIMx_CCMR1)的输入捕获模式:

当IC1F[3:0]=0000,无滤波,以 f_{_{DTS}}采样,而 f_{_{DTS}} =  \frac{1}{t_{DTS}} = f_{CK_{-}INT} (f_{CK_{-}INT}为来自APB总线的时钟)。

控制寄存器 1(TIMx_CR1):

当IC1F[3:0]=0011,采样频率 f_{SAMPLING} = f_{CK_{-}INT},N=8。

怎么理解N=8?

“数字滤波器由一个事件计数器组成,它记录到N个事件后会产生一个输出的跳变”,意思是记录到的N个信号全都相同,信号才更新,否则不以第一次采样到的电平为准;举例说明:第一次采样6次低电平,2次高电平,不满足8次采样都相同的条件,因此以第一次采样到的低电平为准输出低电平,第二次采样到的都是高电平,那么电平跳变为高。

目的是把有毛刺的部分过滤掉!

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

3. 从模式控制寄存器(TIMx_SMCR): 

3.3 外部时钟模式2

接下来介绍“外部触发极性、外部触发预分频、滤波器”的寄存器配置。

从模式控制寄存器(TIMx_SMCR): 

3.4 定时器级联

同样也是介绍相关寄存器功能: 

控制寄存器 2(TIMx_CR2):

从模式控制寄存器(TIMx_SMCR):

由上表可知,当TIM2作为从定时器,TS = 000 时,对应的主模式定时器为TIM1。

4. 通用定时器中断实验

tim.c代码

#include "./BSP/TIMER/gtim.h"
#include "./BSP/LED/led.h"TIM_HandleTypeDef g_timx_handle;  /* 定时器x句柄 *//*** @brief       通用定时器TIMX定时中断初始化函数* @note*              通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候*              通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz*              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.*              Ft=定时器工作频率,单位:Mhz** @param       arr: 自动重装值。* @param       psc: 时钟预分频数* @retval      无*/
void gtim_timx_int_init(uint16_t arr, uint16_t psc)
{GTIM_TIMX_INT_CLK_ENABLE();                                 /* 使能TIMx时钟 */g_timx_handle.Instance = GTIM_TIMX_INT;                     /* 通用定时器x */g_timx_handle.Init.Prescaler = psc;                         /* 预分频系数 */g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;        /* 递增计数模式 */g_timx_handle.Init.Period = arr;                            /* 自动装载值 */HAL_TIM_Base_Init(&g_timx_handle);HAL_NVIC_SetPriority(GTIM_TIMX_INT_IRQn, 1, 3);             /* 设置中断优先级,抢占优先级1,子优先级3 */HAL_NVIC_EnableIRQ(GTIM_TIMX_INT_IRQn);                     /* 开启ITMx中断 */HAL_TIM_Base_Start_IT(&g_timx_handle);                      /* 使能定时器x和定时器x更新中断 */
}/*** @brief       定时器中断服务函数* @param       无* @retval      无*/
void GTIM_TIMX_INT_IRQHandler(void)
{/* 以下代码没有使用定时器HAL库共用处理函数来处理,而是直接通过判断中断标志位的方式 */if(__HAL_TIM_GET_FLAG(&g_timx_handle, TIM_FLAG_UPDATE) != RESET){LED1_TOGGLE();__HAL_TIM_CLEAR_IT(&g_timx_handle, TIM_IT_UPDATE);  /* 清除定时器溢出中断标志位 */}
}

 与基本定时器不同的是,通用定时器的中断直接通过判断中断标志位的方式来实现,本质上相同!

我们进入到“基本定时器代码”里的定时器中断公共处理函数当中,找到更新中断,发现函数作用也是先判断标志位,后执行定时器更新中断回调函数(弱函数),相当于层层嵌套,本质就是对中断标志位进行判断-----是否发生更新中断!

main.c代码: 

int main(void)
{HAL_Init();                             /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */delay_init(72);                         /* 延时初始化 */usart_init(115200);                     /* 串口初始化为115200 */led_init();                             /* 初始化LED */gtim_timx_int_init(5000 - 1, 7200 - 1); /* 10Khz的计数频率,计数5K次为500ms */while (1){LED0_TOGGLE();delay_ms(200);}
}

通用定时器中断实验的实现效果和基本定时器中断实验的实验效果相同! 主要是学习思路!

例程代码请在正点原子官网获得!


本篇完。

本人博客仅代表个人见解方便记录成长笔记。

若有不足,请指出,感谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2777006.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

第二章:三角面片及其填充

本文是《从0开始图形学》笔记的第二章,主要说明模型的一般构成以及如何查找模型的有效范围,涉及三角面片的填充以及向量的叉乘计算。 概念解说 上一节中,我们画出了箱子的顶点和边缘线,箱子还只是一个骨架而已。这一节我们来将箱…

再识C语言 DAY17 【什么是原码、反码和补码】

文章目录 前言本文总结于此文章 一、知识补充二、原码三、反码四,补码 总结如果您发现文章有错误请与我留言,感谢 前言 本文总结于此文章 一、知识补充 通常,1字节包含8位。C语言用字节(byte)表示储存系统字符集所需…

草莓CDMS原创内容分销系统,微信小说平台系统,附带系统搭建教程,搭建手册

草莓原创内容分销系统(草莓CDMS)——您的一站式内容分销解决方案 引领内容分销新潮流,草莓原创内容分销系统(简称草莓CDMS)以强大的技术支持和灵活的业务模式,为原创内容的传播和商业变现提供了前所未有的…

力扣刷题之旅:进阶篇(三)

力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。 --点击进入刷题地址 一、动态规划(DP) 首先,让我们来…

口袋工具箱微信小程序源码

这是一款云开发口袋工具箱微信小程序源码,只有纯前端版本,该版本的口袋工具箱涵盖了13个功能,分别为圣诞帽头像生成、二维码生成、日语50音图、汉字拼音查询、计算器、程序员黄历、娱乐摇骰子、身材计算、所在地天气查询、IP地址查询、手机归…

机器学习系列——(二十)密度聚类

引言 在机器学习的无监督学习领域,聚类算法是一种关键的技术,用于发现数据集中的内在结构和模式。与传统的基于距离的聚类方法(如K-Means)不同,密度聚类关注于数据分布的密度,旨在识别被低密度区域分隔的高…

单片机在物联网中的应用

单片机,这个小巧的电子设备,可能听起来有点技术性,但它实际上是物联网世界中的一个超级英雄。简单来说,单片机就像是各种智能设备的大脑,它能让设备“思考”和“行动”。由于其体积小、成本低、功耗低、易于编程等特点…

单片机学习笔记---蜂鸣器工作原理

目录 蜂鸣器介绍 蜂鸣器的驱动方式 ULN2003D芯片工作原理 实战预备知识:基础乐理 音名的分组 全音和半音的关系 音高的表示 五线谱中的符号定义 简谱上的符号定义 C调音符与频率对照表 相关计算 蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件&a…

【BUUCTF N1BOOK】[第三章 web进阶] 通关

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

【RabbitMQ(一)】:基本介绍 | 配置安装与快速入门

应该是新年前最后一篇博客了,明天浅浅休息一下,提前祝大家新年快乐捏!😊😊😊 01. 基础理解 1.1 同步调用和异步调用 👉 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成&#xff…

机器人搬砖 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第 i 堆中有 bricks[i] 块砖头,要求在8小时内搬完。 机器人每小时能搬砖的数量…

【RT-DETR进阶实战】利用RT-DETR进行过线统计(可用于人 、车过线统计)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 Hello,各位读者,最近会给大家发一些进阶实战的讲解,如何利用RT-DETR现有的一些功能进行一些实战, 让我们不仅会改进RT-DETR,也能够利用RT-DETR去做一些简单的小工作,后面我也会将这些功能利用PyQt或者是p…

Vue中v-on 可以监听多个方法吗

当然可以!Vue.js是一款非常强大的JavaScript库,它提供了很多方便的方法和指令,使我们可以更容易地构建交互式的Web应用程序。其中,v-on指令是Vue.js中一个非常重要也非常常用的指令,它用于监听DOM事件,并在…

Qt网络编程-写一个简单的网络调试助手

环境 Windows&#xff1a;Qt5.15.2&#xff08;VS2022&#xff09; Linux&#xff1a;Qt5.12.12&#xff08;gcc) 源代码 TCP服务器 头文件&#xff1a; #ifndef TCPSERVERWIDGET_H #define TCPSERVERWIDGET_H #include <QWidget> namespace Ui { class TCPServerW…

微信红包测试用例设计,龙年大吉!

前言 大家好&#xff0c;我是chowley&#xff0c;在这里祝大家龙年大吉&#xff0c;身体健康&#xff0c;这次来回忆一下当时参加腾讯技术面的场景题&#xff0c;面试官让我测试拼手气红包&#xff0c;不需要考虑其他方面&#xff0c;只在功能方面进行探索。 我先贴一张红包界…

蓝桥杯每日一题------背包问题(一)

背包问题 阅读小提示&#xff1a;这篇文章稍微有点长&#xff0c;希望可以对背包问题进行系统详细的讲解&#xff0c;在看的过程中如果有任何疑问请在评论区里指出。因为篇幅过长也可以进行选择性阅读&#xff0c;读取自己想要的那一部分即可。 前言 背包问题可以看作动态规…

CSP-202203-1-未初始化警告

CSP-202203-1-未初始化警告 难点&#xff1a;时间复杂度 【核心】&#xff1a;统计输入的k组“赋值”中&#xff0c;右值不为0且未在先前作为左值出现过的次数【坑!】本题直接通过暴力枚举时间复杂度很可能过不了 【90分思路】 定义数组 initialized 用来存储已经处理过的左…

FastDFS安装并整合Openresty

FastDFS安装 一、环境--centos7二、FastDFS--tracker安装2.1.下载2.2.FastDFS安装环境2.3.安装FastDFS依赖libevent库2.4.安装libfastcommon2.5.安装 libserverframe 网络框架2.6.tracker编译安装2.7.文件安装位置介绍2.8.错误处理2.9.配置FastDFS跟踪器(Tracker)2.10.启动2.11…

猫头虎分享已解决Bug || 响应式布局错误(Responsive Design Issues):在移动设备上元素重叠、布局错位

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

windows上卸载完程序后,清理残余文件,无法删除的情况处理

现象&#xff1a;通常在卸载完软件后&#xff0c;要删除残余文件或者移动残余文件时候&#xff0c;会弹出来 原因&#xff1a; 因为文件被其他程序已经加载&#xff0c;处理的目标是找到使用这个文件的进程&#xff0c;然后kill掉。类似于linux上的lsof命令查找到进程号&…