OpenEdv-开源电子网

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

定时器外部计数的问题

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-6-6
在线时间
0 小时
发表于 2015-6-15 16:26:52 | 显示全部楼层 |阅读模式
5金钱
问题已解决,就是代码中标红的那部分。。。。。。
+++++++++++++++++++++++可爱的分割线+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
打算用外部计数功能做一个频率计,具体思路是:将TIM5配置为外部计数模式,测量输入的脉冲数,计满溢出后产生中断表示溢出次数的变量overflow ++。将TIM3用作定时中断,1S中断一次,计算这段时间内外部脉冲总量,算出频率。
但是现在的问题是,overflow 的值并不会发生变化,导致TIM5只能计数65535个外部脉冲。
具体程序如下,想问一下问什么overflow的值不会发生变化。

//全局变量
u32 count ; //记录溢出次数
u32 overflow;    //记录总脉冲次数
int main(void) 
{
    //无关内容已省略
    TIM5_Excnt_Init(0XFFFF,0); //外部计数,最大值0xffff 
    TIM3_Int_Init(10000,7199);//10Khz的计数频率,计数到10000为1s
    while(1) 
{   
    delay_ms(10);
    freq = count;
    printf("freq: %8.2lf\r\n",freq); 




//定时器配置,以及中断函数
extern u32 overflow;
extern u32 count;
void TIM5_IRQHandler(void)
{          
    if(TIM5->SR&0X0001)//溢出中断
{
    overflow = overflow +1;
}
    TIM5->SR&=~(1<<0);//清除中断标志位    
}


void TIM5_Excnt_Init(u16 arr,u16 psc) 
{  

  RCC->APB1ENR|=1<<3;   //TIM5 时钟使能  
  RCC->APB2ENR|=1<<2;     //使能PORTA时钟   
  
  GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置   
  GPIOA->CRL|=0X00000008; //PA0 输入    
  GPIOA->ODR|=0<<0; //PA0 下拉 
   
  TIM5->ARR=arr;   //设定计数器自动重装值    
  TIM5->SC=psc;   //预分频器  

  TIM5->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上 
  TIM5->CCMR1|=0<<4; //IC1F=0000 配置输入滤波器 不滤波 

  TIM5->CCER|=0<<1; //CC1P=0 上升沿计数 
  TIM5->SMCR|=5<<4;   //触发选择:滤波后的定时器输入1(TI1FP1) 
  TIM5->SMCR|=7<<0;   //外部时钟模式1 
  TIM3->DIER|=1<<0;   //允许更新中断   
  TIM5->CR1|=1<<0;       //启动计数器,CEN=1 
  MY_NVIC_Init(2,2,TIM5_IRQn,2);//抢占2,子优先级3,组2



void TIM3_IRQHandler(void)
{          
  if(TIM3->SR&0X0001)//溢出中断
{
  count = overflow*65536 + TIM5->CNT;
  overflow = 0;
  TIM5->CNT = 0;
  TIM5_Excnt_Init(0XFFFF,0);
    }   
TIM3->SR&=~(1<<0);//清除中断标志位    
}

void TIM3_Int_Init(u16 arr,u16 psc)
{
  RCC->APB1ENR|=1<<1; //TIM3时钟使能    
  TIM3->ARR=arr;   //设定计数器自动重装值 
  TIM3->SC=psc;   //预分频器设置
  TIM3->DIER|=1<<0;   //允许更新中断
  TIM3->CR1|=0x01;    //使能定时器3
  MY_NVIC_Init(3,3,TIM3_IRQn,2);//抢占1,子优先级3,组2  
}

最佳答案

查看完整内容[请看2#楼]

回复【3楼】reborn09: --------------------------------- 看上去配置没问题哦 中断里面,TIM5_Excnt_Init(0XFFFF,0);改为: TIM5->CNT=0试试吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-15 16:26:53 | 显示全部楼层
回复【3楼】reborn09:
---------------------------------
看上去配置没问题哦
中断里面,TIM5_Excnt_Init(0XFFFF,0);改为:
TIM5->CNT=0试试吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-5-14
在线时间
6 小时
发表于 2015-6-16 09:04:40 | 显示全部楼层
我感觉一个计数器溢出了去触发另一个计数器接着计数,不知道你的输入频率最高到多少,如果高的,在处理中断的时候,会不会产生漏计的情况?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-6-6
在线时间
0 小时
 楼主| 发表于 2015-6-16 16:36:29 | 显示全部楼层
回复【2楼】皮皮logo:
---------------------------------
溢出后我没有触发另外一个计数器。
我是在溢出后,在中断处理函数中记录一下溢出次数。然后TIM5从0开始接着记录外部脉冲次数。
但是现在的问题是,TIM5无法进入中断函数,overflow的值并没改变,这是为什么?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-6-6
在线时间
0 小时
 楼主| 发表于 2015-6-17 11:16:45 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
请问原子哥,定时器设为外部计数功能后,计数溢出后应该也会执行中断函数的吧。
难道中断函数的名称不是void TIM5_IRQHandler(void),是采用其他的函数名?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-17 23:57:52 | 显示全部楼层
回复【5楼】reborn09:
---------------------------------
设置了的话,可以执行的。
定时器5的中断服务函数是这个没错
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-5-14
在线时间
6 小时
发表于 2015-6-19 09:49:17 | 显示全部楼层
楼主调好了吗?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-6-6
在线时间
0 小时
 楼主| 发表于 2015-6-20 10:38:30 | 显示全部楼层
回复【8楼】皮皮logo:
---------------------------------
没有, 这几天实验室 不开门,,没有信号发生器,调不了
回复

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-12-25
在线时间
65 小时
发表于 2015-12-26 21:30:00 | 显示全部楼层
正点原子 发表于 2015-6-17 23:59
回复【5楼】reborn09:
---------------------------------
是的

原子哥,我按照这样的进行采集,发现当频率大于50KHZ的时候,误差就比较大了,是否可以采取当频率大于50KHZ的时候,采用等频率法进行测量?
回复

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-12-25
在线时间
65 小时
发表于 2015-12-26 21:30:18 | 显示全部楼层
正点原子 发表于 2015-6-17 23:59
回复【5楼】reborn09:
---------------------------------
是的

原子哥,我按照这样的进行采集,发现当频率大于50 K HZ的时候,误差就比较大了,是否可以采取当频率大于50 K HZ的时候,采用等频率法进行测量?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 20:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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