OpenEdv-开源电子网

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

关于中断的问题

[复制链接]

18

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-6-26
在线时间
0 小时
发表于 2012-9-22 23:15:13 | 显示全部楼层 |阅读模式
原子及各位大神,我这中断弄了几天了,是外部中断,中断频率为564K,中断函数如下:
void EXTI0_IRQHandler(void)

 if(EXTI_GetITStatus(EXTI_Line0) != RESET)  // 检查指定的EXTI线路触发请求发生与否 
  {
//   DATA_564 = (bool)(BUFF[bytenum++]&0x01);
  // if((bytenum >= Snum1)||(bytenum >= 1023))
  //      bytenum = 0; 
   LED4= ~LED4;
  }
 EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位  
}

这样运行是正常的,一旦把注释掉的部分加上,中断就不能正常进行,老是丢中断,是不是中断的频率过快了呢?
如果我只在这个中断函数中处理一个标志,通过这个标志在主函数中循环查寻这个标志处理相关的任务,但也不行,请问
通过什么方法处理这个564K的中断好呢?


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-22 23:19:17 | 显示全部楼层
回复【楼主位】jianwenchang:
---------------------------------
明显中断太频繁了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-6-26
在线时间
0 小时
 楼主| 发表于 2012-9-23 00:50:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子大侠,我在主函数中还有其他函数在循环,要是中断太频繁的话主函数中的循环不应该会有时间去执行——
这是为什么呢?
理论上72M的时钟中断这个564K的频率不算快啊
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2012-9-23
在线时间
0 小时
发表于 2012-9-23 04:09:52 | 显示全部楼层
回复【3楼】jianwenchang:
---------------------------------
这样试试:
void EXTI0_IRQHandler(void)
 { 
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)  // 检查指定的EXTI线路触发请求发生与否 
   {
    EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位   
    DATA_564 = (bool)(BUFF[bytenum++]&0x01);
    if((bytenum >= Snum1)||(bytenum >= 1023)) 
         bytenum = 0; 
//    LED4= ~LED4;
   }
 }
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-23 09:38:36 | 显示全部楼层
回复【3楼】jianwenchang:
---------------------------------
可以执行,就是丢中断咯。。。
564K的中断还不算频繁...汗....
1.77us就要中断一次,中断的时候又要什么现场保护,压栈出栈,还要处理你的指令。稍微长点下一个中断就丢了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-6-26
在线时间
0 小时
 楼主| 发表于 2012-9-23 15:20:55 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
谢谢原子,还有点不明白,既然这中断都处理不过来,为什么主函数中的程序也会得到执行呢?
还有,我把中断什么都屏蔽了,只在主函数中作如下循环:
while(1)
{
      LED4 = ~LED4;
 }
这个频率居然只有3M多,就这一个任务,频率为什么只有这么低呢?
请原子及各们大侠解答一下,谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-23 17:27:22 | 显示全部楼层
回复【6楼】jianwenchang:
---------------------------------
当然可以执行了。
中断完了还是会退出来了
比如你在中断里面执行代码,此时又来了一个中断,你就检测不到了...等中断退出的时候,继续运行主程序,产生一次丢失
这样的情况多了,就丢失很多次
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-6-26
在线时间
0 小时
 楼主| 发表于 2012-9-24 11:00:05 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
谢谢,我把所有的中断和其他任务都关了,只在主函数里执行
while(1) 

      LED4 = ~LED4; 
 }
为什么这个频率只有3M多呢,系统时钟是72M的,初始化这个IO的时候是输出频率最大为50M的,
是不是PLL没工作呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-24 23:15:56 | 显示全部楼层
回复【8楼】jianwenchang:
---------------------------------
不是,这个STM32的IO速度要达到50M,那是很难了
你这个代码也没有优化,速度更是上不去。
用BSRR可以快一点,但是也快不到哪里去。

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 22:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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