OpenEdv-开源电子网

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

STM32Mini定时器捕获上升沿 下降沿的问题

[复制链接]

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-8-19
在线时间
42 小时
发表于 2016-1-14 00:00:09 | 显示全部楼层 |阅读模式

(一)摘自例子说STM32的程序的捕获功能
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8 TIM2CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM2CH1_CAPTURE_VAL;//输入捕获值
//定时器 2 中断服务程序
void TIM2_IRQHandler(void)
{
         u16 tsr;
         tsr=TIM2->SR;
         if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
         {
         if(tsr&0X01)//溢出
                 {
                               if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                                     {
                                               if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                                            {
                                                            TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                                            TIM2CH1_CAPTURE_VAL=0XFFFF;
                                                            }

                                else
                                                TIM2CH1_CAPTURE_STA++;
                                       }
                  }
         if(tsr&0x02)//捕获 1 发生捕获事件
               {
                     if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
                              {
                             TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
                             TIM2CH1_CAPTURE_VAL=TIM2->CCR1;//获取当前的捕获值.
                              TIM2->CCER&=~(1<<1); //CC1P=0 设置为上升沿捕获
                              }

                     else //还未开始,第一次捕获上升沿
                              {
                                    TIM2CH1_CAPTURE_VAL=0;

                                    TIM2CH1_CAPTURE_STA=0X40; //标记捕获到了上升沿
                                    TIM2->CNT=0; //计数器清空
                                    TIM2->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
                              }
                }
}
                   TIM2->SR=0;//清除中断标志位
}



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

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-8-19
在线时间
42 小时
 楼主| 发表于 2016-1-14 00:02:49 | 显示全部楼层
(二)-书中所写,TIM2_IRQHandler 是 TIM2 的中断服务函数,该函数用到了两个全局变量,用于辅助实现
高电平捕获。其中 TIM2CH1_CAPTURE_STA,是用来记录捕获状态,该变量类似我们在 usart.c
里面自行定义的 USART_RX_STA 寄存器(其实就是个变量,只是我们把它当成一个寄存器那样
来使用)。 TIM2CH1_CAPTURE_STA 各位描述如表 14.3.1 所示:
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-8-19
在线时间
42 小时
 楼主| 发表于 2016-1-14 00:05:17 | 显示全部楼层
三 我的问题是 (TIM2CH1_CAPTURE_STA&0X40)的TIM2CH1_CAPTURE_STA是跟I/O口没有关联 ,跟寄存器也没有关联,仿真发现其值在没进入中断的时候是零,那么怎么检测上升沿,下降沿的产生呢?
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-8-19
在线时间
42 小时
 楼主| 发表于 2016-1-14 00:06:24 | 显示全部楼层
四 这条语句只是应该检测高低 电平 感觉 并不是检测上升沿下降沿
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-14 17:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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