OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4673|回复: 4

有没有大佬帮忙看一下这个捕获是啥问题,为啥一直进不去中断

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2022-6-16
在线时间
11 小时
发表于 2022-7-21 16:48:32 | 显示全部楼层 |阅读模式
5金钱
void TIM3_Cap_Init(u16 arr,u16 psc)
{
          TIM_ICInitTypeDef TIM3_ICInitStructure;
          GPIO_InitTypeDef GPIO_InitStructure;
      TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //①使能 TIM2 时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //①使能 GPIOA 时钟
//初始化 GPIOA.0 ①
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA3 设置
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //PA0 输入
                GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIOA.3
//②初始化 TIM2 参数
                TIM_TimeBaseStructure.TIM_Period = arr-1; //设定计数器自动重装值
                TIM_TimeBaseStructure.TIM_Prescaler =psc-1; //预分频器
                TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
                TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化 TIMx
                //③初始化 TIM2 输入捕获通道 1
                TIM3_ICInitStructure.TIM_Channel = TIM_Channel_4; //选择输入端 IC1 映射到 TI1 上
                TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
                TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
                TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
                TIM3_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
                TIM_ICInit(TIM3, &TIM3_ICInitStructure); //初始化 TIM2 输入捕获通道 1
                //⑤初始化 NVIC 中断优先级分组
                NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM2 中断
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
                NVIC_Init(&NVIC_InitStructure); //初始化 NVIC
                TIM_ITConfig( TIM3,TIM_IT_Update|TIM_IT_CC4,ENABLE);//④允许更新中断捕获中断
                TIM_Cmd(TIM3,ENABLE ); //⑥使能定时器 2

}
void TIM3_IRQHandler(void)
{
           if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//更新中断
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
                if((count_cap==1) || (count_cap==2))//高电平捕获
                {
                        runoff1++;
                }
                if((count_cap==2) || (count_cap==3))//低电平捕获
                {
                        runoff2++;
                }
        }
        if(TIM_GetITStatus(TIM3, TIM_IT_CC4)!= RESET)//捕获中断
        {
                LED2_ON;
                count_cap++;
                TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
                if((count_cap==1) && (flag==0))//第一次捕获到高电平
                {
                        t1=TIM_GetCapture4(TIM3);//获取计数器当前值
                        TIM_OC4PolarityConfig(TIM3,TIM_ICPolarity_Falling);//设置为下降沿触发

                }
                if((count_cap==2) && (flag==0))//第二次捕获到低电平
                {
                        t2=TIM_GetCapture4(TIM3);//获取计数器当前值
                        TIM_OC4PolarityConfig(TIM3,TIM_ICPolarity_Rising);//设置为上升沿触发
                }
                if((count_cap==3) && (flag==0))//第三次捕获到高电平
                {
                        t3=TIM_GetCapture4(TIM3);//获取计数器当前值
                        TIM_Cmd(TIM3, DISABLE);//停止计数
                        TIM_SetCounter(TIM3, 0);//清空计数器
                        flag=1;//一次捕获完成
                }
        }
       
}
//获取频率
//单位:Hz
//返回0:未成功捕获
u32 Get_Fv(void)
{
        u32 fv=0;
        if(flag==1)//捕获完成
        {
                fv=(65536-t1)+t2+65536*(runoff1-1)+(65536-t2)+t3+65536*(runoff2-1);//us
                fv=1000000/fv;
                //开始下次捕获
                flag=0;
                count_cap=0;//开始下次捕获
                runoff1=0;
                runoff2=0;
                TIM3->CNT = 0;//计数器清空
                TIM_Cmd(TIM3,ENABLE);//停止计数//开始计数
        }
        return fv;
}
//获取占空比
//返回0:未成功捕获
u16 Get_Duty(void)
{
        u16 Duty=0;
        u32 high=0;
        u32 low=0;
        if(flag==1)//捕获完成
        {
                high=(65536-t1)+t2+65536*(runoff1-1);
                low=(65536-t2)+t3+65536*(runoff2-1);
                Duty=100*high/(high+low);
                //开始下次捕获
                flag=0;
                count_cap=0;//开始下次捕获
                runoff1=0;
                runoff2=0;
                TIM3->CNT = 0;//计数器清空
                TIM_Cmd(TIM3,ENABLE);//开始计数
        }
        return Duty;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2022-6-16
在线时间
11 小时
 楼主| 发表于 2022-7-21 18:02:07 | 显示全部楼层
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2022-6-16
在线时间
11 小时
 楼主| 发表于 2022-7-21 18:53:30 | 显示全部楼层
测量的精度还是有问题
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2022-6-16
在线时间
11 小时
 楼主| 发表于 2022-7-21 18:54:13 | 显示全部楼层
有哪个大佬有解决方法吗
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2022-7-21
在线时间
2 小时
发表于 2022-7-21 20:16:30 | 显示全部楼层

怎么解决的?我也一直进不去中断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-26 18:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表