STM32 定时器自动重装载寄存器ARR带来的影响,ARPE0和1区别

news2024/11/24 3:56:01

ARR是啥

在这里插入图片描述

自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件
(UEV) 时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 (ARPE)。当>计数器达到上溢值(或者在递减计数时达到下溢值)并且 TIMx_CR1 寄存器中的 UDIS 位为 0时,将发送更新事件。该更新事件也可由软件产生。

计数器时序图,ARPE=0 时更新事件,未预装载

立刻改变ARR重装载值,计数器从当前值计数36,而不是原来的FF
在这里插入图片描述

计数器时序图,ARPE=1 时更新事件(TIMx_ARR 已预装载)

原来ARR的值F5,现在写入36,但是计数器依旧按照原来的计数到F5,溢出后,然后再重新从0开始计数,直到新ARR-36。

如果没有预装载,此时ARR的值直接更新,而此时计数器已经是F1,超过了新写入的值36,计数器不是直接从零计数,而是一直加到溢出,再从0重新开始计数到ARR,这就造成了一些问题,计数时间不是你想要的,有点字乱

在这里插入图片描述

ARPE,自动重装载使能,默认0,无预装载

在这里插入图片描述
通过下边程序进行更改ARPE

/**
  * @brief  Enables or disables TIMx peripheral Preload register on ARR.
  * @param  TIMx: where x can be 1 to 14 to select the TIM peripheral.
  * @param  NewState: new state of the TIMx peripheral Preload register
  *          This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)
  {
    /* Set the ARR Preload Bit */
    TIMx->CR1 |= TIM_CR1_ARPE;
  }
  else
  {
    /* Reset the ARR Preload Bit */
    TIMx->CR1 &= (uint16_t)~TIM_CR1_ARPE;
  }
}

援引网友的一段话

https://blog.csdn.net/qq_46015011/article/details/107108739
预加载寄存器是自动重装载寄存器的“影子”,也就是预加载寄存器是自动重装载寄存器的缓冲器。但是自动重装载寄存器不是用户用程序可以直接进行操作的,用户需要借助于预加载寄存器(缓冲区)才能访问它。

其目的是为了保证自动重装载寄存器在合适的时候被修改,不允许其随便被修改,否则可能导致在切换的时候发生事与愿违的结果。

简单来说:没有预加载寄存器,这次修改的值,立马会被执行。而有了预加载寄存器,这次修改值会等到这次执行完后,才去执行。

总结:
因为定时器的周期都比较短,我们可以通过预加载寄存器配合自动重装载寄存器,来更好的操作定时器,以达到我们期望的效果。

下面的这个解释挺好的:

👀使能预装载的意义在于可以多个通道同时输出时,时序能准确地同步。网上的一段有意义的解释是:设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。可见如果只是单通道输出,多通道输出时没时序精准的同步更新要求,不使能也可以的。

参考文献是这样说的:自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件 (UEV) 时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 (ARPE)。这里对自动重载寄存器执行写入或读取操作时会访问预装载寄存器我很疑惑,TIMx_ARR应该不是它们对应的预装载寄存器,可能是有三个寄存器的,自动重装载寄存器、预装载寄存器、和真正起作用的影子寄存器。希望得到解答。

我李某人遇到的问题

最近因为这个重装载问题困扰了我好久,我此时只想说:
在这里插入图片描述

下边就是我做的一些测试,来查找这个问题,因为这个跳变不是一直出现的,一直测测测,yue了

//#define debug_config_init_c//改变引脚的初始化,上下拉等
//#define debug_config_init_h//引脚输入输出,OD开漏无需配置引脚的输入输出,推挽要配置
//#define debug_stm32f4xx_c//增加d2读取时间,未曾跳变,
//#define debug_stm32f4xx_it_c_two//将d1,2读取顺序对调,D2采用平均值
#define debug_stm32f4xx_it_c_500ms//统一定时5ms,大于转换时间1。17ms
#define debug_tiaobian//捕捉跳变
//#define debug_Priority//增加气压计优先级,还会跳变,不是中断引起的
//#define debug_interruppt//只保留气压计中断,未曾跳变,验证是因为被其他中断打断引起的跳变
#define debug_NACK//读取数据结束,按照手册增加这个非应答信号
//#define debug_filter_D2_1//这几个值均不为零,才更新高度,跳变均是0
#define debug_data_type//char接收了一个超范围的值A0-AE,char最大127,
//#define debug_IIC_WaitAck
#define debug_IIC_communicate//更改IIC时序,降低读取数据的频率,增大延时

初心是定时器中断里不断改变ARR的值,达到一个不同定时时间case的切换,执行不同的命令,可是事与愿违,不到2.5ms,直接到了下一个case,因为ARPE默认是0,假如在到达250这个case之前,计数器已经到了248,你直接给了ARR250,这不直接定时时间直接到下一个case喽,不知哪位师兄写的程序害我,哈哈,本来八百多万的数据直接变成了0,这不导致无人机上跳下窜的,虽然控制有滤波,万一跳变过多,没有滤掉呢,一架架飞机炸裂,那我直接跑路吧,也别毕业了。。。

在这里插入图片描述

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/b5144af96cfd4bd8b0e0705bf87336ce.png

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

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

相关文章

C语言:函数栈帧的创建和销毁(32位下观察)

一、寄存器(0:3:35) 1.寄存器有哪些?(6种)(0:38:50) 2.esp和ebp这两个寄存器中,存放的是什么?用来干嘛的?&a…

3.利用matlab计算不定积分和定积分(matlab程序 )

1.简述 不定积分 首先,通过符号变量创建一个符号函数,然后调用积分命令来计算函数的积分,示例如下: 注意:matlab中计算的不定积分结果中没有写上常数C,读者需要自己在使用的时候记得加上常数部分。 通常情…

auto-changelog的简单使用

auto-changelog的简单使用 自动化生成Git提交记录,CHANGELOG.md文件 github:https://github.com/cookpete/auto-changelog 安装 npm install -g auto-changelog配置脚本 package.json文件下 "scripts": {"changelog": "aut…

Java多线程(九)

目录 一、synchronized基本特点 二、synchronized加锁工作过程 2.1 无锁 2.2 偏向锁 2.3 轻量级锁 2.4 重量级锁 三、synchronized其他优化操作 3.1 锁消除 3.2 锁粗化 一、synchronized基本特点 开始是乐观锁,如果锁冲突频繁就会转换成悲观锁开始是轻量级锁&#x…

UWA Pipeline 2.5.0 版本更新说明

UWA Pipeline是一款面向游戏开发团队的本地协作平台,旨在为游戏开发团队搭建专属的DevOps研发交付流水线,提供可视化的CICD操作界面、高可用的自动化测试以及UWA性能保障服务的无缝贴合等实用功能。 UWA Pipeline 2.5.0 版本发布,一批新功能…

Python系统学习1-6-元组

】目录 一、列表与字符串转换 二、列表推导式 三、元组 1、元组基本操作 2、元组和列表的内存图 四、容器思想 homework 一、列表与字符串转换 (1) 列表转换为字符串: result "连接符".join(列表) # 根据xx条件,循环拼接字符串 # 需…

指针---进阶篇(二)

指针---进阶篇(二) 前言一、函数指针1.抛砖引玉2.如何判断函数指针?(方法总结) 二、函数指针数组1.什么是函数指针数组?2.讲解函数指针数组3.模拟计算器:讲解函数指针数组 三、指向函数指针数组…

8年测试整理,接口测试-测试点分析与搜索查询测试点(超细汇总)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口可用性 主要…

Redux - Redux在React函数式组件中的基本使用

文章目录 一,简介二,安装三,三大核心概念Store、Action、Reducer3.1 Store3.2 Reducer3.3 Action 四,开始函数式组件中使用4.1,引入store4.1,store.getState()方法4.3,store.dispatch()方法4.4&…

10年软件测试行业经验教你如何写简历【绝对靠谱】

前言 作为软件测试的从业者,面试或者被面试都是常有的事。 可是不管怎样,和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息、过往经历等。 面试者希望通过简历把自己最好的一面体现给面试官,所以在这场博弈中&…

若依vue -【 100 ~ 更 ~ 110 】

100 主子表代码生成详解 1 新建数据库表结构(主子表) -- ---------------------------- -- 客户表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

母猪产仔早知道,这次南农用上了英伟达边缘 AI Jetson

内容一览:对养猪业而言,母猪产仔是其中关键的一环。因此,提高猪仔成活率、确保母猪分娩过程安全,成为重要课题。现有的 AI 监测方式,存在着高设备成本与信息传输不稳定的问题,南京农业大学研究人员&#xf…

Kali Hyper-V安装正常启动后 黑屏 只能进命令模式

问题: Hyper-V安装虚拟机Kali系统一切安装正常, 没有出现错误. 安装成功后重启,只能进入命令模式,tt1-tt6,进不去GUI桌面. 尝试: 一代二代虚拟硬盘都试过,同样问题,只能开进后进入命令模式,在命令模式下一切运行正常, 也修复过系统 GNOM等的,不管用. 以下为国外论坛给的建议,尝…

Qt 文件对话框使用 Deepin风格

当你在Deepin或UOS 上开发 Qt 程序时,如果涉及到文件对话框功能,那么就会遇到调用原生窗口的问题。 如果你使用的是官方的Qt版本,那么在Deepin或者UOS系统上,弹出的文件对话框会是如下这样: 而Deepin或UOS系统提供的默…

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

手把手推导扩散模型:Diffusion Models(DDPM) DDPM理论回顾前置知识过程详解Forward ProcessReverse Process DDPM算法伪代码训练部分采样部分 总结一下 参考链接 在这篇博客文章中,我们将深入研究 去噪扩散概率模型(也称为 DDPM&…

利用Simulink Test进行模型单元测试 - 1

1.搭建用于测试的简单模型 随手搭建了一个demo模型MilTestModel,模型中不带参数 2.创建测试框架 1.模型空白处右击 测试框架 > 为‘MilTestModel’创建 菜单 2.在创建测试框架对话框中,点击OK,对应的测试框架MilTestMode_Harness1就自动…

js玩儿爬虫

前言 提到爬虫可能大多都会想到python,其实爬虫的实现并不限制任何语言。 下面我们就使用js来实现,后端为express,前端为vue3。 实现功能 话不多说,先看结果: 这是项目链接:https://gitee.com/xi1213/w…

时间复杂度与空间复杂度的详解

目录 1.时间复杂度 2.时间复杂度计算例题 3.空间复杂度 1.时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度。 如何表达 时间复杂度? 大O的渐进表示法 实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数&#xf…

105. 从前序与中序遍历序列构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,n…

【高频面试题】多线程篇

文章目录 一、线程的基础知识1.线程与进程的区别2.并行和并发有什么区别?3.创建线程的方式有哪些?3.1.Runnable 和 Callable 有什么区别?3.2.run()和 start()有什么区别? 4.线程包括哪些状态,状态之间是如何变化的4.1.…