OpenEdv-开源电子网

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

原子大哥求帮忙~关于输入捕获的问题

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-9-14
在线时间
8 小时
发表于 2013-10-16 10:56:57 | 显示全部楼层 |阅读模式

下面是输入捕获中断部分的程序:
#include "timer.h"
#include "led.h"


void TIM2_Cap_Init(u16 arr,u16 psc)
{  
 RCC->APB1ENR|=1<<0;      //TIM2 时钟使能
 RCC->APB2ENR|=1<<2;       //使能 PORTA 时钟  
 GPIOA->CRL&=0XFFFFFFF0;  //PA0  清除之前设置
 GPIOA->CRL|=0X00000008;  //PA0  输入
 GPIOA->ODR|=0<<0;      //PA0  下拉
 TIM2->ARR=arr;         //设定计数器自动重装值
 TIM2->SC=psc;         //预分频器
 TIM2->CCMR1|=1<<0;      //CC1S=01    选择输入端  IC1 映射到 TI1 上
 TIM2->CCMR1|=0<<4;      //IC1F=0000  配置输入滤波器  不滤波
 TIM2->CCMR1|=0<<10;      //IC2PS=00    配置输入分频,不分频
 TIM2->CCER|=0<<1;        //CC1P=0  上升沿捕获
 TIM2->CCER|=1<<0;        //CC1E=1    允许捕获计数器的值到捕获寄存器中
 TIM2->DIER|=1<<1;        //允许捕获中断    
 TIM2->DIER|=1<<0;        //允许更新中断
 TIM2->CR1|=0x01;         //使能定时器 2
 MY_NVIC_Init(2,0,TIM2_IRQChannel,2);//抢占 2,子优先级 0,组 2  
}
 //捕获状态
 //[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=TIM5->CCR1;//获取当前的捕获值.
  TIM2->CCER&=~(1<<1);      //CC1P=0  设置为上升沿捕获
 }else                   //还未开始,第一次捕获上升沿
 {
  TIM2CH1_CAPTURE_STA=0;    //清空
  TIM2CH1_CAPTURE_VAL=0;
  TIM2CH1_CAPTURE_STA|=0X40;  //标记捕获到了上升沿
  TIM2->CNT=0;          //计数器清空
  TIM2->CCER|=1<<1;          //CC1P=1  设置为下降沿捕获
 }
  }                  
}
 TIM2->SR=0;//清除中断标志位    
}


 


 

上面那个程序用MINI板测试没有问题,现在我不想捕获PA0的高电平时间想捕获如PA7的高电平时间该怎么改,还有就是IC1映射到TI1上不太懂,文档中让看下面的图,我是新手看不太懂~~

 

 

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-16 11:38:04 | 显示全部楼层
PA7是TIM3_CH2,你要用PA7,那就用TIM3_CH2,也就是定时器3的通道2来做。
至于如何改,我想你先学会我们的例程,再去自己改比较好。
IC1映射到TI1,因为还可以映射到TI2,所以要选择是TI1,还是TI2.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-9-14
在线时间
8 小时
 楼主| 发表于 2013-10-17 09:31:33 | 显示全部楼层
IC1映射我懂了,当时为什么定时器3通道2就是PA7呢 这个没在文档里找到啊,外部中断那个我懂如 EXTI15_10_IRQHandler()
当时定时器的该怎么写。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-17 11:20:41 | 显示全部楼层
回复【3楼】xp199372:
---------------------------------
看datasheet,pin description部分。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 03:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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