正点原子-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_SMCR的SMS=000,ECE保持为0 |
| 外部时钟模式1:外部输入引脚(TIx) | 设置TIMx_SMCR的SMS=111,ECE保持为0 |
| 外部时钟模式2:外部触发输入(ETR) | 设置TIMx_SMCR的ECE=1 |
| 内部触发输入(ITRx) | 设置可参考STM32F10xxx参考手册_V10(中文版).pdf 14.3.15节 |
从模式控制寄存器(TIMx_SMCR):



3.2 外部时钟模式1

接下来介绍“输入捕获滤波”、“边沿检测方式选择”两部分寄存器配置,以及从模式控制寄存器(TIMx_SMCR) 。
1. 捕获/ 比较模式寄存器 1(TIMx_CCMR1)的输入捕获模式:
当IC1F[3:0]=0000,无滤波,以 采样,而
=
=
(
为来自APB总线的时钟)。
控制寄存器 1(TIMx_CR1):

当IC1F[3:0]=0011,采样频率 =
,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);}
}
通用定时器中断实验的实现效果和基本定时器中断实验的实验效果相同! 主要是学习思路!
例程代码请在正点原子官网获得!
本篇完。
本人博客仅代表个人见解方便记录成长笔记。
若有不足,请指出,感谢您的阅读!
相关文章:
正点原子-STM32通用定时器学习笔记(1)
目录 1. 通用定时器简介(F1为例) 2. 通用定时器框图 ①时钟源 ②控制器 ③时基单元 ④输入捕获 ⑤捕获/比较(公共) ⑥输出比较 3.时钟源配置 3.1 计数器时钟源寄存器设置方法 3.2 外部时钟模式1 3.3 外部时钟模式2 3…...
Redis篇之redis是单线程
一、redis是单线程 Redis是单线程的,但是为什么还那么快?主要原因有下面3点原因: 1. Redis是纯内存操作,执行速度非常快。 2. 采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题。 …...
随机MM引流源码PHP开源版
引流源码最新随机MM开源版PHP源码,非常简洁好看的单页全解代码没任何加密 直接上传即可用无需数据库支持主机空间...
【C++修行之道】(引用、函数提高)
目录 一、引用 1.1引用的基本使用 1.2 引用注意事项 1.3 引用做函数参数 1.4 引用做函数返回值 1.5 引用的本质 1.6 常量引用 1.7引用和指针的区别 二、函数提高 2.1 函数默认参数 2.2函数占位参数 2.3 函数重载 2.4函数重载注意事项 一、引用 1.1引用的基本使用 …...
从零开始手写mmo游戏从框架到爆炸(十一)— 注册与登录
导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 从这一章开始,我们进入业务的部分,从注册登录开始。 创建注册和登录的路由 package com.loveprogrammer.command.server;public interface Se…...
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、分布…...
【0256】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(二)
上一篇:【0255】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(一) 文章目录 1. 前言2. 分配BackendId2.1 何时为backend process分配BackendId2.1.1 找出未使用的slot(inactive slot)2.3 BackendId序号从多少开始?2.4 后端进程退出后,其BackendId被释放…...
eclipse4.28.0版本如何安装FatJar插件
场景: 今天准备温故下以前的老项目,于是下载了最新版本的Eclipse IDE for Enterprise Java and Web Developers - 2023-06,老项目中有些需要将程序打成jar包,于是考虑安装FatJar插件。 问题描述 一顿操作后,发现FatJar死活安装了,在线安装提示content.xml异常;离线安装…...
查大数据检测到风险等级太高是怎么回事?
随着金融风控越来越多元化,大数据作为新兴的技术被运用到贷前风控中去了,不少人也了解过自己的大数据,但是由于相关知识不足,看不懂报告,在常见的问题中,大数据检测到风险等级太高是怎么回事呢?小易大数据…...
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
两数之和 —— 无序数组 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现…...
Hair Tool for Blender3D
CGer.com - Hair Tool for Blender3D - CGer资源网 Hair Tool 1.5 for Blender3D 链接: https://pan.baidu.com/s/1kVABn6n 密码: gwprHair Tool 1.65-1.8 for Blender链接: https://pan.baidu.com/s/1A7cW_Ms2baGQ2M0iE1dQhQ 密码: 81bqHair Tool for Blender 1.9.2链接: http…...
【最详解】如何进行点云的凹凸缺陷检测(opene3D)(完成度80%)
文章目录 前言实现思路想法1想法2想法3 补充实现想法1想法2代码 想法3代码 总结 前言 读前须知: 首先我们得确保你已经完全知晓相关的基本的数学知识,其中包括用最小二乘法拟合曲二次曲面,以及曲面的曲率详细求解。若还是没弄清楚࿰…...
海外云手机——平台引流的重要媒介
随着互联网的飞速发展,跨境电商、短视频引流以及游戏行业等领域正经历着迅猛的更新换代。在这个信息爆炸的时代,流量成为至关重要的资源,而其中引流环节更是关乎业务成功的关键。海外云手机崭露头角,成为这一传播过程中的重要媒介…...
数据库-计算机三级学习记录-4DBAS功能概要设计
DBAS功能概要设计 参照b站【计算机三级数据库技术】 DBAS功能设计包括应用软件中的数据库事务设计和应用程序设计。 功能设计过程一般被划分为总体设计、概要设计和详细设计。而具体到数据库事务设计部分,又可分成事务概要设计和事务详细设计。完成系统设计工作之后…...
JVM-虚拟机栈
虚拟机栈 Java虚拟机栈(Java Virtual Machine Stack)采用栈的数据结构来管理方法调用中的基本数据,先进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存。 接下来以…...
linux系统上tomcat简介以及安装tomcat
tomcat简介以及安装 Tomcat简介安装环境安装jdk安装tomcat浏览器访问 Tomcat简介 Tomcat是一个开源的Web服务器和servlet容器,由Apache软件基金会开发和维护。它是一种流行的Java Web应用服务器,用于运行Java编写的Web应用程序。 Tomcat提供了一个轻量级…...
树莓派的pip安装时候添加清华源
每次都要去找镜像网址,太麻烦了,通过改配置可以一次性解决。 首先创建一个.pip 目录 mkdir ~/.pip意味着在当前目录下创建.pip文件,不过这个是隐藏文件,一般情况下是关闭隐藏文件的可视的,于是我绕了点弯弯。 编辑…...
共享网盘系统PHP源码
新V5.0版本,支持上传视频、支持视频播放、支持共享,也可以自己用。 可以自动生成视频外链,下载地址,播放器代码,html代码,ubb代码等等。 使用方法: 源码上传到服务器,打开网站根据…...
unity-ios-解决内购商品在Appstore上面已配置,但在手机测试时却无法显示的问题
自己这几天用 unity 2021 xcode 14.2 开发ios内购,appstore上面内购商品都已经配置好了,但是在手机里就是不显示,最后才发现必需得满足以下条件才行: 1. Appstore后台 -> 内购商品 -> 商品状态必需为『准备提交』以上状态…...
flask的基本使用 token插件(二)
一、安装flask-jwt-extended 安装flask-jwt-extend得时候 会自动安装一个pyjwt得库。pyjwt可以直接使用来生成JWT和验证。但是在flask中,可以通过Flask-JWT-Extended来实现JWT能,因为他封装了使用方式,以及一些属性和装饰器,用起…...
如何利用Dask集成ydata-profiling实现大规模数据处理:2024终极指南
如何利用Dask集成ydata-profiling实现大规模数据处理:2024终极指南 【免费下载链接】fg-data-profiling 1 Line of code data quality profiling & exploratory data analysis for Pandas and Spark DataFrames. 项目地址: https://gitcode.com/gh_mirrors/y…...
Wand-Enhancer终极指南:3步免费解锁WeMod完整功能
Wand-Enhancer终极指南:3步免费解锁WeMod完整功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod高级功能付费而烦恼吗…...
Rust实现PDF解析与渲染:pdf_oxide库的安全高性能实践
1. 项目概述:当Rust遇上PDF,一场性能与安全的革命如果你在Rust社区或者高性能数据处理领域待过一阵子,大概率听说过或用过pdf_oxide这个库。乍一看,它只是GitHub上一个名为yfedoseev/pdf_oxide的仓库,一个用纯Rust编写…...
快速安装ClaudeCode完整指南
在电脑上安装 Claude Code 先安装系统环境和必要的依赖。 1、检查 Node.js 和Git是否已安装 (1)Node.js 方法 1:官网下载 访问: https://nodejs.org/zh-cn 运行安装包一路 Next 即可 方法 2:用 winget 安装 wi…...
固态存储寿命优化与文件系统写入放大实战
1. 固态存储寿命与文件系统的隐秘战争当我在2015年第一次拆解一块过早失效的工业级固态硬盘时,发现其内部闪存单元的磨损程度存在严重不均。这个现象引发了我对文件系统与固态存储寿命关系的长期研究。传统认知中,我们更关注SSD的TBW(总写入字…...
【独家拆解】Sora 2正式版底层架构升级:从DiT-XL到时空联合注意力v3.2,性能提升217%的关键证据
更多请点击: https://intelliparadigm.com 第一章:Sora 2正式版发布背景与核心定位 OpenAI 于2024年第三季度正式发布 Sora 2,标志着视频生成模型从实验性原型迈入工业级部署新阶段。此次发布并非简单迭代,而是基于对数百万小时真…...
AI技能库设计:构建大语言模型的可执行能力框架
1. 项目概述:一个AI技能库的诞生与价值最近在GitHub上看到一个挺有意思的项目,叫haliphax-ai/skills。光看名字,你可能会觉得这又是一个关于“技能”的泛泛而谈的仓库。但点进去之后,我发现它的定位非常精准:这是一个专…...
你以为路径不会回头?一道 Self Crossing 让无数人当场破防
你以为路径不会回头?一道 Self Crossing 让无数人当场破防 很多人第一次刷到 Self Crossing(路径交叉) 这道题时,都有一种错觉: “不就是判断线段相交吗?这能有多难?” 结果一写代码: 判断漏了 边界炸了 图形绕晕了 Case 全挂了 最后看题解的时候,人都沉默了。 因为…...
Sidekiq监控测试终极指南:如何全面检测系统状态与性能
Sidekiq监控测试终极指南:如何全面检测系统状态与性能 【免费下载链接】sidekiq Simple, efficient background processing for Ruby 项目地址: https://gitcode.com/gh_mirrors/si/sidekiq Sidekiq作为Ruby生态中最流行的后台作业处理框架,其强大…...
丹诺医药开启招股:拟募资6亿港元 5月22日上市 无营收,年亏1.5亿
雷递网 雷建平 5月14日丹诺医药(苏州)股份有限公司(简称:“丹诺医药”,股票代码:“06872”)日前开启招股,准备2026年5月22日在港交所上市。丹诺医药发售价75.70港元,发行…...




