OpenEdv-开源电子网

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

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

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-6-12
在线时间
0 小时
发表于 2015-6-12 16:44:22 | 显示全部楼层 |阅读模式
5金钱
求一段F407多通道输入捕获的代码(寄存器版),已经卡在此地好久了,没有个明白人给指点一下,自己编的代码不报错,就是不工作,不胜感激涕零呀
[mw_shl_code=c,true]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->SC=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; } }[/mw_shl_code]

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 06:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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