OpenEdv-开源电子网

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

STM32频率计,进入不了外部中断(呼唤前辈们)

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-6-21
在线时间
0 小时
发表于 2013-6-21 21:46:50 | 显示全部楼层 |阅读模式
       新人报到!
       刚刚接触STM32,最近在做一个测量PWM方波的频率计(测量范围:1HZ~10MHZ,精度要求在0.1%),为了达到精度要求,在低频段(1HZ~1000HZ)用了输入捕获,测量在两个上升沿之间的时间;在高频段(1000HZ~10MHZ)用外部中断计数(方波上升沿触发外部中断)。要求测量结果在TFT-LCD上显示5位有效数字,低频部分以HZ为单位,高频部分以KHZ为单位。实现思想是:同时进行外部中断测量和输入捕获过程,定时器定时1s,在1s内测量外部中断的次数,如果外部中断的次数>1000,则显示外部中断的测量结果。如果外部中断的次数<1000,则用输入捕获测量的结果显示。下面是我的程序:现在遇到了一个问题,外部中断和输入捕获的中断均进不去,只有定时器溢出的中断能进去。 外部中断和输入捕获的中断处理程序中的printf都没有输出,请各位帮忙看看问题出在哪?谢谢各位!
      主程序:  
      int  main(void) 
  //u16 led0pwmval=0;
//u8 dir=1;
Stm32_Clock_Init(9); //系统时钟设置 
  delay_init(72);//延时函数初始化
  uart_init(72,9600);
  LCD_Init();
    POINT_COLOR=RED;//设置字体为红色 
LCD_ShowString(60,50,"FRE-COUNTER");
LCD_ShowString(20,130,"FRE:");
LCD_ShowString(60,90,"ATOM@ALIENTEK");
PWM_Init(9,71); //不分频。PWM频率=72000Khz/(10*72)=0.1Mhz
Capture_Init(60000,2399);//分频,30Khz的计数频率,捕获频率=72000KHZ/(60000*2400)=0.5HZ
EXTIX_Init(); //外部中断初始化
Timerx_Init(10000,7199);//10Khz的计数频率,计数到10000为1s


//高频(1000HZ~10Mhz),用外部中断计数,以KHZ为单位
if(flag==1)
{
   if((flow>=1000)&&(flow<9999))//1000HZ~9999HZ
{
//浮点数显示
temp=(float)flow*(1.0/1000);//以KHZ为单位的浮点数
temp0=temp;//temp0保存原浮点数的值
temp1=temp0;//temp1保存浮点数的整数部分
LCD_ShowNum(100,130,temp1,1,16);
temp-=(u16)temp;//减掉整数部分
LCD_ShowString(120,130,".");//显示小数点
LCD_ShowNum(140,130,temp*1000,4,16);//显示小数部分
LCD_ShowString(220,130,"KHZ");
}
else if((flow>=10000)&&(flow<100000))//10000HZ~99999HZ
{
//浮点数显示
。。。。。
}
else if((flow>=100000)&&(flow<1000000))//100000HZ~999999HZ
{
//浮点数显示
。。。。。
}
else//1M~10M的频率
{
//浮点数显示
。。。。。
}
}
else//flag=0,低频用输入捕获,1HZ~1000HZ
{
  if((cnt>30)&&(cnt<=300))//100HZ~999HZ
{
//浮点数显示
。。。。。
}
else if((cnt>300)&&(cnt<=3000))//10HZ~99HZ
{
//浮点数显示
。。。。。
}
else//1HZ~9HZ
{
//浮点数显示
。。。。。
}
}

while(1) 
 
  delay_ms(100);
  }  
}


外部中断子程序:
void EXTI0_IRQHandler(void)
{
COUNT++;
LED1=0;  
EXTI->R=1<<0;  //清除LINE0上的中断标志位
printf("COUNT = %d\r\n",COUNT);  
}

//外部中断初始化程序
//初始化PA0为中断输入.
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2;     //使能PORTA时钟
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD   

GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入  
GPIOA->CRL|=0X00000008;   
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发

MY_NVIC_Init(1,1,EXTI0_IRQChannel,2);    //抢占2,子优先级2,组2   
}
输入捕获子程序:
//定时器2通道1输入捕获配置
//arr:自动重装值
//psc:时钟预分频数

void Capture_Init(u16 arr,u16 psc) 
//此部分需手动修改 IO口设置   
RCC->APB2ENR|=1<<0;    //辅助功能IO时钟开启   
RCC->APB1ENR|=1<<0;    //TIM2 时钟使能  
RCC->APB2ENR|=1<<2;    //使能PORTA时钟  
    
TIM2->ARR=arr;  //设定计数器自动重装值,刚好1ms     
TIM2->SC=psc;  //预分频器 

GPIOA->CRL&=0XFFFFFFF0;//PA0 输出   
GPIOA->CRL|=0X00000004;//复用功能输出        
GPIOA->ODR|=1<<0;//PA0 上拉 
   
TIM2->SMCR|=0x00D4;  
TIM2->CCMR1|=1<<0;//CC1S=01 选择输入端   
TIM2->CCMR1|=3<<4; //IC1F=0011配置输入滤波器 
TIM2->CCER|=0<<1; //CC1P=0 选择有交转换边沿 
TIM2->CCMR1|=0<<2; //IC1PS=00 配置输入分频  
TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中 

TIM2->DIER|=1<<1;   //允许更新捕获中断
    
TIM2->CR1|=0x01;    //使能定时器2 
MY_NVIC_Init(1,2,TIM2_IRQChannel,2);//抢占1,子优先级3,组2   


//定时器2中断服务程序  
void TIM2_IRQHandler(void) 
{            
cnt = TIM2->CCR1;//读取CCR1也可以清CC1IF标志位//clk为在两个上升沿之间的计数器计数个数
cnt0=(float)cnt*(1.0/1);//将clk个数转化为浮点数
cntf=30000.0/cnt0;//求出低频频率,浮点数
printf("CNT = %d\r\n",cnt);                 
TIM2->SR&=~(1<<1);//清除中断标志位     



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

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-6-21
在线时间
0 小时
 楼主| 发表于 2013-6-22 11:47:42 | 显示全部楼层
唔,没有人遇到过类似的问题吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-22 18:37:39 | 显示全部楼层
单纯计算频率,最好的办法就是外部计数模式.
理由:很少的中断,换来很高的准确度.
普通的输入捕获,还是外部中断方式,都需要每个方波中断一次,慢死了...
二用外部计数模式,在计数器溢出之前,都可以不需要中断.可以有效提高准确度.也给CPU腾出了更多时间去处理其他事情.一举多得.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-6-21
在线时间
0 小时
 楼主| 发表于 2013-6-22 19:01:36 | 显示全部楼层
原子老师,我之前使用输入捕获做的,但误差比较大。现在是高频用的外部中断计数,每来一个脉冲计数一次,定时1s,但现在是外部中断完全进不去,不知道是什么原因。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-6-21
在线时间
0 小时
 楼主| 发表于 2013-6-22 19:03:40 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子老师,我理解错了。您是说外部计数器模式,我以为您说的是外部中断模式。外部计数器的模式该怎么配置呢?您的参考书上可以有参考的例程吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-22 19:03:55 | 显示全部楼层
那你会不会配置外部中断先,这个别说高频了,你外部中断配置好了,就算一个波,也该进入的啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-22 19:04:05 | 显示全部楼层
所以,先检查你的配置吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-6-29
在线时间
0 小时
发表于 2014-7-21 09:42:00 | 显示全部楼层
回复【2楼】chunlibao:
---------------------------------
不知道楼主解决没有?我也遇到了同样的问题,利用霍尔元件测转速,下降沿触发,中断根本进不去啊,能不能分享下?
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-12-7
在线时间
0 小时
发表于 2014-12-10 18:14:21 | 显示全部楼层
楼主成功了没,我遇到同样的问题需求,测10Mhz
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-2-19
在线时间
11 小时
发表于 2016-4-10 01:21:45 | 显示全部楼层
我也遇到同样问题,上升沿触发测波数,中断进不去
回复 支持 反对

使用道具 举报

0

主题

63

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2016-4-10 09:15:43 | 显示全部楼层
关注一下
回复 支持 反对

使用道具 举报

10

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2017-7-17
在线时间
15 小时
发表于 2018-9-27 16:27:43 | 显示全部楼层
你可以去掉TFTLCD试试,我的是中断计数,加上TFTLCD就不行,去掉就可以进入中断,但是一直不知道为什么
回复 支持 反对

使用道具 举报

10

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2017-7-17
在线时间
15 小时
发表于 2018-9-27 16:29:52 | 显示全部楼层
正点原子 发表于 2013-6-22 18:37
单纯计算频率,最好的办法就是外部计数模式.
理由:很少的中断,换来很高的准确度.
普通的输入捕获,还是外部中 ...

我的是中断计数,加上TFTLCD就进不了外部中断,去掉就能正常进入,程序是咱们例程上TFTLCD与EXTI结合的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 06:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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