栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

输入捕获之TIM5中断服务程序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

输入捕获之TIM5中断服务程序

输入捕获实验之 TIM5中断服务函数理解

最近学习STM32输入捕获实验时看源代码,发现TIM5的中断函数有点难以理解。最后终于还是懂了,特此记录,方便以后查阅。

首先源代码如下:

u8 TIM5CH1_CAPTURE_STA = 0;
u16 TIM5CH1_CAPTURE_VAL = 0;
//捕获时的中断服务程序
void TIM5_IRQHandler(void) {
    u16 tsr = TIM5->SR;
    if((TIM5CH1_CAPTURE_STA&0x80)==0)//还未成功捕获
    {
        if(tsr&0x01)//溢出
        { 
            if(TIM5CH1_CAPTURE_STA&0x40)//已经捕获到高电平了
            {
                if((TIM5CH1_CAPTURE_STA&0x3F)==0x3F)//高电平太长了
                {
                    TIM5CH1_CAPTURE_STA|=0x80;//标记成功捕获了一次
                    TIM5CH1_CAPTURE_VAL=0xFFFF;
                } else TIM5CH1_CAPTURE_STA++;
            } 
        }
        if(tsr&0x02)//捕获 1 发生捕获事件
        {
            if(TIM5CH1_CAPTURE_STA&0x40) //捕获到一个下降沿
            {
                TIM5CH1_CAPTURE_STA|=0x80; //标记成功捕获到一次高电平脉宽
                TIM5CH1_CAPTURE_VAL=TIM5->CCR1;//获取当前的捕获值.
                TIM5->CCER&=~(1<<1); //CC1P=0 设置为上升沿捕获
            }else //还未开始,第一次捕获上升沿
            {
                TIM5CH1_CAPTURE_STA=0; //清空
                TIM5CH1_CAPTURE_VAL=0;
                TIM5CH1_CAPTURE_STA|=0x40; //标记捕获到了上升沿
                TIM5->CNT=0; //计数器清空
                TIM5->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
            } 
        } 
    }
    TIM5->SR=0;//清除中断标志位
}

其实到后面我才发现我之所以不能够很好的理解这个函数,是由于我对这个函数什么时候触发有误解,因为这是输入捕获的实验,我们在前面设置了上升沿触发中断,所以我就认为只有上升沿的时候才会触发中断,其实不是这样的,定时器的触发方式不止一种,在定时器中断实验就说明了几种定时器触发的方式,不仅在指定的上升沿或者下降沿的时候会触发中断,还有在计数器溢出的时候会触发中断。(我们再DIER寄存器设置了允许捕获中断和允许更新中断)如果了解了这一点,理解这个函数就很简单了。

首先是TIM5CH1_CAPTURE_STA和TIM5CH1_CAPTURE_VAL两个变量,这是我们用户定义的变量,但是我们把他当成寄存器使用,就是通过TIM5CH1_CAPTURE_STA的各个位数来读取状态,在开发指南上有详细的介绍。主要还是讲解函数部分。

刚进入中断函数时就读取TIM5的控制寄存器。

然后根据TIM5CH1_CAPTURE_STA的第七位判断是否成功捕获了一个输入,只有当未成功捕获时才会触发中断(这个位在main函数中复位,因为每捕获一个脉冲就要通过串口发送消息,发送完消息后再复位,然后进行下一次捕获。),前面已经说了,进入中断服务函数的原因有两个,可能是由于上升沿或者下降沿触发的,也有可能时计数器溢出导致的中断,所以我们得分类讨论。

if(tsr&0x01)//溢出这个if语句下就是当由于溢出触发中断时的处理,如果是由于溢出触发中断,并且已经捕获到了上升沿信号,就应该将溢出计数 加一,但是溢出计数也有可能溢出,如果是这样的话就强制完成捕获。

而if(tsr&0x02)//捕获 1 发生捕获事件则是由于上升沿或者下降沿导致的中断,要么是上升沿导致,要么是下降沿导致,如果是上升沿,则说明要开始计数了,将TIM5CH1_CAPTURE_STA第六位置1,然后清楚其他的相关寄存器,并且设置触发方式为下降沿触发。

如果是下降沿触发,则说明是完成了一次捕获,应该将TIM5CH1_CAPTURE_STA第七位置1,标志着完成了一次捕获,并且获取当前计数器的值。并且设置触发方式为上升沿触发,为下一次做准备。(只有当TIM5CH1_CAPTURE_STA第七位为0的时候才会开始捕获)

在中断函数的最后清除中断标志位,这应该不用解释了吧。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/957836.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号