OpenEdv-开源电子网

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

STM32输入捕获的问题

[复制链接]

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
发表于 2016-2-19 15:21:12 | 显示全部楼层 |阅读模式
1金钱
STM32输入捕获(非PWM)时,当设置为上升沿捕获时,第一个上升沿来的时候,CNT寄存器会清零么?  因为PWM模式会清零

最佳答案

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

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 16:26:31 | 显示全部楼层
本帖最后由 yxazxw 于 2016-2-19 16:28 编辑

但是现在问题又来了,为什么我设置的是通道4的上升沿捕获中断,但是现在我觉得却是按照定时器的频率进中断呢?我感觉是我的通道4采集的是定时器自己的上升沿脉冲,这是怎么一回事啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-2-19 15:21:13 | 显示全部楼层
不会清零.
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 15:21:31 | 显示全部楼层
顶顶顶顶顶顶顶顶顶顶顶顶
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-19 15:26:20 | 显示全部楼层
记得似乎是不清零。
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 15:30:26 | 显示全部楼层
本帖最后由 yxazxw 于 2016-2-19 15:32 编辑

还有我的这个输入捕获配置的有问题么?我配置输入捕获后定时器就不走了,程序也死在那了,不知道什么问题,请教大神!!

[mw_shl_code=c,true]void TIM2_Configuration(u16 Period , u16 Prescaler)
{
        TIM_ICInitTypeDef  TIM_ICInitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
           GPIO_InitTypeDef GPIO_InitStructure;                  
   //输入捕获引脚PA.3
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA , &GPIO_InitStructure);
   //485选择 ,1 发送 ,0 接收
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽式输出
        GPIO_Init(GPIOE,&GPIO_InitStructure);        
        
        GPIO_ResetBits(GPIOE,GPIO_Pin_5);

   
   //定时器计时
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);           //清空中断
        TIM_TimeBaseStructure.TIM_Period = Period;        //装初值 ,范围 0--0xffff
        TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;         //预分频值        72M/72,1uS一次计数
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;         //时钟分割值
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         //向上计数模式           0->2000
        TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);        //结构体初始化
        TIM_ARRPreloadConfig(TIM2,ENABLE);                                   //失能重装载寄存器

   //输入捕获
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;                     //通道4 ,如果设置直接映射就是TI1
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //捕获上升沿有效
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//对应的中断映射  IC2映射到TI2上
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;                 //不分频          TI4是TIMx_CH4,因为是直连模式
        TIM_ICInitStructure.TIM_ICFilter = 0x0;                                                 //不滤波
        TIM_ICStructInit(&TIM_ICInitStructure);
        
////        TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);                          //计数器在触发(TRGI)的上升沿开始
////        TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);  //启动定时器的被动触发
//        
        TIM_ITConfig(TIM2, TIM_IT_CC4 , ENABLE);         //使能输入捕获通道4的中断
        TIM_Cmd(TIM2, ENABLE);          //使能定时器2

}

[/mw_shl_code]
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 15:34:36 | 显示全部楼层
ricefat 发表于 2016-2-19 15:26
记得似乎是不清零。

那我为什么配置捕获后,程序就死了呢,大腿
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-19 15:37:59 | 显示全部楼层
yxazxw 发表于 2016-2-19 15:34
那我为什么配置捕获后,程序就死了呢,大腿

只有第一次捕获成功定时器才会开始走吧
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-19 15:42:51 | 显示全部楼层
yxazxw 发表于 2016-2-19 15:34
那我为什么配置捕获后,程序就死了呢,大腿

死哪了,是死在中断了吧 贴中断函数啊
我有故事,你有酒吗
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 15:49:25 | 显示全部楼层
来俩不甜的 发表于 2016-2-19 15:42
死哪了,是死在中断了吧 贴中断函数啊

刚刚试了下,确实不开中断(没有这一句TIM_ITConfig(TIM2, TIM_IT_CC4 , ENABLE);)就不会死了,可是中断里我什么也没做啊,空的
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 15:49:50 | 显示全部楼层
void TIM2_IRQHandler(void)                   //B码每个码元10ms左右
{

}
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 15:52:04 | 显示全部楼层
ricefat 发表于 2016-2-19 15:37
只有第一次捕获成功定时器才会开始走吧

这样啊,那就是说设置捕获后,只有触发捕获定时器才工作?
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-19 15:57:16 | 显示全部楼层
yxazxw 发表于 2016-2-19 15:49
刚刚试了下,确实不开中断(没有这一句TIM_ITConfig(TIM2, TIM_IT_CC4 , ENABLE);)就不会死了,可是中断 ...

出不来了,你清一下中断标志位(貌似是这么叫)
我有故事,你有酒吗
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-19 15:59:59 | 显示全部楼层
yxazxw 发表于 2016-2-19 15:49
刚刚试了下,确实不开中断(没有这一句TIM_ITConfig(TIM2, TIM_IT_CC4 , ENABLE);)就不会死了,可是中断 ...

if(TIM_GetITStatus(TIM2,TIM_IT_CC4) !=RESET)
TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);
我有故事,你有酒吗
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 16:00:54 | 显示全部楼层
来俩不甜的 发表于 2016-2-19 15:57
出不来了,你清一下中断标志位(貌似是这么叫)

void TIM2_IRQHandler(void)                   //B码每个码元10ms左右
{
        TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);
}
不行啊。。。
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 16:02:52 | 显示全部楼层
来俩不甜的 发表于 2016-2-19 15:59
if(TIM_GetITStatus(TIM2,TIM_IT_CC4) !=RESET)
TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);

原来是我写错了,TIM2我写成TIM4了,醉了
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-19 16:06:35 | 显示全部楼层
yxazxw 发表于 2016-2-19 16:00
void TIM2_IRQHandler(void)                   //B码每个码元10ms左右
{
        TIM_ClearITPendingBit(TIM4, TIM_IT_CC4); ...

那就在中断里边读一下  捕获比较寄存器的值
我有故事,你有酒吗
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 16:07:32 | 显示全部楼层
本帖最后由 yxazxw 于 2016-2-19 16:37 编辑
ricefat 发表于 2016-2-19 15:37
只有第一次捕获成功定时器才会开始走吧

但是现在问题又来了,为什么我设置的是通道4的上升沿捕获中断,但是现在我觉得却是按照定时器的频率进中断呢?我感觉是我的通道4采集的是定时器自己的上升沿脉冲,这是怎么一回事啊
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
 楼主| 发表于 2016-2-19 16:08:03 | 显示全部楼层
本帖最后由 yxazxw 于 2016-2-19 16:38 编辑
来俩不甜的 发表于 2016-2-19 15:59
if(TIM_GetITStatus(TIM2,TIM_IT_CC4) !=RESET)
TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);






   但是现在问题又来了,为什么我设置的是通道4的上升沿捕获中断,但是现在我觉得却是按照定时器的频率进中断呢?我感觉是我的通道4采集的是定时器自己的上升沿脉冲,这是怎么一回事啊
回复

使用道具 举报

0

主题

63

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2016-2-22 08:49:43 | 显示全部楼层
表示关注一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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