首页 > 其他分享 >stm32影子寄存器、预装载寄存器,TIM_OC1PreloadConfig和TIM_ARRPreloadConfig的作用

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

时间:2024-06-24 09:54:08浏览次数:19  
标签:影子 ARR TIM 预装 修改 寄存器

一直没搞清楚stm32定时器的TIM_OC1PreloadConfig、TIM_ARRPreloadConfig函数的作用,影子寄存器、预装载寄存器、重载寄存器的概念。今天来研究一下:

图中有阴影的小方框,代表该功能对应的寄存器有影子寄存器,也就是:PSC预分频器、自动重装载寄存器、REP寄存器和4个通道的捕获/比较寄存器。

可以看到这几个寄存器都是经常用到的,而且存在定时器工作过程中修改他们的可能性。在定时器工作过程中修改他们的值,就会出现一个问题了:如果上次ARR的值是200,通道1的比较寄存器CCR1值是100,产生占空比为50%的PWM。这个时候我要改变PWM的频率,我把ARR的值改为100,CCR1的值还没来得及更改,那么占空比肯定就会出问题,所以我就需要让他们同步修改。以前ARR=200,CCR1=100,提高频率后ARR=100,CCR1=50,我需要这两个寄存器的值同步修改,最好还是让他们计数完一个周期后再修改,那么进入下一个周期ARR、CCR1同步修改过去,对PWM的占空比就没有一点影响了。

为了达到这个目的,就得先用一个寄存器A把修改的值保存好(ARR_A=100,CCR1_A=50),一旦上一个周期结束,给一个信号,立即就把寄存器A的值赋值过去,立即生效,这样就完成了最理想的在定时器运行中修改寄存器的过程。下面对应到stm32中:

有影子寄存器的寄存器实际上对应了两个寄存器:一个是用户可以写入或读出数据的寄存器,称为preload register(预装载寄存器),另一个是用户看不见的、但在操作中真正起作用的寄存器称为shadow register(影子寄存器)。我们修改的定时器周期、预分频系数、通道的比较值等都是修改的表面那个预装载寄存器,要让这个修改起作用,就还要把预装载寄存器的值赋给影子寄存器才行。

从ARR预装载寄存器传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx->CR1中的“APRE”位:
APRE=0,当ARR值被修改时,同时马上更新影子寄存器的值;
APRE=1,当ARR值被修改时,必须在下一次事件UEV发生后才能更新影子寄存器的值;
这就是TIM_ARRPreloadConfig(TIM1, ENABLE);函数的作用:

4个通道的捕获/比较寄存器也是同样的道理,从CCRx的预装载寄存器传送到影子寄存器由下面的位控制:

 

 

 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);函数的作用就是修改这个位

再给几个时序图:

1、APRE=0,直接给ARR影子寄存器赋值的情况:

 

 

2、APRE=1,在下一个周期再更新值的情况:

可以看到之前ARR=F5,这个时候修改ARR的值为36,只有表面的重加载寄存器值更改了,真正起作用的影子寄存器并没有更改。等到上一个周期结束,发生更新事件,影子寄存器才更改。

3、调节频率:
①通过更改预分频器的值,改变计数器的频率的方式改变PWM波的频率
在STM32F103中有封装好的调节预分频器的函数 TIM_PrescalerConfig();直接调用即可。
TIM_PrescalerConfig()的介绍以及参数形式如下图

 

标签:影子,ARR,TIM,预装,修改,寄存器
From: https://www.cnblogs.com/huangyangquan/p/18264402

相关文章

  • [题解]CF622D Optimal Number Permutation
    思路首先考虑答案下界,因为\((n-i)\)和\(|d_i+i-n|\)均大于等于\(0\),所以它们相乘一定大于等于\(0\)。于是考虑能不能构造出结果为\(0\)。显然当\(i=n\)时,无论\(d_i\)的值是什么,式子的结果为\(0\)。因此只需要考虑\(i\in[1,n)\)的情况。因为要使结果为......
  • lazarus调用Onnxruntime
    一、下载OnnxruntimeGitHub-microsoft/onnxruntime:ONNXRuntime:cross-platform,highperformanceMLinferencingandtrainingaccelerator注意win7运行时会出错。可以下载 https://pan.baidu.com/s/18gIMP7r3lZAmgUTj4H2ugA?pwd=6666 编译好的可在win7下使用。还......
  • 66Uptime – 网站服务器 & Cronjob 监控工具 v35.0.0扩展中文版安装
    66Uptime是一款自托管、易于使用、轻量级且高性能的网站服务器和Cronjob监控工具。以其丰富的功能和便捷的管理方式,为用户提供了全方位的网站服务器和Cronjob监控解决方案:主要功能:监控网站服务器和Cronjob的运行状态,确保它们持续稳定运行。提供从多个位置检查显示器的功......
  • 寄存器
    一、1、通用寄存器32位寄存器可以分为后面那个16位寄存器的,16位的还可以分成两个八位的2、mov的语法3、指令(1)mov指令(详见2)(2)add指令(3)sub指令(4)and指令 (5)or指令 (6)xor指令 (7)not指令  ......
  • jmeter中beanshell-regex用法-prev.getTime()
    jmeter-beanshellPostprocessor,实现需求:判断响应时间大于10ms的响应,并记录想要的响应字段,比如流水号,注册的用户名密码等代码如下:importjava.util.regex.Matcher;importjava.util.regex.Pattern;//这里引入判断响应时间的代码,如判断响应时间超过10ms,则记录流水号longresp......
  • DRF 报错:RuntimeError: Model class django.contrib.contenttypes.models.ContentType
    该错误发生于将'django.contrib.contenttypes'注释之后该组件的功能见如下链接:https://www.cnblogs.com/xiugeng/p/9831665.htmldrf的APIView内部会走认证源码,相关代码导致的报错,怎么解决呢?就是在settings.py中配置上如下两个参数(匿名用户和认证)即可:https://www.cnblogs.com/N......
  • STM32互补PWM模拟(带有Dead Time)
    目录前言一、时基单元基本概念二、时基单元CNT计数模式三、互补PWM模拟1.中央对其计数模式2.引脚模式选择3.输出结果总结前言本文介绍了互补PWM的概念,并且能够使用通用定时器和高级定时器模拟出互补PWM的波形,并且能够调控输出波形占空比和死区时间(DeadTime)。一......
  • golang runtime.Caller 获取调用堆栈信息, Caller(1) 和 Caller(2) 的区别
     funcwhoCalledMe(){//获取调用堆栈信息_,fileName,lineNo,ok:=runtime.Caller(2)if!ok{fmt.Println("Failedtogetcallerinformation")return}fmt.Printf("Calledfrom:%s:%d\n",fileName,lineNo......
  • [题解]AT_abc253_g [ABC253G] Swap Many Times
    思路首先,不难看出一个规律,就是对于一个序列\(a\),如果它将操作所有以\(x\)为第一关键字的二元组,那么序列的\(a_{x\simn}\)将循环右移一位。(注意,在这里的\(x\)指的是在\(1\sim(n-1)\)中的任意一个定值)那么,我们就可以将编号分别为\(l\simr\)的这些二元组分为三......
  • 超越datetime:Arrow,Python中的日期时间管理大师
    介绍Arrow是一个Python库,它提供了一种合理且对人类友好的方法来创建、操作、格式化和转换日期、时间和时间戳。它实现了对datetime类型的更新,填补了功能上的空白,提供了一个智能的模块API,支持许多常见的创建场景。简单来说,它可以帮助您使用更少的导入和更少的代码来处理日期和时间......