OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 981|回复: 2

求一段F407多通道输入捕获的代码(寄存器版)

[复制链接]

  离线 

1

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
25
金钱
25
注册时间
2015-6-12
在线时间
0 小时
发表于 2015-6-12 16:44:22 | 显示全部楼层 |阅读模式
5金钱
求一段F407多通道输入捕获的代码(寄存器版),已经卡在此地好久了,没有个明白人给指点一下,自己编的代码不报错,就是不工作,不胜感激涕零呀
[C] 纯文本查看 复制代码
void TIM5_CH2_Cap_Init(u32 arr,u16 psc)
{		 
	RCC->APB1ENR|=1<<3;   	//TIM5 时钟使能 
	RCC->AHB1ENR|=1<<0;   	//使能PORTA时钟	
	GPIO_Set(GPIOA,PIN1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//复用功能,下拉
	GPIO_AF_Set(GPIOA,1,2);	//PA1,AF2,TIM5-CH2 qinhao
	  
 	TIM5->ARR=arr;  		//设定计数器自动重装值   
	TIM5->PSC=psc;  		//预分频器 

	TIM5->CCMR1|=1<<8;		//CC2S=01 	选择输入端 IC2映射到TI2上
 	TIM5->CCMR1|=0<<12; 		//IC2F=0000 配置输入滤波器 不滤波
 	TIM5->CCMR1|=0<<10; 	//IC2PSC=00 	配置输入分频,不分频 

	TIM5->CCER&=~(1<<5);		//CC2P=0	上升沿捕获
	TIM5->CCER|=1<<4; 		//CC2E=1 	允许捕获计数器的值到捕获寄存器中

	TIM5->EGR=1<<0;			//软件控制产生更新事件,使写入PSC的值立即生效,否则将会要等到定时器溢出才会生效!
	TIM5->DIER|=1<<2;   	//允许捕获2中断				
	TIM5->DIER|=1<<0;   	//允许更新中断	
	TIM5->CR1|=0x01;    	//使能计数器
	MY_NVIC_Init(2,1,TIM5_IRQn,2);//抢占2,子优先级1(CH1为0),组2	   
}
u8  TIM5CH2_CAPTURE_STA=0;	//输入捕获状态		    				
u32	TIM5CH2_CAPTURE_VAL;	//输入捕获值(TIM2/TIM5是32位)
//定时器5中断服务程序	 
void TIM5_IRQHandler(void)//添加到原中断服务子函数里去--qinhao
{ 		    
	u16 tsr;
	tsr=TIM5->SR;
 	if((TIM5CH2_CAPTURE_STA&0X80)==0)//还未成功捕获	
	{
if(tsr&0X01)//溢出更新中断
		{	     
			if(TIM5CH2_CAPTURE_STA&0X40)//已经捕获到上升沿
			{
				if((TIM5CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
				{
					TIM5CH2_CAPTURE_STA|=0X80;		//标记成功捕获了一次
					TIM5CH2_CAPTURE_VAL=0XFFFFFFFF;
				}else TIM5CH2_CAPTURE_STA++;
			}	 
		}
		if(tsr&0x04)//捕获2发生捕获事件--qinhao
		{	
			if(TIM5CH2_CAPTURE_STA&0X40)		//则表示本次捕获到一个下降沿 		
			{	  			
				TIM5CH2_CAPTURE_STA|=0X80;		//标记成功捕获到一次高电平脉宽
			    TIM5CH2_CAPTURE_VAL=TIM5->CCR2;	//获取当前的捕获值.CCR2
	 			TIM5->CCER&=~(1<<5);			//CC2P=0 设置为上升沿捕获
			}else  								//第一次捕获到上升沿
			{
				TIM5CH2_CAPTURE_STA=0;			//清空
				TIM5CH2_CAPTURE_VAL=0;
				TIM5CH2_CAPTURE_STA|=0X40;		//标记捕获到了上升沿
				TIM5->CR1&=~(1<<0)		;    	//定时器5清零,重启
	 			TIM5->CNT=0;				//计数器清空
	 			TIM5->CCER|=1<<5; 			//CC2P=1 设置为下降沿捕获
				TIM5->CR1|=0x01;    			//使能定时器5
			}		    
		}			     	    					   
 	}
	TIM5->SR=0;//清除中断标志位   
}
int capture(void)
{ 
	//long long temp=0;
	long long temp2=0;//qinhao
	//TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1);//以1Mhz的频率计数
	TIM5_CH2_Cap_Init(0XFFFFFFFF,84-1);//以1Mhz的频率计数
	while(1)
	{
		if(TIM5CH2_CAPTURE_STA&0X80)//成功捕获到了一次高电平
		{
			temp2=TIM5CH2_CAPTURE_STA&0X3F; 
			temp2*=0XFFFFFFFF;		 		//溢出时间总和
			temp2+=TIM5CH2_CAPTURE_VAL;		//得到总的高电平时间
			printf(\"HIGH2:%lld us\r\n\",temp2);//打印总的高点平时间
			TIM5CH2_CAPTURE_STA=0;			//开启下一次捕获
		}
		
		//LED0_PWM_VAL=temp;
		
	}
}

回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117247
金钱
117247
注册时间
2010-12-1
在线时间
900 小时
发表于 2015-6-12 22:36:10 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手上路

Rank: 1

积分
19
金钱
19
注册时间
2016-12-4
在线时间
2 小时
发表于 2017-11-14 19:28:13 | 显示全部楼层
同求,我也是不懂为什么自己改了通道为什么不能工作
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-22 03:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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