你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

触发外部中断后无法跳出到主函数

[复制链接]
夹鳄鱼 提问时间:2017-3-10 10:04 /
本帖最后由 夹鳄鱼 于 2017-3-13 23:21 编辑

    求助,把AVR的程序移植使用STM8时发现,触发外部中断后,程序跳到中断函数并运行,但运行完中断函数之后并没有回到主函数里面执行while 里面的程序。再次触发外部中断时,又会继续运行中断函数,但执行完中断函数后又不跳转到主函数。
    尝试了STM8S105k4和STM8S207C8都一样的结果,求指点一下。
   
下面是STM8S207C8的程序,把多余的删了,PG0是LED灯,PC7是触发外部中断的引脚。配置PC7为下降沿触发。开机后led开始慢慢闪,触发中断后,转换一下状态,但之后灯就停住不动了,不会慢闪。再次触发中断,又会翻转,但闪完后又不动了。

应该是跟中断里面的延时有关,把延时函数注释掉后,程序正常。但加入延时后,程序就不正常了。不太懂,特地来请教一下。
int main(void)
{
  master_clk();
  time4_delay_init();


  asm("sim");
  PG_DDR=0XFF;
  PG_CR1=0XFF;
  PG_CR2=0XFF;
  PG_ODR_ODR0=1;//

  PC_DDR_DDR7=0;
  PC_CR1_C17=1;
  PC_CR2_C27=1;
  EXTI_CR1 =2<<4;

  asm("rim");

  while(1)
  {
    delay_ms(100);
    PG_ODR_ODR0=!PG_ODR_ODR0;
  }  
}

#pragma vector=0x07
__interrupt void a()
{
    PG_ODR_ODR0=!PG_ODR_ODR0;
    delay_ms(10);
}

----------------------------------------------------------------------------------------
void time4_delay_init()
{
  TIM4_CR1=0x00;
  TIM4_IER=0x00;
  TIM4_EGR=0x01;
  //delay_ms
  TIM4_PSCR=0x07;//128分频,16M/128=0.125M->8us
  TIM4_ARR=0x7D;//8us*125
}

void delay_ms(u16 t)
{
  TIM4_CR1 |=0x01;
  while(t--)
  {
    while (!(TIM4_SR & 0x01));
    TIM4_SR &=0xfe;
  }
  TIM4_CR1 &=0xfe;
}



收藏 1 评论9 发布时间:2017-3-10 10:04

举报

9个回答
夹鳄鱼 回答时间:2017-3-14 20:20:51
自己顶一下········
天地摩登 回答时间:2017-3-14 21:43:20
你中断函数都还没有执行完,又重新来中断了啊
夹鳄鱼 回答时间:2017-3-15 15:25:29
天地摩登恒 发表于 2017-3-14 21:43
你中断函数都还没有执行完,又重新来中断了啊

你好,中断函数就只是很简单的语句,本来应该很快就执行完的,就十几个毫秒。
但是程序却一直没有执行完毕,不太懂······

你说的重新来中断,我是等了很久,都等不到才去重新触发中断。
zcl201207 回答时间:2017-3-15 23:43:51
中断完了没清标志位吧
夹鳄鱼 回答时间:2017-3-16 10:29:07
zcl201207 发表于 2017-3-15 23:43
中断完了没清标志位吧

这··········
一开始我也跟你这样想,结果手册上找了半天没找到标志位,网上一搜,STM8S系列根本没有外部中断的标志位,都是自动清的。

搞得现在超郁闷。
wenyangzeng 回答时间:2017-3-20 10:46:05
不该在中断里调用延时函数的。
じ☆ve沫上,蘤開。灬 回答时间:2017-7-17 09:06:20
请问楼主问题解决没有?  遇到类似问题
夹鳄鱼 回答时间:2017-7-17 22:43:42
じ☆ve沫上,蘤開。灬 发表于 2017-7-17 09:06
请问楼主问题解决没有?  遇到类似问题

没解决,当时直接换成按键扫描的方式。如果你解决了的话,烦请分享一下经验。
sssdd 回答时间:2017-7-24 09:57:05
可能啊,只是可能,10ms延时的时候别的啥中断被触发了。比如上下沿,或者是单纯低电平?或者别的定时器中断? 建议开调试模式,看停在哪个中断里。
也可能D口别的什么口不小心开了中断。然后10ms后跳出来后又进去了。你这库写法真的太深奥。。完全看不懂。
话说,每个10ms内你根本不响应别的中断,不合适吧?

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版