ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

重温STM32基础:定时器(2)

重温STM32基础:定时器(2) 文章目录预分频器时序计数器时序影子寄存器预装寄存器计数器有预装和无预装摘要本文讲解 STM32 通用定时器中预分频器PSC与计数器CNT的时序行为重点剖析影子寄存器预装寄存器机制。通过时序图说明改变预分频值后计数频率的变化并对比计数器有预装与无预装两种模式下修改 ARR 的生效差异帮助理解为何需要影子寄存器来避免计数过程中改值导致的异常结果。预分频器时序下面这个图来自于RM。它展示的是在定时器已经被使能后如果改变prescalar计数器的行为。计数器计数频率f ( C K _ C N T ) C K _ P S C 1 P S C f(CK\_CNT) \frac{CK\_PSC}{1PSC}f(CK_CNT)1PSCCK_PSC​.计数器时序计数器溢出频率C K _ C N T _ O V f ( C K _ C N T ) A R R 1 C K _ P S C ( 1 P S C ) ( A R R 1 ) CK\_CNT\_OV \frac{f(CK\_CNT)}{ARR 1} \frac{CK\_PSC}{(1 PSC)(ARR 1)}CK_CNT_OVARR1f(CK_CNT)​(1PSC)(ARR1)CK_PSC​影子寄存器预装寄存器再看一下这个框图上面提到了“影子寄存器”如上的这个通用定时器框图的下面“Note”中对一个特殊的框有说明这个框有阴影在课程中老师称它为“影子寄存器”可能和这个图示有关也叫“缓冲寄存器”。它的意思时“根据控制位的值当U事件发生的时候这个预填装寄存器preload reg的值会送入真正有效的寄存器active reg中”本人的翻译太差了。。。不过可以看出几个意思程序是往preload reg里写值当事件发生一个周期完成preload reg里的值会被送到active reg也就是shadow register中有硬件完成。真正在电路中起效的是shadow reg的值。第二步中的送不送可以由程序来决定。这样做的目的是为了让计数器的更新和正在运行的计数器相关属性的更新错开避免在计数过程中改值导致结果异常和期望的不同。比如假设ARR1000当CNT数到了500时把ARR改成了2000那么周期会变长PWM波形也会异常如果把ARR改成了400那么可能CNT要到0xFFFF溢出之后返回到0x0000新的ARR才会真正生效这个得到的结果显然不是我们想要的。计数器有预装和无预装上图中原本的ARR0xFF当改成0x36则这个ARR立即生效可以看出counter register到了0x36的值就归零了。这个图示情况还正常但是如果我们改成的是0x30可以看出在修改的时候counter register的值已经过了0x30了。那么就有可能counter register会一直增加到0xFFFF溢出从0x0开始然后0x30的ARR才会看上去生效.上图这个例子中开始ARR0xF5后来是把它改成0x36可以发现在修改的时候counter register已经过了0x36了。这个时候counter register一直增加直到以0xF5的ARR为标准上报了事件之后0x36才开始被写入shadow register被电路所用。计数器是否需要preload可以通过ARPE寄存器来设置。STM32这样设计了这种“影子寄存器”机制还是比较严谨的。
返回列表