OpenEdv-开源电子网

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

求助:在对外部引脚进行捕获实验时

[复制链接]

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
发表于 2011-5-30 11:02:04 | 显示全部楼层 |阅读模式

我是想通过:TIM_CH4(PA3)引脚进行捕获输入来进行对外部脉冲计数,算出他一秒种的计数,即频率,
我的程序如下:
//通用定时器中断初始化
//这里始终选择为APB1的2倍,而APB1为36M,参考时钟树总图
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timer2_Init(u16 arr,u16 psc)

 RCC->APB2ENR|=1<<2;    //使能PORTA时钟
 GPIOA->CRL&=0XFFFF0FFF;
 GPIOA->CRL|=0X00004000;//PA3 浮空输入
//  GPIOA->CRL&=0XFFFFFFF0;
// GPIOA->CRL|=0X00000004;//PA0 浮空输入   
//    GPIOA->ODR|=1<<0;      //PA3 输出
 RCC->APB1ENR|=1<<0;//TIM2时钟使能   
  TIM2->ARR=arr;  //设定计数器自动重装值//刚好0.1ms   
 TIM2->SC=psc;  //预分频器7200,得到10Khz的计数时钟
 //这两个东东要同时设置才可以使用中断
 
 TIM2->CCER |= 1<<12; //TIM2_CH4捕获使能
 TIM2->CCMR2 |= 1<<8;   //IC4映射在TI4
 TIM2->EGR |= 1<<4;  //产生捕获/比较事情4

 TIM2->DIER|=1<<0;   //允许更新中断    
 TIM2->DIER|=1<<6;   //允许触发中断
 TIM2->DIER|=1<<4;   //允许捕获比较中断
  
// TIM2->SMCR&=0x00FF;  //选择外部时钟触发模式2
// TIM2->SMCR|=1<<14;
  
 TIM2->CNT=0;//计数初始值为0
             
 TIM2->CR1|=0x01;    //使能定时器2
   MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2 
          
}



//定时器2中断服务程序
void TIM2_IRQHandler(void)
{                 
 if(TIM2->SR&(1<<4))//溢出中断
 {
  COUNT++;
    TIM2->CCR4=0;
//  COUNT = TIM2->CCR4;
                              
 }      
 TIM2->SR&=~((1<<4)&(1<<0));//清除中断标志位     
}

定时器3作1秒定时,

//定时器3中断服务程序 
void TIM3_IRQHandler(void)
{                 
 if(TIM3->SR&(1<<0))//溢出中断 UIF,位0:更新中断标志位置位
 {
  COUNT2=COUNT;
  COUNT=0;   
//  BUZZER=!BUZZER;//蜂鸣器鸣响                             
 }      
 TIM3->SR&=~(1<<0);//清除中断标志位     
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timer3_Init(u16 arr,u16 psc)
{
 RCC->APB1ENR|=1<<1;//TIM3时钟使能   
  TIM3->ARR=arr;  //设定计数器自动重装值//刚好0.1ms   
 TIM3->SC=psc;  //预分频器7200,得到10Khz的计数时钟    计数器时钟频率=fosc/(预分频+1)
 //这两个东东要同时设置才可以使用中断
 TIM3->DIER|=1<<0;   //允许更新中断    
 TIM3->DIER|=1<<6;   //允许触发中断
              
 TIM3->CR1|=0x01;    //使能定时器3
   MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2         
}

主函数中
 while(1)
 {
  printf("%ld  ",COUNT2);
  delay_ms(1000); 
    
 }

现在遇到的问题是,捕获那边的数值不正确,不知道哪里设置不对,请大侠们帮帮忙,
蓝色字体是小弟自己看着寄存器设置的,不知道错在哪里?

常常被模仿,从未被超越
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-30 12:23:26 | 显示全部楼层
//定时器2中断服务程序
void TIM2_IRQHandler(void)
{                  
 if(TIM2->SR&(1<<4))//溢出中断
 {
  COUNT++;
    TIM2->CCR4=0;
//  COUNT = TIM2->CCR4; 
                              
 }       
 TIM2->SR&=~((1<<4)&(1<<0));//清除中断标志位      
}
 
if那里,应该不是溢出中断吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
 楼主| 发表于 2011-5-30 12:34:58 | 显示全部楼层
只是注释错了,并不影响的,
常常被模仿,从未被超越
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-30 12:56:20 | 显示全部楼层
现在能进中断么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
 楼主| 发表于 2011-5-30 13:46:55 | 显示全部楼层
进去了,跳不出来啊
常常被模仿,从未被超越
回复 支持 反对

使用道具 举报

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
 楼主| 发表于 2011-5-30 13:48:09 | 显示全部楼层
进了TIM2_CH4捕获中断后,出不来了啊,原来的TIM3定时中断也不会进去了,好像卡在TIM2_CH4中断里面了,
常常被模仿,从未被超越
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-30 14:43:33 | 显示全部楼层
TIM2->SR&=~((1<<4)&(1<<0));//清除中断标志位  
这句没用...
~((1<<4)&(1<<0))===0XFFFF FFFF;
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
 楼主| 发表于 2011-5-30 15:45:42 | 显示全部楼层
//定时器2中断服务程序
void TIM2_IRQHandler(void)
{              
if(TIM2->SR&(1<<4))//捕获中断
{
COUNT++;
//    TIM2->CCR4=0;
// COUNT = TIM2->CCR4; 
                   
}    
TIM2->SR&=~(1<<4);//清除中断标志位      
}
    
//通用定时器中断初始化
//这里始终选择为APB1的2倍,而APB1为36M,参考时钟树总图
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timer2_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<2;    //使能PORTA时钟
GPIOA->CRL&=0XFFFF0FFF; 
GPIOA->CRL|=0X00004000;//PA3 浮空输入 
//  GPIOA->CRL&=0XFFFFFFF0; 
// GPIOA->CRL|=0X00000004;//PA0 浮空输入    
//    GPIOA->ODR|=1<<0;      //PA3 输出
RCC->APB1ENR|=1<<0;//TIM2时钟使能    
  TIM2->ARR=arr;  //设定计数器自动重装值//刚好0.1ms    
TIM2->SC=psc;  //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断

TIM2->CCER |= 1<<12; //TIM2_CH4捕获使能
TIM2->CCMR2 |= 1<<8;   //IC4映射在TI4
TIM2->EGR |= 1<<4;  //产生捕获/比较事情4

TIM2->DIER|=1<<0;   //允许更新中断
// TIM2->DIER|=1<<6;   //允许触发中断
TIM2->DIER|=1<<4;   //允许捕获比较中断

// TIM2->SMCR&=0x00FF;  //选择外部时钟触发模式2
// TIM2->SMCR|=1<<14;

TIM2->CNT=0;//计数初始值为0
       
TIM2->CR1|=0x01;    //使能定时器2
   MY_NVIC_Init(0,3,TIM2_IRQChannel,2);//抢占0,子优先级3,组2
 
}


问题就在上面这个函数里面,进入中断后,一直进去,不知道哪里退不出,我在主函娄里串口发送的,不显示,

就在上面两个函数设置问题,
常常被模仿,从未被超越
回复 支持 反对

使用道具 举报

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
 楼主| 发表于 2011-5-30 15:46:18 | 显示全部楼层
跳不出来执行主函数了,好像一直进入,因为那个中断也太快了
常常被模仿,从未被超越
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-30 16:21:59 | 显示全部楼层
在后面补加: TIM2->SR&=~(1<<0);//清除中断标志位      
试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
 楼主| 发表于 2011-5-30 18:40:58 | 显示全部楼层
还是不行啊,初始化看着手册写的,也不知道正不正确啊,
常常被模仿,从未被超越
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-30 19:46:30 | 显示全部楼层
回复【11楼】lion204:
---------------------------------
那有可能你输入捕获没设置对了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
 楼主| 发表于 2011-5-30 21:22:17 | 显示全部楼层
哪位有例子吗?
常常被模仿,从未被超越
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-30 22:43:47 | 显示全部楼层
過陣子我弄個.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

41

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2011-5-3
在线时间
24 小时
 楼主| 发表于 2011-6-1 20:51:58 | 显示全部楼层
原子,尽量弄啊
常常被模仿,从未被超越
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 15:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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