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

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

3天内不再提示

基于向上计数的单脉冲PWM模式

茶话MCU 来源:ST MCU 信息交流 作者:ST MCU 信息交流 2020-07-12 10:46 次阅读

有人说在MCU的开发应用过程中遇到过一次中断事件触发两次中断的奇怪事情。有这样的事吗?应该说有真有假,这里以STM32为例来聊聊该话题

所谓假的,就是指基于误会以为一次事件触发了两次甚至多次中断。比方按键事件没有做好消抖处理,或者中断请求标志位没有被及时清零等。顺便说下,对于STM32芯片而言,如果中断请求标志没有被清零会没完没了的循环进相应中断服务程序。

这里重点聊聊真的,即一次中断事件进入两次中断服务程序,的确有机会碰到。偶尔也有人反映类似问题,比方做UART通信时,一个空闲事件进入两次空闲中断,感觉相关标志没法清除;有人通过定时器触发SPI传输,一个定时器事件竟然进入两次中断连续给SPI数据寄存器赋值两次。

发生这种一次触发事件进入两次中断的情况时,一般有个非常明显的特征,那就是在中断服务程序里对中断请求标志的清零代码往往放在中断服务程序的最末尾。我们不妨弄个具体的实例感受下。

下面以一个定时器更新中断为例。我让定时器工作在基于向上计数的单脉冲PWM模式,即启动计数器后,当发生溢出产生更新事件时即告停止。那么每次启动定时器后按理有且只有一次进入更新中断服务程序。我在中断服务程序里放个计数变量,统计进入中断的次数。我这里使用STM32F4的开发板测试的。

先看看中断服务程序里清除中断请求标志的代码不是放在最后一行的情况。其中变量counterX用来统计进入中断服务程序次数。

基于向上计数的单脉冲PWM模式

这次测试结果没问题,一次更新事件对应进入一次中断服务程序。我将上面的中断服务程序稍微调整下代码前后顺序,让清除中断请求位的代码放在最后,再看看下面结果。

基于向上计数的单脉冲PWM模式

嗯?counterX结果变为2了,一次触发事件怎么进了两次中断服务程序呢?!

这时不同的人往往会有不同的判断或结论。比方中断请求标志一次清不掉啊;同样的写法别的系列或型号却可以,认为太莫名其妙啦!【其实,到底是不是完全相同的写法只是感觉,就像我上面的写法不细究的话也可以说是一样的写法】,或者说芯片很奇葩啊云云。

怎么会这样呢?原因就在于那行清除中断请求位的代码放在最后,在第一次退出中断服务程序时该请求位尚未完成被清零的状态。程序指令执行速度越快,这种可能性就越高。既然该中断请求位依然保持置1的有效状态,经硬件触发再次进入中断服务程序就顺理成章了。

有人会问,我在退出中断服务程序之前不是已经做了中断请求位的清零操作吗?怎么没有立即生效呢?再怎么“立即”也是需要时间的,程序指令的执行完毕和指令执行后的状态改变并不一定同步。比方你到包子铺去跟老板说买3个馒头,老板满口应诺后,你不能立即扭头就走啊。他还需要点时间来处理,不然一辈子都买不到3个馒头。具体结合到stm32芯片,程序执行是基于哈佛结构的流水线形式,前面代码执行时依然可以执行后序的指令代码。

谈到这里,有人或许想到在清除中断请求位的代码后面加上一句内存屏蔽指令,即DSB。应该说加这个DSB指令是有效的,即该指令前的所有内存访问指令执行完毕后才执行后序指令代码。不过,一般来讲,在这个地方用不着它,我们只须注意别将清除中断请求位的代码放在服务程序的末尾,稍微给清零操作留点实现时间。就像上面打比方买馒头一样,给老板一点为你取馒头的时间就行。

也许有人会说,我中断服务程序里就只需做中断请求位清零这一件事怎么办呢?那你就随便在清零操作代码后面随便一两行无关紧要的代码也行,确保不发生1次事件进两次中断即可。

刚才前面说了,当清除中断请求位的代码放在服务程序最后时,程序指令执行速度越快,一次触发事件进入两次中断服务程序的可能性就越高。我们不妨看看下面基于STM32H7系列的一段中断服务程序代码。是TIM3的更新中断服务程序,截图里的两行代码为中断服务程序的最末两行。注意,清除中断标志的代码没有在最末一行。

基于向上计数的单脉冲PWM模式

其基本功能就是每进一次更新中断,先清中断标志,然后给SPI数据寄存器赋值令其发送一个16位数据。显然,结合我们前面的分析,如果代码这样写一般来讲是不太可能发生一次事件触发2次中断的,事实上当程序代码在FLASH里运行时也的确没有任何问题。

但当将中断服务程序放到RAM里,比方放到DTCM里去运行时发生了功能异常。结果变成了每次更新事件发送的数据不是16位而是32位了。这个32位数据正是因为一次更新事件连续两次进入中断服务程序,两次发送SPI数据。那为什么完全相同的代码在FLASH里运行没这个问题呢,因为代码在DTCM的运行速率要比在FLASH里快,尽管在清中断请求标志的代码后面已经有了兼具延时功能的那句针对SPI数据寄存器的赋值语句,在退出中断前该请求标志位还是未完成清零而再进了一次中断。

看来,这里还得稍微加多点延时以保证中断请求标志在退出中断前被清零。为了避免加延时代码的盲目性,即要么短了要么长了,我们可以使用对标志位的轮询方式,将代码稍加改动变成下面的样子。

基于向上计数的单脉冲PWM模式

之后,再行验证测试都是正常的。若有兴趣的话,可以在清标志位的代码后面加DSB指令验证测试下。
责任编辑:pj

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

    关注

    446

    文章

    47728

    浏览量

    409016
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16003

    浏览量

    343491
  • 计数器
    +关注

    关注

    32

    文章

    2121

    浏览量

    92929
收藏 人收藏

    评论

    相关推荐

    TIM_PWM+DMA输出三个不同占空比的单脉冲,为什么第三个数据总是第一个输出?

    使用TIM_PWM + DMA,DMA传输长度为3,即顺序输出3个不同占空比的单脉冲(10%,20%,50%),三个脉冲输出完成后进入DMA传输完成中断,关闭定时器。通过抓图形发现,实际输出是50%,10%,20%,请问这是为什
    发表于 04-03 07:23

    关于RM0016单脉冲模式设置的问题求解

    在RM0016文档177页,以下是不是多余: Map IC2 on TI2 by writing CC2S = 01 in the TIM1_CCMR2 register。这是输入捕获功能(对于单脉冲模式不需要捕获输入信号TI2),如果不是多余这个设置有什么用?
    发表于 03-14 07:59

    stm32主从定时器门控模式,怎么控制在不产生PWM时从定时器cnt不要计数

    stm32主从定时器,采用门控模式,主定时器用单脉冲模式控制输出。但是我在实验的时候发现其从定时器cnt在主定时器处在低位时仍然计数。请问这是为什么,怎么解决呢? 上图两个是从定时器,我是将从
    发表于 03-12 07:08

    什么是单脉冲点焊和双脉冲点焊?

    什么是单脉冲点焊和双脉冲点焊? 单脉冲点焊和双脉冲点焊是常用于金属焊接的两种焊接方法。单脉冲点焊和双脉冲
    的头像 发表于 02-18 09:29 619次阅读

    STM32的向上计数模式有哪些特点及应用场景?

    计数器从0开始计数,直到达到自动加载值(TIMx_ARR),然后重新从0开始计数
    的头像 发表于 12-13 10:25 304次阅读

    STM32的向上计数模式如何产生计数器溢出事件?

    STM32的向上计数模式的自动加载值是指定时器计数器的最大计数值。当计数器达到这个值时,它会回滚到0并继续计数。这个值可以通过编程设置,通常
    的头像 发表于 12-13 10:22 541次阅读

    简述STM32定时器的计数模式

    STM32的向上计数模式是指定时器的计数器从0开始计数,直到达到自动加载值(TIMx_ARR),然后重新从0开始计数,并产生一个计数器溢出事
    的头像 发表于 12-13 10:09 1596次阅读

    STM8_PWM模式介绍

    使能自动重装载的预装载寄存器(在向上计数模式或中央对称模式中)。由于仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIM1_EG
    发表于 10-10 07:40

    单脉冲和连续的时钟信号有什么区别?

    ,这篇文章将会详细介绍它们之间的差异。 单脉冲时钟信号是指在短时间内以一定的速率发生较短、高速峰值的脉冲信号。它们通常用于时序控制,计数和精确时钟测量系统中。一般而言,单脉冲信号所用的
    的头像 发表于 09-15 16:28 1146次阅读

    如何用jk触发器组成单脉冲发生器

    如何用jk触发器组成单脉冲发生器  单脉冲发生器是一种仅产生一个脉冲的电路,其在数字系统中得到广泛应用,例如计数器中的清零信号,脉冲电路中的
    的头像 发表于 08-24 15:50 1961次阅读

    关于RM0016单脉冲模式设置问题

    在RM0016文档177页,以下是不是多余: Map IC2 on TI2 by writing CC2S = 01 in the TIM1_CCMR2 register。这是输入捕获功能(对于单脉冲模式不需要捕获输入信号TI2),如果不是多余这个设置有什么用?
    发表于 08-08 08:11

    关于单脉冲模式作移相输出

    STM32TIMER实现2号输出波形呢? 我们这里可以考虑使用TIMER的单脉冲模式来实现【当然完全可能有其它方式,此处不表】。下面我使用STM32L476Nucleo板【用哪个系列STM32开发板不重要,都能实现】来演示一下实现过程,重点在配置。 我用TIM3的CH1输出PMW
    的头像 发表于 07-17 10:21 588次阅读
    关于<b class='flag-5'>单脉冲模式</b>作移相输出

    求助,定时器控制器中连续计数模式如何运作?

    连续计数模式计数器会不断由0累加至224-1再回到0重新开始计数,当每次24位向上计数器数值与定时器比较缓存器(TCMPR)值相同时,此时定时器中断事件旗标(TIF)将被硬件设置,并
    发表于 06-27 07:25

    求助,定时器控制器中周期模式如何运作?

    在周期模式中,当每次24位向上计数器数值与定时器比较寄存器(TCMPR)值相同时,此时定时器中断事件旗标(TIF)将被硬件设置并发出中断信号,而24位向上计数器重置为零重新向上计数
    发表于 06-27 07:19

    CH32V103基础教程56-TIM-单脉冲模式

    输出比较模式或者PWM模式下产生 波形。设置控制寄存器1(TIMx_CTLR1)中的OPM位为1将选择在单脉冲模式下,在发生下一次更新事件(清除CEN位)时,
    发表于 04-27 16:53