OpenEdv-开源电子网

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

定时计数器的初始化问题

[复制链接]

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2012-2-16
在线时间
0 小时
发表于 2012-3-16 14:06:00 | 显示全部楼层 |阅读模式

 我打算用TIM2_CH3 (PA2)计外部脉冲的个数,
初始化函数如下:
void TIM2_ch3_Init(u16 arr2,u16 psc2)
{
 RCC->APB1ENR|=1<<0;     //使能定时器2的时钟
 TIM2->ARR=arr2;
 TIM2->SC=psc2;
 TIM2->CR1&=~(1<<4);
 TIM2->CR1&=~(1<<3);     //计数器向上计数
 TIM2->CR1|=(1<<0);     //使能计数器
 TIM2->CCMR1|=0X0300;      
}
//设置PA3为复用功能,输入模式  计数端口 TIM2

void GPIOPA2_Init(void)
{
 RCC->APB2ENR|=1<<3;    //使能PB的IO时钟
 GPIOA->CRL&=0XFFFFF0FF;
 GPIOA->CRL|=0X00000B00;
}

最后让counter=TIM2->CNT;

没有成功   不是知道是不是初始化设置的问题,还有那些寄存器没有设置到吗,  现在一头雾水啊  
请大侠们 指点一二 ,在线等  谢谢 

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

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2012-2-16
在线时间
0 小时
 楼主| 发表于 2012-3-16 14:15:47 | 显示全部楼层
GPIOA->CRL|=0X00000800 ;这里写错了额      
自学成才
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-3-16 17:16:03 | 显示全部楼层
 TIM2->CCMR1|=0X0300;   这一句是把CH2映射在了TRC上,你应该是映射在TI1或者TI2上

还有CCER上应该设置好捕获的极性,使能捕获,否则初始化为0已经禁止了捕获这一个

楼主来参考一下我的即可以了,自己输出一路PWM然后利用捕获相邻脉冲间的时间找打一点思路,剩下的如果自己慢慢研究一下,资料多看一下,不懂了再提问 651633945

/*********************************
***函数:TIMx_ICx_Init 功能:捕获引脚上的脉冲
***作者:马宽 2012/3/10
*********************************/
void TIMx_ICx_Init(u16 arr,u16 psc)
{
RCC->APB2ENR |= 1<<2;   //打开GPIOA口时钟
GPIOA->CRL &= 0XFFFFFFF0;   
GPIOA->CRL |= 0X00000004;   //GPIOA^0设置为浮空输入
GPIOA->ODR |= 1<<0;   //输出高电平

RCC->APB2ENR |= 1<<0;   //打开复用时钟
RCC->APB1ENR |= 1<<0;   //打开TIM2时钟

TIM2->ARR = arr;
TIM2->SC = psc;

// TIM2->SMCR |= 0X00D4;
TIM2->SMCR |= 1<<7; //打开主从模式
TIM2->SMCR |= 5<<4; //滤波后的定时器输入 TI1FP1
TIM2->SMCR |= 4<<0; //使用从模式的复位模式

TIM2->CCMR1 |= 1<<0; //CC1映射在TI1上
TIM2->CCMR1 |= 0<<2; //无分频
TIM2->CCMR1 |= 3<<4; //无数字滤波

TIM2->CCER &= ~(1<<1); //CC1捕获极性为上跳沿
TIM2->CCER |= 1<<0; //允许CC1捕获值放入CCR1中

TIM2->DIER|= 1<<1; //允许CC1捕获产生中断
TIM2->CR1 |= 1<<0; //打开定时器2
MY_NVIC_Init(1,0,TIM2_IRQChannel,2);//设置中断
}


//定时器2中断服务程序  
void TIM2_IRQHandler(void)
{                  
static u16 i;
static u16 t;
i++;
t += (TIM2->CCR1)/100;   //十次采样取平均值
if(i==100)
{
//printf("%d\t  %d \n",t,1000000/t);
LCD_ShowNum(150,130,t,5,16);  //显示一个数字
LED0 = !LED0;
i=0;t=0;
}
TIM2->SR &= ~(1<<1);//清除CC1中断标志位      
}
努力,前进。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-16 21:59:22 | 显示全部楼层
ARM版主,suqingxiao 发了很多这方面例子,楼主搜索下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 04:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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