OpenEdv-开源电子网

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

关于STM32F1原子哥视频讲的输入捕获实验代码是不是有错误的

[复制链接]

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-5-14
在线时间
3 小时
发表于 2021-7-24 19:00:43 | 显示全部楼层 |阅读模式
本帖最后由 中投靓仔 于 2021-7-24 19:07 编辑


u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值

//定时器5中断服务程序         
void TIM5_IRQHandler(void)
{

         if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获        
        {         
                if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
                 
                {            
                        if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;
                                }else TIM5CH1_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {        
                        if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
                        {                                 
                                TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
                                TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM5CH1_CAPTURE_STA=0;                        //清空
                                TIM5CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM5,0);
                                TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                    
         }

    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

}




该代码中,如果我一直长按不停,超过了最长的高电平长度,便会自动输出temp,然后TIM5CH1_CAPTURE_STA = 0(主函数中)。但是此时还是属于高电平,我松手后,检测到下降沿,它又自动开始计数了,接着会再跳出一个最长高电平的数值。但我松手以后是没有进行任何操作的。这个是不是因为原子哥的代码缺陷?


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

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-5-14
在线时间
3 小时
 楼主| 发表于 2021-7-24 19:06:27 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2022-2-28
在线时间
1 小时
发表于 2022-4-1 17:13:45 | 显示全部楼层
中投靓仔 发表于 2021-7-24 19:06
补充一张XCOM的图片

我也碰到这个问题,感觉有错误
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2022-7-5
在线时间
26 小时
发表于 2022-7-22 11:48:32 | 显示全部楼层
不只这个,捕获时间感觉也不对
回复 支持 反对

使用道具 举报

10

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
486
金钱
486
注册时间
2019-12-6
在线时间
151 小时
发表于 2023-8-30 16:04:42 | 显示全部楼层
人家视频里不是说了吗,最多只能长按4点多秒,否则就不准,或者出现其他的问题,如果想长按长时候还有效,就在中断里处理
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2023-3-28
在线时间
5 小时
发表于 2023-10-16 16:31:09 | 显示全部楼层
中投靓仔 发表于 2021-7-24 19:06
补充一张XCOM的图片

不是这个错了,我感觉是后面错了,后面更新中断需要检测到中断溢出次数才能加1,不产生中断进不去函数,所以溢出次数最大只能是1次,你算一下看看溢出一次最大值是多少
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 15:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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