OpenEdv-开源电子网

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

请教原子老师:使用定时器计数模式计外部脉冲,只能进入溢出中断,进入不了定时器中断

[复制链接]

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-5-24
在线时间
0 小时
发表于 2013-6-23 13:18:15 | 显示全部楼层 |阅读模式
原子老师:
      经您的指导,我在用定时器计数模式做一个频率计。设置一个定时器中断,用定时器定时1s钟。同时设置定时器计数模式的溢出中断,每次溢出时统计溢出次数,最后得到总的外部脉冲计数。但现在的问题是:单独使用定时器中断可以定时1s,单独使用定时器计数模式也可以进入溢出中断,但如果两者一起,就只能进入溢出中断,进入不了定时器中断。中断的优先级也没有问题,请原子老师指教。
      呃,马上就要考试周了,还没怎么复习。今天这个大实验再做不出就只能放弃了。。。呜呜。。。
      下面是我的程序:
主程序:
u16    COUNT=0;
u32    FRE=0;

int main(void) 
{
//u32 oldcnt=0;  
  Stm32_Clock_Init(9); //系统时钟设置 
uart_init(72,9600); //串口初始化为9600 
delay_init(72);   //延时初始化
Timerx_Init(10000,7199);//10Khz的计数频率,计数到10000为1s
TIM2_Excnt_Init(0XFFFF,0); //外部计数,最大值0xffff   
   
    while(1) 
  delay_ms(10);  
 

定时器计数外部脉冲配置:
extern u16    COUNT;
extern u32    FRE;
//TIM2,外部计数模式 
void TIM2_Excnt_Init(u16 arr,u16 psc) 
{  

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

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

TIM2->CCER|=0<<1; //CC1P=0 上升沿计数 
  TIM2->SMCR|=5<<4;   //触发选择:滤波后的定时器输入1(TI1FP1) 
  TIM2->SMCR|=7<<0;   //外部时钟模式1 
TIM2->DIER|=1<<0;   //允许更新中断    
     TIM2->DIER|=1<<6;   //允许触发中断
  TIM2->CR1|=1<<0;       //启动计数器,CEN=1 

MY_NVIC_Init(2,1,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
}

////计数溢出中断服务程序  
void TIM2_IRQHandler(void)
{                  
 if(TIM2->SR&0X0001)//溢出中断 UIF,位0:更新中断标志位置位
 {
  COUNT++;
  printf("COUNT=%d\r\n",COUNT);                              
 }      
 TIM2->SR&=~(1<<0);//清除中断标志位      
}


定时器定时1s配置:
void Timerx_Init(u16 arr,u16 psc)
{
  RCC->APB1ENR|=1<<1;//TIM3时钟使能    
  TIM3->ARR=arr;  //设定计数器自动重装值   
  TIM3->SC=psc;  //预分频器7200,得到10Khz的计数时钟    计数器时钟频率=fosc/(预分频+1)
 //这两个东东要同时设置才可以使用中断
 TIM3->DIER|=1<<0;   //允许更新中断    
 TIM3->DIER|=1<<6;   //允许触发中断
               
 TIM3->CR1|=0x01;    //使能定时器3
 MY_NVIC_Init(2,0,TIM3_IRQChannel,2);//抢占1,子优先级1,组2 
}

////定时器3中断服务程序  
void TIM3_IRQHandler(void)
{                  
 if(TIM3->SR&0X0001)//溢出中断 UIF,位0:更新中断标志位置位
 {
  FRE = COUNT*65535;
  FRE = FRE + TIM2->CNT;  
  COUNT = 0; 
  //printf("TIM2->CNT=%d\r\n",TIM2->CNT);
  printf("FRE=%d\r\n",FRE);                            
 }      
 TIM3->SR&=~(1<<0);//清除中断标志位      
}
    
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-23 16:25:25 | 显示全部楼层
看你代码确实是没问题哦.
发完整的工程上来,我测试下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-5-24
在线时间
0 小时
 楼主| 发表于 2013-6-23 18:46:04 | 显示全部楼层
原子老师,附件中是我的完整的工程,请您看一下。麻烦您了。

PWM输出~定时器计数.zip

695.02 KB, 下载次数: 1445

回复 支持 反对

使用道具 举报

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-5-24
在线时间
0 小时
 楼主| 发表于 2013-6-23 18:47:15 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子老师,工程已经上传了,麻烦您看一下,谢谢您
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-23 20:35:30 | 显示全部楼层
回复【4楼】 zhangsaisai0814 :
---------------------------------
实测很正常
可以跑到tim3的中断里面



我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-5-24
在线时间
0 小时
 楼主| 发表于 2013-6-23 21:54:28 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
啊?不会吧?我刚刚又测了一下,串口只能打印出“COUNT=...”,不能打印定时器中断里面的“FRE=...”。这会是什么原因呢???。。。不科学。。。。
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-5-31
在线时间
0 小时
发表于 2014-5-31 13:47:42 | 显示全部楼层
[mw_shl_code=c,true]/*main.c*/ #include"sys.h" #include"delay.h" #include"usart.h" #include"gpio.h" #include"timer.h" unsigned long int num=0,count=0,i=1; int main() { Stm32_Clock_Init(9); delay_init(72); uart_init(72,9600); GPIO_Init(); TIM2_Int_Init(0xffff,0); TIM3_Int_Init(9,7199); //1ms while(1) { if(num==10) { count=count+TIM2->CNT; TIM2->CNT=0; if(TIM2->SR&0x01) { count=count+65536; } printf("%ld\t\t",count); count=0; num=0; } } } void TIM2_IRQHandler() //计数器 { TIM2->SR&=~(1<<0); } void TIM3_IRQHandler() //定时器 { if(TIM3->SR&0x01) { num++; } TIM3->SR&=~(1<<0); } /*gpio.c*/ #include"gpio.h" void GPIO_Init() { RCC->APB2ENR|=1<<2; GPIOA->CRL&=0xfffffff0; GPIOA->CRL|=0x00000004; GPIOA->CRH&=0xfff0ffff; GPIOA->CRH|=0x00040000; } /*gpio.h*/ #ifndef GPIO_H #define GPIO_H #include"sys.h" #define PA0 PAout(0) #define PA12 PAout(12) void GPIO_Init(void); #endif /*timer.c*/ #include"sys.h" #include"delay.h" #include"usart.h" #include"timer.h" void TIM3_Int_Init(u16 arr,u16 psc) //作为计时器 { RCC->APB1ENR|=1<<1; TIM3->ARR=arr; //装初值 TIM3->SC=psc; TIM3->DIER|=1<<0; TIM3->CR1|=0x01; MY_NVIC_Init(1,3,TIM3_IRQn,2); } void TIM2_Int_Init(u16 arr,u16 psc) //作为计数器 { RCC->APB1ENR|=1<<0; TIM2->ARR=arr; //装初值 TIM2->SC=psc; TIM2->DIER|=1<<0; TIM2->CR1|=0x01; MY_NVIC_Init(1,3,TIM2_IRQn,2); } /*timer.h*/ #ifndef TIMER_H #define TIMER_H #include"sys.h" void TIM3_Int_Init(u16 arr,u16 psc); void TIM2_Int_Init(u16 arr,u16 psc); #endif [/mw_shl_code]
原子哥,我想实现采集NE555的输出脉冲,测试了很多次都没用,请原子哥指点!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-31 22:50:04 | 显示全部楼层
 回复【7楼】 刘俊 :
---------------------------------
参考下这个:http://www.openedv.com/posts/list/33247.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-5-31
在线时间
0 小时
发表于 2014-6-1 11:05:06 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
大哥,发现手册太有用了,我自己看手册,把东西给配置出来了!
回复 支持 反对

使用道具 举报

8

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-2-27
在线时间
0 小时
发表于 2014-12-8 14:51:44 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
我大概知道这个问题出在哪里,仿真的时候是运行正常的。但是在线调试的时候,由于计数器的外部有脉冲输入,所以在还没有启动计数器的时候,一直在进入计数器2中断。下边我把在线调试的时候TIMER2的图发出来。
文可提笔控萝莉,武能床头定人妻,进可欺身压正太,退能提臀迎众基
回复 支持 反对

使用道具 举报

8

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-2-27
在线时间
0 小时
发表于 2014-12-8 14:53:26 | 显示全部楼层
这时候还没启动定时器2,就一直在进入中断,是因为外部有计数脉冲输入。真是伤脑筋诶、、、、不知道该怎么办。

文可提笔控萝莉,武能床头定人妻,进可欺身压正太,退能提臀迎众基
回复 支持 反对

使用道具 举报

0

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2014-1-11
在线时间
23 小时
发表于 2015-12-12 10:57:17 | 显示全部楼层
回复【11楼】liucongwoshi:
---------------------------------
我也遇到这个问题不知道怎么办好?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 05:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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