【话说定时器系列】之五:与影子寄存器预装功能有关的几个案例分享

发布者:czc天天最新更新时间:2023-03-06 来源: zhihu关键字:定时器  影子寄存器 手机看文章 扫描二维码
随时随地手机看文章

STM32定时器中有四个带影子特性的寄存器组【影子+预装】:


- TIMx_PSC 分频寄存器

- TIMx_ARR 自动重装载寄存器

TIMx_CCR 捕捉比较寄存器

-TIMx_RCR 重复计数寄存器


其中ARR、CCR寄存器带预装载使能控制位,PSC、RCR无预装使能控制位,所以对于PSC/RCR实际寄存器的数据更新只能通过更新事件实现从预装寄存器数据到影子寄存器的拷贝更新。


对于ARR/CCR寄存器,当关闭它们的预装载使能位时,用户修改预装寄存器的数据后会立即被拷贝进影子寄存器【实际寄存器】,否则,修改过的预装寄存器的数据只能等到下次更新事件 来完成从预装寄存器数据到影子寄存器的拷贝更新。


这里分享三个跟影子寄存器的预装特性有关的案例,以加深大家的理解。


【案例一】

异常情形:某客户使用到 STM32芯片TIMER1和TIM2,其中使用TIM1做PWM波形输出。使用PWM模式1,向上计数模式,每次在定时器上溢中断里调节CCR寄存器的值,改变波形占空比。


但他发现,当打开定时器2并使能定时器2的中断时会导致TIM1的PWM输出异常的现象。有一定几率出现尖窄脉冲现象。在正常占空比之后出现一个极短的小脉冲。测试中,CCR的比较值读出正常。关闭定时器2则输出正常,未捕捉到小尖脉冲。


【下面的第一个波形是初始波形;第二个波形是修改后的输出波形;第三个波形是计数器计数变化示意图】






先大致分析一下条件及现象:


1、经了解,他关闭了CCR寄存器的预装功能,即修改CCR的数据会立即拷贝到实际影子寄存器而发挥作用;


2、他采用PWM1模式的特性,向上计数,输出极性高有效。这个条件下,当CCR的值比计数器值大时,输出高电平;当CCR的小于或等于计数器的值时,输出低电平。


3、它在更新中断里随机动态修改CCR的值,如果没有其它中断存在。发生TIM1溢出中断时,立即响应并修改CCR的值,由于CCR的预装载功能关闭,所以修改立即生效。下一个周期的波形按新的参数运行。


4、如果有其它中断的存在,且TIM1的溢出更新中断不具备抢占能力,具体到这里,如果TIM1溢出时,TIM2中断正在使用CPU处理事情。那么TIM1中断请求就只能等待TIM2中断事务处理完毕后才有机会修改新的CCR值。但这个等待过程中,TIM1的运行及PWM输出并不会停止,依然按照原来的参数在运行。如果新调整的CCR值比之前的CCR值要大,当TIM1的中断修改完CCR值时,输出波形又刚刚变为低电平不久, 由于新的CCR值比当前计数器的值要大,结合pwm1的输出特性,这时就会出现了尖脉冲的问题。


假设TIM1开始的pwm参数是CCR=100,ARR=300.当TIM1发生溢出中断请求时,TIM2正在处理自己的中断服务程序,而TIM1的中断又不具备抢占能力,假设知道TIM1的计数器记到103时TIM2才释放CPU,显然TIM1的PWM输出刚做完从高到低的跳变,如果此时TIM1的中断服务程序里将CCR的值改为200, 并立即生效。这一改,CCR于计数器的比较结果马上改变了,即在计数器记到200前都是CCR大于计数器的值了,此时对应的输出应该是高电平。所以,刚跳下来的电平,马上又跳高,这时就产生了一个低电平的尖峰脉冲。


当然,如果新修改的CCR值比当前计数器小,那就对当前周期的输出不会有影响,因为在溢出前一直是计数器大于CCR的值。


所以这个尖脉冲是时有时无,其宽度与TIM2释放CPU的时机以及TIM1本身中断服务程序处理时间都有关系。


处理办法:


1. 开启ccr寄存器的预装功能,让其在下一个周期生效发挥作用;


2. 调整TIM1的中断抢占优先级,让其抢占TIM2的中断。


【案例二】

【第一个波形是初始波形;第二个波形是修改后的输出波形;第三个波形是计数器计数变化示意图】




这个案例跟第一个有点类似,这里是在比较中断里动态修改CCR寄存器的值。CCR寄存器的预装功能是关闭的,即修改的数据立即生效。也是PWM波形里偶尔夹杂尖脉冲的问题。



【案例三】

基于ARR寄存器的预装功能的开启或关闭,修改ARR的数据看看相应的PWM输出情形。前提条件还是UP counting + pwm1;极性选择:高有效 。


特别注意下图中的第一种情形。即在关闭ARR的预装功能、向上计数模式的情况下,如果新修改的ARR值小于修改时刻计数器的值,计数器将持续计数到其满量程值,对于16位计数器就计到0xffff,对于32位计数器则计到0xffffffff才发生溢出。这点要特别注意。






前面跟大家分享了几个跟影子寄存器的预装功能有关的案例,希望大家对影子寄存器的预装特性有更深的理解。


关键字:定时器  影子寄存器 引用地址:【话说定时器系列】之五:与影子寄存器预装功能有关的几个案例分享

上一篇:STM32G0技术详解 _ DAC-TIMERS-LPTIM
下一篇:STM32G0技术详解 _ SPI-RTC-ADC

推荐阅读最新更新时间:2024-11-12 23:03

定时器周期计算公式
例如: TIM_TimeBaseStructure.TIM_Period = 10000-1; //当定时器从0计数到10000,即为10000次,为一个定时周期10khz TIM_TimeBaseStructure.TIM_Prescaler = 71; //设置预分频:1us/clk TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频(是对外部时钟TIMXETR进行滤波的) TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 T
[单片机]
<font color='red'>定时器</font>周期计算公式
STM32 通用定时器的定时功能 学习笔记
这节主要讲下STM32 通用定时器的定时功能。 一、TIMx的时钟源问题: STM32有8路寄存器,包括TIM1和TIM8两个高级定时器,TIM6和TIM7两个基本定时器,TIM2-TIM5四个通用定时器,定时器是完全独立的,而且没有互相共享任何资源,它们可以一起同步操作,所有TIMx定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,它可以对另一个处于从模式的定时器的计数器进行复位、启动、停止或提供时钟等操作。其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 1)定
[单片机]
剖析STM32-定时器1
前言 定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。但是,如果你在之前对GPIO、串口通信、外部中断的学习中把这些外设掌握了的话,学习这个新知识并不难。 例本章共计1万余字,从STM32定时器的原理、寄存器介绍、定时器配置以及定时器的几个常用的功能(如定时器中断、定时器输出比较PWM波形、定时器输入捕获测电平长度、定时器编码器模式应用等)的使用方法来教大家掌握定时器这一外设。 一、定时器基本介绍 1. STM32定时器 1、上来说就是用来定时的机器,是存在于STM32单片机中的一个外设。STM32总共有8
[单片机]
剖析STM32-<font color='red'>定时器</font>1
MSP430-定时器寄存器介绍以及测试应用
本文介绍的是MSP430内部的定时器1 测试代码如下: #include io430.h #include in430.h //demo,led闪烁 void Init_TimeA(void); int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; Init_TimeA(); P2DIR = 0XFF; P2OUT = 0XFF; return 0; } void Init_TimeA(void) { TACTL = T
[单片机]
MSP430-<font color='red'>定时器</font>的<font color='red'>寄存器</font>介绍以及测试应用
msp430f2618捕获方波
/*====================================================== 程序名称:TIMERA_CAP 编者 :xxniuren 日期 :2013 7 31 程序目的:用TACCR0定时器来捕获脉宽 ========================================================*/ #include msp430x26x.h #include clock.h #include 12864.h #define uchar unsigned char #define uint unsigned int uint sum_L,sum_H,sum;/
[单片机]
stm32定时器实现60秒定时秒表
#include led.h #include delay.h #include key.h #include sys.h #include lcd.h #include usart.h #include timer.h #include beep.h extern u32 sec; int main(void) { delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Ini
[单片机]
采用查询和中断方式利用单片机定时器T0产生定时脉冲编程
利用定时器T0产生定时脉冲。每隔2ms产生宽度为2个机器周期的正脉冲,由P1.0输出此定时序列脉冲信号(设时钟频率为6MHZ)。 答:首先求出定时器T0初值。由于时钟频率为6MHZ,所以,机器周期为2µs。 因为:t=(213-T0初值)´ 机器周期 所以,当t=2ms时,则:(213-T0初值)´ 2´10-6=2´10-3 解得:T0初值=7096=11011101 11000B,其中将高8位11011101 B=DDH赋给TH0,低5位11000B=18H赋给TL0。 方法一: 采用查询工作方式, 编程 如下: ORG 0000H AJMP MAIN
[单片机]
GD32开发实战指南(基础篇) 第8章 定时器
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 1 PWM输出的工作原理 脉冲宽度调制(PWM) ,是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 GD32 的定时器除了 TIMER5 和 6(基本定时器)。其他的定时器都可以用来产生 PWM 输出。 每个定时器有四个通道,每一个通道都有一个捕获比较寄存器,,将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号)。 在上一节,讲解了定时器
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved