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

这篇具有很好参考价值的文章主要介绍了STM32 定时器自动重装载寄存器ARR带来的影响,ARPE0和1区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ARR是啥

stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机

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

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

立刻改变ARR重装载值,计数器从当前值计数到36,而不是原来的FF
stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机

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

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

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

stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机

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

stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机
通过下边程序进行更改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应该不是它们对应的预装载寄存器,可能是有三个寄存器的,自动重装载寄存器、预装载寄存器、和真正起作用的影子寄存器。希望得到解答。

我李某人遇到的问题

最近因为这个重装载问题困扰了我好久,我此时只想说:
stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机

下边就是我做的一些测试,来查找这个问题,因为这个跳变不是一直出现的,一直测测测,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,这不导致无人机上跳下窜的,虽然控制有滤波,万一跳变过多,没有滤掉呢,一架架飞机炸裂,那我直接跑路吧,也别毕业了。。。

stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机

0x52,0xEE,这两个命令之间本来按照程序有一个2.5ms的延时,可是这里没有起作用,导致我这边数据读取到0
增加这个延时的作用就是给气压计一个转换时间,数据转换完成,我再去读取,这倒好,还没转换完我就去读取,可不就是00000,服了

stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机
stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机

解决方法一

采用固定的定时时间,不来回切换ARR
统一定时5ms

` TIM_TimeBaseStructure.TIM_Period = 499;

   TIM_TimeBaseStructure.TIM_Prescaler = 839;
    void TIM4_IRQHandler(void)
{ 
  if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) 
  {
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
     case FLAG_IDLING:
     // TIM4_Pri->ARR = 500; // 采用固定的定时时间5ms,不来回切换ARR
      time4_phaseflag = FLAG_D2_CONVERTING;
      break;

解决方法二

计数器先失能,清零计数器,再使能计数器

TIM4->CR1 &= (uint16_t)~TIM_CR1_CEN;//计数器失能
      TIM4->CNT = 0;//清零计数器
      TIM4->ARR = 250; 
      MS5611_SendData(0x52); //Command ConvertD2 (OSR=512)
      time4_phaseflag = FLAG_D2_CONVERTING;
      TIM4->CR1 |= TIM_CR1_CEN;//计数器使能

解决方法三

采用OPM模式
可参考如下

https://blog.csdn.net/weixin_44057803/article/details/132767653
stm32寄存器 使能自动重装载值,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-764284.html

到了这里,关于STM32 定时器自动重装载寄存器ARR带来的影响,ARPE0和1区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32影子寄存器、预装载寄存器,TIM_OC1PreloadConfig和TIM_ARRPreloadConfig的作用

    一直没搞清楚stm32定时器的TIM_OC1PreloadConfig、TIM_ARRPreloadConfig函数的作用,影子寄存器、预装载寄存器、重载寄存器的概念。今天来研究一下:         首先看定时器的框图: 图中有阴影的小方框,代表该功能对应的寄存器有影子寄存器,也就是:PSC预分频器、自动重装载寄

    2024年02月09日
    浏览(43)
  • STC15系列单片机:定时器/计数器16位自动重装载模式

    STC15系列单片机内部有5个16位定时器/计数器,分别是T0、T1、T2、T3、T4。 定时器与计数器,东西还是同一个东西,只是用法和功效不一样,就好比黄瓜,既可以内服也可以外敷,黄瓜还是那个黄瓜,作用就不一样了。 就拿T0来说,T0用于定时,那T0就是定时器,如果T0用于计数

    2024年01月25日
    浏览(54)
  • 【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

    1.1 TIM_InternalClockConfig 1.2 TIM_TimeBaseInit 1.3 TIM_TimeBaseInitTypeDef 1.4 TIM_ClearFlag 1.5 TIM_ITConfig 1.6 TIM_Cmd 1.7 中断服务函数 参考程序 1.8 TIM_ETRClockMode2Config timer.h timer.c main.c timer.h timer.c main.c 09-定时器定时中断.rar 10-定时器外部时钟.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年02月03日
    浏览(56)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(62)
  • STM32定时器-定时器中断功能详解

    STM32的众多定时器中我们使用最多的是高级定时器和通用定时器,而高级定时器一般也是用作通用定时器的功能,下面我们就以通用定时器为例进行讲解,其功能和特点包括: 通用与基本定时器(2~7)位于低速的APB1总线上 高级定时器(1、8)位于高速的APB2总线上 自动装载计

    2024年02月08日
    浏览(56)
  • STM32——定时器——定时中断

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本节先只讲解定时器的定时中断,内外中断源选择。 TIM(Timer)定时器 定时器可以 对输入的时钟进行计数 ,并在计数值达到设定值时触发中断。 16位计数器、预分频器、自动重装寄存器的时基单元 ,

    2024年04月10日
    浏览(50)
  • STM-32:TIM定时中断—定时器定时中断/定时器外部时钟

    定时器可以对输入的时钟进行计数,并在达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等

    2024年02月09日
    浏览(58)
  • STM32 MCU 定时器详解(3)--高级定时器

    16位递增、递减、中心对齐计数器(计数值:0~65535) 16位预分频器(分频系数:1~65536) 可用于触发DAC、ADC 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式 使用外部信号控制定时器且可实

    2024年04月17日
    浏览(49)
  • 定时器详解 -- 定时器中断、PWM输出 --stm32

    STM32F103系列芯片拥有多种定时器,包括基本定时器、通用定时器和高级定时器,每种定时器都具有一些特定的功能。 向上计数:计数器从0计数到自动重装载值(ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 向下计数:计数器从自动重装载值(ARR)开始向下计数

    2024年02月11日
    浏览(63)
  • STM32 MCU 定时器详解(1)--基本定时器

    定时器是一种电子组件,主要用于定时控制,具备精确计时的能力。它可以在设定的时间间隔内触发特定的操作,如发送数据、采集传感器信息、检测输入信号或产生规律性输出波形。这种灵活性使定时器在多个行业中得到广泛应用,支持各种复杂功能的实现,是现代电子系

    2024年02月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包