0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32G4系列芯片定时器的延时输出问题

茶话MCU 来源:茶话MCU 2024-07-01 09:45 次阅读

有人使用STM32G4系列芯片内部的多个定时器做PWM输出,输出频率一样,占空比也一样,均为50%。可是,当他中途调整各个定时器以相同的工作参数,即改变ARR的值和CCR值后,会发现TIM2和TIM5两个定时器要比其它定时器延时等待一段长达20s左右的时间后才恢复正常PWM输出,觉得颇为奇怪。

该用户将芯片系统时钟配置成170MHz,并作为各个片内定时器的时钟源,不做分频后作为各个计数器的计数时钟。

7f18bc9c-36a1-11ef-a4c8-92fbcf53809c.png

起初各个定时器的参数配置如下图左边所示内容,工作起来后,于某时刻将各个定时器的工作参数改成下图右边所示内容。

7f24e206-36a1-11ef-a4c8-92fbcf53809c.png

参数的修改基本在同一时刻完成,可是修改完各定时器的参数后,除了TIM2/TIM5的通道外,其它都能及时地基于新参数产生PWM输出,TIM2/TIM5的输出通道竟然会持续20s左右的低电平后才重新产生基于新参数的PWM输出,怪异得很!

我们这里针对他用到的8个定时器来整理一下。8个定时器中除了TIM2/TIM5是32位定时器外,其它都是16位定时器。时钟源、时基参数、PWM输出配置都一样。另外,他还强调关闭了各定时器的ARR和CCR的预装功能,就是说针对这两个寄存器即改即生效。

现在看来,感觉问题跟定时器的位宽有关。在STM32G4系列芯片里,TIM3是16位TIMER,TIM2是32位TIMER。这里不妨就拿它两个作为代表做下测试,模拟该用户的使用场景,看看是否可以重现问题现象。刚开始,两个定时器使用完全相同的参数配置。【见下图】

7f44abb8-36a1-11ef-a4c8-92fbcf53809c.png

我在代码里随机地修改两个定时器以相同的参数,也依然保持跟用户相同数据。测试发现,很容易遇到修改参数后,TIM2要延时20多秒后才恢复PWM输出的情形。如下图所示:

7f57063c-36a1-11ef-a4c8-92fbcf53809c.png

结合上图示波器输出截图,不难看出,针对TIM2/TIM3修改相同工作参数后,TIM2相对TIM3要延迟一段20多秒的低电平后才恢复PWM输出。见红色长椭圆形所圈出的地方。

其实,如果眼尖细心的人也许发现修改参数后,TIM3也保持了一段低电平时间后才做正常PWM输出,感觉TIM3的PWM输出也并非即该即生效,只是延时相比TIM2短了不少而已。见下图黄色箭头所指位置。

7f761ef0-36a1-11ef-a4c8-92fbcf53809c.png

为什么会这样呢?

我们进一步理一下当前定时器的配置情况。现在两个TIMER除了计数器位宽不一样外,其它的具体配置都是完全一样的。时基参数一样,向上计数模式,PWM1模式,极性选择为高有效。做PWM输出时OC端遵循当CCR大于CNT时输出高,否则输出低电平。显然,两个定时器输出通道的输出规则也是一样的。

7f91beda-36a1-11ef-a4c8-92fbcf53809c.png

那问题到底出在哪里呢?

有个问题我们可能忽略了,那就是我们修改定时器工作参数【这里就是时基参数和CCR值】的时间点。假设现有某定时器处于向上计数模式、自动重装值被设定为ARR_1值后开始计数工作,然后在如下图所示某时刻修改ARR值成ARR_2并立即生效。

7fa075ec-36a1-11ef-a4c8-92fbcf53809c.png

当计数器计到CNT_x位置时成功修改了ARR的值变为ARR_2,此时计数器继续向上计到ARR2后发生溢出后,重装0开始新的计数循环。 但是,如果新的且生效的ARR值ARR_2比当前计数器值【CNT_x】还小会怎么样呢?即像下面图示的样子:

7fc16fd6-36a1-11ef-a4c8-92fbcf53809c.png

此时新的ARR值是ARR_2,不再是ARR_1。可此时的计数器的值CNT_x比新的ARR_2还大,计数器又是向上计数模式。此时计数器如何计数呢?

计数器会依然按照现有计数方向计数:

对于16位宽度的定时器,它会从CNT_x一直计到0xffff时发生溢出,再从0开始计数,计到ARR_2后发生溢出重装,这样周期性地循环计数。显然,如果定时器还做PWM输出的话,从CNT_x到0xffff这段时间的输出不是正常的,或者说不是预期的。

对于32位宽度的定时器,它会从CNT_x一直计到0xffffffff时才发生溢出,再从0开始计数,计到ARR_2后发生溢出重装,这样周期性地循环计数。同样,如果定时器还做PWM输出的话,从CNT_x到0xffffffff这段时间的输出也不是正常的,或者说不是预期的。

也就是说,如果针对工作中的定时器中途成功修改ARR,且修改情形符合上面提到的第二种情形时,就会出现一段并不属于用户控制或用户期望的计数段。自然,这段时间内的PWM输出往往也不是用户预期想要的。这段时间的长短取决于计数器的位宽和计数时钟频率。这个现象不论16位还是32位TIMER都有可能出现,无非时间长短、现象是否明显罢了。这也解释了前面16位TIMER和32位TIMER在成功修改ARR后都可能出现一段不受控或说非预期的计数时间段。

好,拉回我们前面的模拟测试。在测试中发生TIM2长时间暂停PWM输出后才恢复的情形时,我们可以借助调试工具,发现成功修改ARR值时的CNT值要比新的ARR值【11332】大,见下面代码截图【图中数据是16机制】:

7ffc3a62-36a1-11ef-a4c8-92fbcf53809c.png

此时,不论TIM2还是TIM3都要继续往上计数到各自计数宽度所对应的默认计数最大值才基于新的ARR值做循环计数。在这段继续往上计数的时间段内,因为新的CCR值也已经生效且总是小于CNT的值,结合PWM1模式和高有效的极性选择配置,这段时间自然持续保持低电平输出。

80142a6e-36a1-11ef-a4c8-92fbcf53809c.png

前面也说了,是否会出现一段不受控或说非预期的较长计数段跟我们修改TIMER工作参数的时间点有关系。当修改工作参数时间点符合前面分析的第一种情形,即新的ARR值大于当前计数器值时,是不会出现那段不受控或说非预期的较长延时的。比如我在测试代码中,调整修改时间点如下面情形时,就看不到TIM2需要长时间延时后才输出PWM的情况。

8028813a-36a1-11ef-a4c8-92fbcf53809c.png

从上图中不难看出,成功修改完新的ARR值后,当前计数器的值比新的ARR值小。这时计数器只需按照原计数方向计到新的ARR值后溢出重装,开始循环计数。此时也感觉不到PWM输出的明显异常,更看不到长时间无PWM输出的情形。

上面的问题也分析得差不多了,如何避免问题的产生呢?

我们可以开启ARR寄存器的预装功能,这样就可以避免可能出现一段漫长的非预期的计数段。如果不希望开启ARR寄存器的预装功能,而希望随时修改ARR生效,我们可以在修改定时器的工作参数后,通过手动方式对TIMER进行复位,即对TIMER事件发生寄存器的UG位置1,这样除了产生定时器更新事件外,计数器会根据计数模式重装新的计数初值,若是向下计数模式,重装ARR后开始向下计数,其它模式则重装0值后开始向上计数。当然,也可以在修改定时器的工作参数后,直接对CNT赋予0值。

下面代码截图示意随机修改ARR及CCR【此时关闭了二者的预装功能】的情况,每次修改后都让计数器从0开始计数,就完全可以避免可能出现长时间无PWM输出的情况。

80d5b6f2-36a1-11ef-a4c8-92fbcf53809c.png

上面的分析都是基于计数器采用向上计数模式而言的,如果换了计数模式,有些描述可能需相应做调整,但基本意思是一样的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    449

    文章

    48601

    浏览量

    413136
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4960

    浏览量

    210888
  • 计数器
    +关注

    关注

    32

    文章

    2219

    浏览量

    93561
  • 定时器
    +关注

    关注

    23

    文章

    3184

    浏览量

    112701

原文标题:一段莫名的延时输出问题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    stm32G4 H7系列的HRTIM高分辨率定时器可以做捕获输入吗?

    stm32G4,H7系列的HRTIM高分辨率定时器可以做捕获输入吗,如果可以输入引脚在哪。想测量外部脉冲频率600-800KHz,误差尽量小(±10Hz) 有什么方案给推荐一下。谢谢!!
    发表于 03-15 07:33

    STM32G4系列的comp比较的刹车事件和比较中断怎么用?

    STM32G4系列的comp比较的刹车事件和比较中断怎么用
    发表于 04-03 07:33

    STM32G4的应用

    STM32G4系列发布也有一段时间了,但是网上关于G4的开发板一直很少,所以一直想体验一下G4的MCU,在我画板的时候,我已经体验到了G4
    发表于 08-06 07:42

    STM32G4定时器TIM输入捕获频率测量

    摘要本文章基于国信长天M4开发板,讲述了STM32G4 定时器TIM输入捕获频率测量的因通过用,祝各位学生蓝桥杯比赛取得好成绩!M4开发板 频率发生
    发表于 08-16 06:35

    请问一下STM32G4定时器TIM输入捕获频率测量的应用?

    请问一下STM32G4定时器TIM输入捕获频率测量的应用?
    发表于 11-18 07:01

    STM32F4系列基本定时器实现一个延时程序

    STM32F4系列基本定时器TIM6 TIM7前言必须了解定时器时钟频率影子寄存代码设计参考前言在一些需要的情况下软件
    发表于 12-07 11:26

    STM32G4 TIM PWM输出的使用步骤是怎样的?

    STM32G4 TIM PWM输出的使用步骤是怎样的?
    发表于 01-26 06:03

    stm32G4 H7系列的HRTIM高分辨率定时器可以做捕获输入吗?

    stm32G4,H7系列的HRTIM高分辨率定时器可以做捕获输入吗,如果可以输入引脚在哪。想测量外部脉冲频率600-800KHz,误差尽量小(±10Hz) 有什么方案给推荐一下。谢谢!!
    发表于 08-05 06:41

    如何使用STM32G4系列微控制存储和外围设备

    本参考手册面向应用程序开发人员。它提供了关于如何使用STM32G4系列微控制存储和外围设备。 STM32G4
    发表于 09-08 06:59

    PIC32系列参考手册之看门狗定时器、程序监控定时器和上电延时定时器

    本文主要介绍了PIC32系列参考手册之看门狗定时器、程序监控定时器和上电延时定时器
    发表于 06-06 17:29 14次下载

    基于STM32定时器实现毫秒延时函数

    STM32定时器包含基本定时器、通用定时器和高级定时器,其中TIM6和TIM7是STM32当中的
    发表于 10-12 15:54 2.5w次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>实现毫秒<b class='flag-5'>延时</b>函数

    利用STM32F4系列基本定时器延时程序

    STM32F4系列基本定时器TIM6 TIM7前言必须了解定时器时钟频率影子寄存器代码设计参考前言在一些需要的情况下软件延时十分必要,有时为
    发表于 11-24 19:21 35次下载
    利用<b class='flag-5'>STM32</b>F4<b class='flag-5'>系列</b>基本<b class='flag-5'>定时器</b>写<b class='flag-5'>延时</b>程序

    STM32定时器US延时

    定时器”介绍的SysTick定时器,该定时器位于Cortex-M3内核中。外设定时器芯片半导体厂商设计,如
    发表于 12-05 15:36 25次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>US<b class='flag-5'>延时</b>

    STM32H7芯片系列定时器同步启动并输出PWM波形的实现方法

    本文主要研究了STM32H7芯片系列定时器同步启动并输出PWM波形的实现方法。
    的头像 发表于 10-24 14:56 943次阅读
    <b class='flag-5'>STM32</b>H7<b class='flag-5'>芯片</b><b class='flag-5'>系列</b>中<b class='flag-5'>定时器</b>同步启动并<b class='flag-5'>输出</b>PWM波形的实现方法

    STM32如何使用定时器实现微秒(us)级延时

    STM32如何使用定时器实现微秒(us)级延时? 在STM32微控制器中,可以使用定时器实现微秒级延时
    的头像 发表于 11-06 11:05 4183次阅读