打印
[STM32F4]

程序一直停留在定时器中断

[复制链接]
654|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pangb|  楼主 | 2020-2-16 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器3作输入捕获,程序一直停留在定时器中断

使用特权

评论回复
沙发
huwr| | 2020-2-16 16:41 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
pangb|  楼主 | 2020-2-16 16:45 | 只看该作者
程序是参考网上的一些程序,但是程序程序停留在中断里面了—— if(TIM3CH3_CAPTURE_STA&0X40)//已经捕获到高电平了
void TIM3_Cap_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM3_ICInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);        //开启TIMER3的时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource2, GPIO_AF_TIM3);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_8);


        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler = psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);


        TIM3_ICInitStructure.TIM_Channel = TIM_Channel_3;                //选择通道1
        TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;                //有效捕获极性为上升沿
        TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        TIM3_ICInitStructure.TIM_ICFilter = 0;
        TIM_ICInit(TIM3,&TIM3_ICInitStructure);


        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC3,ENABLE);
        TIM_Cmd(TIM3,ENABLE);
}
        uint8_t  TIM3CH3_CAPTURE_STA = 0;        // 输入捕获状态
        uint16_t  TIM3CH3_CAPTURE_VAL;                // 输入捕获值



void TIM3_IRQHandler(void)
{
        if((TIM3CH3_CAPTURE_STA&0X80) == 0)                //还未成功捕获
        {
    if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
    {
          if(TIM3CH3_CAPTURE_STA&0X40)//已经捕获到高电平了
          {
                 if((TIM3CH3_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                 {
                         TIM3CH3_CAPTURE_STA|=0X80;//标记成功捕获了一次
                         TIM3CH3_CAPTURE_VAL = 0XFFFF;
                 }
                 else
                         TIM3CH3_CAPTURE_STA++;
                        }
        }
            if(TIM_GetITStatus(TIM3,TIM_IT_CC3) !=RESET)
            {
                    if(TIM3CH3_CAPTURE_STA & 0x40)
                    {
                            TIM3CH3_CAPTURE_STA |= 0X80;        //标记成功捕获到一次
                            TIM3CH3_CAPTURE_VAL = TIM_GetCounter(TIM3);
                            TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Rising);                //CC3P = 0sz设置为上升沿捕获
                    }
                    else
                    {
                            TIM3CH3_CAPTURE_STA = 0;        //标记成功捕获到一次
                            TIM3CH3_CAPTURE_VAL = 0;
                            TIM_SetCounter(TIM3,0);
                            TIM3CH3_CAPTURE_STA|=0X40;
                            TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                    }
            }
    }
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC3|TIM_IT_Update);
}


void TIM3_Cap_run(void)
{
                uint32_t temp = 0;

//                delay_10ms();
                if(TIM3CH3_CAPTURE_STA & 0X80)//成功捕获了一次上升沿
                {
                        temp = TIM3CH3_CAPTURE_STA & 0x3F;
                        temp *= 65536;
                        temp += TIM3CH3_CAPTURE_VAL;        // 得到总的高电平时间
                        printf("HIGH:%d us\r\n",temp);        // 打印总的高电平时间
                        TIM3CH3_CAPTURE_STA = 0;                // 开启下一次捕获
                }

}

请问各位大神,这程序是哪儿有问题,芯片是STM32F407ZG.

使用特权

评论回复
地板
chenho| | 2020-2-16 16:48 | 只看该作者

清除中断标志

使用特权

评论回复
5
chuxh| | 2020-2-16 16:51 | 只看该作者
确实是没有清理,所以一直中断。

使用特权

评论回复
6
stly| | 2020-2-16 16:55 | 只看该作者
TIM_ClearITPendingBit(TIM3, TIM_IT_CC3|TIM_IT_Update); 中断里的这句代码不是清中断标志吗

使用特权

评论回复
7
pengf| | 2020-2-16 16:58 | 只看该作者
检查下是否清除了相关中断请求位

使用特权

评论回复
8
yszong| | 2020-2-16 17:03 | 只看该作者
自己开启了哪些中断要清楚

使用特权

评论回复
9
jiahy| | 2020-2-16 17:06 | 只看该作者
这个调试环境下不难判断

使用特权

评论回复
10
ousj| | 2020-2-16 17:10 | 只看该作者
硬件上是否在频繁触发中断;

使用特权

评论回复
11
zyf部长| | 2020-2-16 17:13 | 只看该作者
只是频繁触发也不会出不了中断的

使用特权

评论回复
12
pangb|  楼主 | 2020-2-16 17:16 | 只看该作者
我现在已进入中断,程序就跑飞了,是怎么回事?

使用特权

评论回复
13
wangpe| | 2020-2-16 17:21 | 只看该作者
跑飞是指什么 你已经不知道跑到哪里去了?

使用特权

评论回复
14
pangb|  楼主 | 2020-2-16 17:24 | 只看该作者

我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
15
wenfen| | 2020-2-16 17:29 | 只看该作者
8253这么老的芯片,没有也很正常啊;

使用特权

评论回复
16
jiahy| | 2020-2-16 17:31 | 只看该作者
自己根据8253的寄存器资料编程序好了?

使用特权

评论回复
17
zhaoxqi| | 2020-2-16 17:34 | 只看该作者
不知道用FSMC读取8253是否可行,研究中

使用特权

评论回复
18
lizye| | 2020-2-16 17:39 | 只看该作者
楼主最后用fsmc操作8253了吗?可行吗?我现在也有这样的需求,不知道可行不

使用特权

评论回复
19
jiaxw| | 2020-2-16 17:41 | 只看该作者
不如把8253换成CPLD或FPGA

使用特权

评论回复
20
spark周| | 2020-2-16 17:43 | 只看该作者
电路不想搞的太复杂,打算用8253,不知道用fsmc能不能操作,看时序好像没问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

701

主题

7643

帖子

6

粉丝