关闭 定时开启_【话说定时器系列】之四:STM32定时器更新事件及案例分享
STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍。去年,电堂推出了《STM32 TIMER基础及常规应用介绍》,为大家梳理了 STM32 TIMER 的庞大内容,涵盖 TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。
本文重点介绍STM32定时器的更新事件及更新事件源,并诠释影子寄存器与预装寄存器的特性。
STM32定时器的更新操作与更新事件
我们知道,STM32定时器中的四个带影子特性的寄存器组,每组寄存器分别由 影子寄存器【即实际控制寄存器】和预装寄存器组成。其中,影子寄存器是真正起作用的控制寄存器,用户访问不到它。而预装寄存器是用户访问的为实际影子寄存器准备数据或指令的寄存器。它们分别是:
TIMx_PSC 分频寄存器 TIMx_ARR 自动重装载寄存器
TIMx_CCR 捕捉寄存器 TIMx_RCR 重复计数寄存器[高级定时器有】
其中,ARR、CCR寄存器带预装载使能控制位,即它们的预装功能可以软件开启或关闭。
TIMx_ARR 带预装载使能控制位 ARPE@TIMx_CR1
TIMx_CCR 带预装载使能控制位 OCxPE@TIMx_CCMR
当相应预装使能位置1时,即开启预装功能时,此时影子寄存器的数据更新必须且只能通过更新事件实现从预装寄存器到影子寄存器的数据拷贝。
当相应预装使能位置0时,即关闭预装功能时,用户修改预装寄存器的数据后会立即被拷贝进影子寄存器【实际寄存器】。也就是说,此时我们用户操作预装寄存器就相当于访问实际影子寄存器。
那另外的PSC、RCR寄存器是不带预装使能控制位的,也就是说,二者的影子寄存器的预装功能始终开启,所以对于PSC/RCR影子寄存器的数据更新就只能通过更新事件唯一途径实现从预装寄存器到影子寄存器的数据拷贝更新。
那么有哪些操作可以产生更新事件呢?或者有哪些更新事件源呢?
这里把更新操作跟更新事件区别开来,以便于概念上的理解。
更新操作是一种动作,是更新事件的源头,即事件源;
更新事件是基于更新操作所导致的后续影响或结果。
可能的更新操作【事件源】有3类:
1、核心计数器的溢出【上溢或下溢】
2、软件复位操作【对UG@TIMX_EGR置位】
3、工作在复位模式下的定时器收到触发信号【即复位触发信号】
【特别提醒,对于高级定时器必须发生RCR+1次溢出动作后才可以产生更新事件。对于通用或基本定时器,每溢出一次都可以产生更新事件。】
那么更新操作何时可以升级为更新事件呢?
这里涉及到一个控制寄存器的控制位,UDIS@TIMx_CR1.
当该控制位UDIS@TIMx_CR1为0时,更新操作升级为更新事件,更新事件会产生如下影响或效果:
1、实现从预装寄存器的数据到影子寄存器的内容拷贝,即完成影子寄存器的内容更新;
2、实现计数器【预分频计数器、核心计数器、重复计数器】的重新初始化;
3、置位状态寄存器的UIF@TIMx_SR,并可以触发定时器更新中断或触发DMA请求;
当该控制位UDIS@TIMx_CR1为1时,更新操作不能升级为更新事件,其相应的结果或影响:
仅限于计数器的重新初始化,不做影子寄存器的更新;
无更新标志的置位,不触发中断或DMA请求
那么发生更新操作时计数器的重新初始化具体是指什么呢?
1、分频计数器重装为0,然后重新开始计数;
2、重复计数器重装为RCR寄存器里的值,然后重新递减计数;
3、核心计数器的初始化由计数模式来定,如果是向上计数或中心对齐计数模式,CNT归0;如果是向下计数器模式,CNT重装为ARR,然后重新向下计数;
发生更新事件时,影子寄存器的更新与计数器的重装有先后顺序问题吗?
有!影子寄存器【ARR/CCR….】的更新操作在前,计数器的重装操作在后!
因为这样可以保障计数器的重装值使用更新过的数据。该个细节要特别注意!
最后,不妨做个基于更新事件的案例分享:
问题描述:TIMER初始化阶段,经常有人反馈,不管定时器周期的长短,只要一使能更新中断,就立即进中断服务程序?令人不解,往往给开发带来些困扰,原因可能是什么?如何解决?
我们知道,定时器应用的初始化时,往往需要对有关时基寄存器进行些基本的数据赋值。
比方对ARR/PSC/RCR这些寄存器赋予初始值。结合前面的介绍,这些寄存器都是些带预装功能的寄存器,我们用户操作的寄存器都是预装寄存器,还不是实际起作用的影子寄存器。对于ARR寄存器倒还好,因为芯片复位后默认状态下,ARR寄存器的预装功能时关闭的【CCR寄存器的预装载功能默认条件下也是关闭的】,那么我们用户给ARR赋值就相当于给其实际影子寄存器赋值了。
但PSC/RCR寄存器是不带预装控制位的,它们两个的影子寄存器的更新必须借助于更新事件。所以,在定时器的时基参数的初始代码里,为了让用户写进预转寄存器的数据生效,就用到了上面提到过的软件复位操作,即对UG@TIMx_EGR进行置位而产生更新事件,从而完成影子寄存器的数据更新。
在STM32标准库里的TIM_TimeBaseInit( )函数里都有这句代码:
TIMx->EGR = TIM_PSCReloadMode_Immediate;
在Cube库里的HAL_TIM_Base_Init( )函数里的 函数有这句代码:
TIMx->EGR = TIM_EGR_UG;
结合前面的介绍,这两行代码使用到了前面提到的软件更新操作,触发了更新事件,它不仅仅实现了影子寄存器的数据更新,同时呢,还置位了状态寄存器的更新中断标志位UIF@TIMx_SR。那么,如果在这之后,我们使能定时器更新中断的话,进入更新中断服务程序的话就再自然不过了。为了规避这个问题,我们在时基参数初始化完成之后、使能定时器更新中断之前,可以先做更新中断标志的清除操作。
基于这个案例,我们可以对定时器的预装特性以及不同影子寄存器的特性差异有进一步的了解。总的来讲,STM32定时器的寄存器预装载特性也是其一特色,定时器的更新事件也是非常重要的事件,更新事件本身及相关中断或DMA功能也是STM32开发应用中常用的工具,切实掌握这些将十分有助于STM32的产品开发。
感兴趣的朋友可以关注“AI电堂”公众号
或者直接登录电堂网站观看相关课程
电堂科技c.51diantang.com
关闭 定时开启_【话说定时器系列】之四:STM32定时器更新事件及案例分享相关推荐
- python 关闭 定时开启_Qt多种定时器
介绍Qt的三种定时器QObject内置定时器,QBasicTimer,QTimer. QObject内部定时器 使用startTimer开启定时器,使用killTimer(int id)接口来关闭指定 ...
- TCP的定时器系列 — 零窗口探测定时器(有图有代码有真相!!!)
转载 主要内容:零窗口探测定时器的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 出现以下情况时,TCP接收方的接收缓冲区将被塞满数据: 发送方的 ...
- TCP的定时器系列 — 超时重传定时器(有图有代码有真相!!!)
转载 主要内容:TCP定时器概述,超时重传定时器.ER延迟定时器.PTO定时器的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd Q:一条TCP连接 ...
- python 关闭 定时开启_Python爬虫邮箱定时自动发送
背景介绍 小说网站-笔趣看: URL:http://www.biqukan.com/ 笔趣看是一个盗版小说网站,这里有很多起点中文网的小说,该网站小说的更新速度稍滞后于起点中文网正版小说的更 ...
- 硬件nat关闭还是开启_超能课堂(173):AfterBurner不止超频,还是绝佳的游戏伴侣...
微星AfterBurner软件可以说是一个相当好用的显卡工具,它好用的超频功能估计都不用我多说了吧?微星并没有把这款软件限制在自己品牌的显卡能用,各个品牌的显卡都能用,无论A卡还是N卡都可以用Afte ...
- 硬件nat关闭还是开启_卡顿未必怪硬件,Win10玩游戏不可不知的技巧
对于大多数游戏玩家而言,Win10算是一个不错的游戏平台.不但兼容性好,Xbox的原生加持也让玩家们更加过瘾.其实很多人并不知道,在Win10中也有一些针对游戏的小设置,设置好后,能瞬间给你一种奇瑞变 ...
- 硬件nat关闭还是开启_「Windows」到底要不要开启“快速启动”,有没有副作用?...
前言: 我记得自win8以来,在电源管理里面就有个快速启动选项,开机4-6秒不是梦啊,那么问题来了,装个win10系统平均会占用20-30G的内存,如果不是固态硬盘,为何仅仅几秒钟就读取完系统后就开机 ...
- 硬件nat关闭还是开启_潜在的NAT加速问题和冲突以及开关建议
NAT加速华硕已经写在了路由器上的硬件之中.这就是路由在常常说的的路由器硬件加速功能!一般分为CTF(直通转发)和FA(流速加速器),当然本文的内容仅供一般用户配置使用,我们这里不会详细介绍NAT加速 ...
- 硬件nat关闭还是开启_路由器开启NAT和防火墙功能,性能会下降吗?
最近在思考一个问题,图书馆里书越来越多,书店的书也越来越多,人类的问题非但没有减少,反而越来越多? 我从事计算机网络行业,谈谈我的观点. 计算机网络技术发展特别快,有些技术从诞生到消失可能只有几年的时 ...
最新文章
- 多线程模式(2):Guarded Suspension模式
- 语音控制 python_用Python编程实现语音控制电脑
- 小余学调度:学习记录(2021.11月)
- android 请求网络异步载入
- 主板24pin接口详图_【图解】主板连线接口最详尽图文解释
- 推动Windows的限制:句柄
- 如何用 30 天入门年薪 30 万的技术领域?
- Note 7会让三星有什么样的命运呢?
- [算法模板]高斯消元
- 2015年度夏季假期学习内容
- Unity的URP项目开启
- 【ArcGIS|空间分析】栅格数据和矢量数据的面积计算
- 热力学与统计物理笔记(WIP)
- Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
- Codeforces446C - DZY Loves Fibonacci Numbers
- Ubuntu Linux访问小米手机存储卡
- oracle限制查询条数-rownum用法详解
- uniapp 请求接口封装
- wifi设备名称android,Android设置WiFi设备名解析
- SSM框架配置文件整理
热门文章
- 关于 JShell,开发人员需要知道的10件事情
- Docker 大势已去,Podman 万岁
- MySQL跑在CentOS 6 和 7上的性能比较
- error: ‘__declspec‘ attributes are not enabled; use ‘-fdeclspec‘ or ‘-fms-extensions‘ to enabl
- gradle修改版本
- c# websocketServer base64乱码
- yolo v3 fatal : Memory allocation failure
- 图像低频高频区域分离 小波变换
- 识别MNIST数据集:用Python实现神经网络
- 青龙面板Nvjdc魔改前段待弹窗---仅支持2.0版本