OpenEdv-开源电子网

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

【STM32】关于ETR脉冲计数的问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-11-22
在线时间
0 小时
发表于 2014-11-22 22:00:35 | 显示全部楼层 |阅读模式
5金钱

目前以下代码只能使用TIM3、4两个定时器,其他的一个都用不了,求大家帮帮忙,让1、2、5、8定时器也能工作~~

[mw_shl_code=c,true] /*----------------------------------------------------------------- ** 函数名:void ETRInputConfig(TIM_TypeDef *timx) **传入参数: **返回参数: **函数功能:计数器能够在外部触发ETR的每一个上升沿或下降沿计数 ** **----------------------------------------------------------------*/ void ETRInputConfig(TIM_TypeDef *timx) { if(timx==TIM1) RCC->APB2ENR|=1<<11; //最大 72M else if(timx==TIM2) RCC->APB1ENR|=1<<0;//最大 36M * 2 else if(timx==TIM3) RCC->APB1ENR|=1<<1; else if(timx==TIM4) RCC->APB1ENR|=1<<2; else if(timx==TIM5) RCC->APB1ENR|=1<<3; //else if(timx==TIM6) RCC->APB1ENR|=1<<4; //这几个定时器不能 使用ETR //else if(timx==TIM7) RCC->APB1ENR|=1<<5; else if(timx==TIM8) RCC->APB2ENR|=1<<13; //设定 CR1 timx->CR1&=~(u16)(0x3<<8); //清空分频因子 timx->CR1|=(u16)(0x0<<8); //设定分频因子为0 //timx->CR1|=(u16)(0x1<<7); //自动重装请允许,TIMx_ARR寄存器被装入缓冲器 timx->CR1&=~(u16)(0x3<<5); //边沿对齐方式 timx->CR1&=~(u16)(0x1<<4); //向上计数 //设定 SMCR 从模式寄存器 timx->SMCR&=~(u16)(0x1<<15);//ETR 输入不反相,高电平/上升沿有效 timx->SMCR|= (u16)(0x1<<14);//使能外部时钟2 timx->SMCR&=~(u16)(0x3<<12);//ETPS,不分频 timx->SMCR&=~(u16)(0xf<<8); //ETF,采样不分频 //预分频值,不分频 timx->SC=0; //重装值,0xffff timx->ARR=~(u16)(0x0); //设定 DIER -- DMA/中断 制寄存器,关更新中断 timx->DIER&=~(u16)(0x1<<0); //计数前先清空一下计数器 timx->CNT=0; timx->CR1|=(u16)(0x1<<0); //开计数器 } /*----------------------------------------------------------------- ** 函数名:u16 GetETRInput(TIM_TypeDef *timx) **传入参数:定时器号 TIM1-TIM8 **返回参数:定时器的计数值 **函数功能:获取 ETR输入捕获到的值 ** **----------------------------------------------------------------*/ u16 GetETRInput(TIM_TypeDef *timx) { return timx->CNT; } [/mw_shl_code]



调用是这样的

[mw_shl_code=c,true]void main() { PortConfig(GPIOD,InputMode,Input_UD,0x1<<2);//PD2 输入 ETRInputConfig(TIM3);//TIM1的 ETR PortConfig(GPIOE,InputMode,Input_UD,0x1<<0);//PE0 输入 ETRInputConfig(TIM4);//TIM1的 ETR printf("--------------ETR TEST-----------\n"); while(1) { printf("tim3=%d\t",GetETRInput(TIM3)); printf("tim4=%d\n",GetETRInput(TIM4)); TimerDelayMs(TIM1,500); } }[/mw_shl_code]
结果是这样的:

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

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2014-11-22 23:55:04 | 显示全部楼层
貌似定时器2 和5 没有ETR脚奥    高级定时器1 和8  可能需要额外的配置    要看看参考手册
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-23 00:08:38 | 显示全部楼层
帮顶.....
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 19:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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